From 8a7921d0820adac4b6f8e0b4cfd23c302593a211 Mon Sep 17 00:00:00 2001 From: rektdeckard Date: Sun, 20 Jun 2021 20:04:40 -0400 Subject: [PATCH] app: Add modals and begin implementing donations This patch adds a mechanism to open a modal, and roughs out a donation flow using the 'braintree' payments provider. --- package.json | 4 + src/components/App/App.css | 63 ++++++++++ src/components/App/App.tsx | 5 + src/components/Links/Links.tsx | 45 ++++--- src/components/Modal/DonationModal.tsx | 68 ++++++++++ src/components/Modal/DonationStepCC.tsx | 80 ++++++++++++ src/components/Modal/DonationStepDropin.tsx | 85 +++++++++++++ src/components/Modal/DonationStepMethod.tsx | 131 ++++++++++++++++++++ src/components/Modal/DonationStepThanks.tsx | 7 ++ src/components/Modal/Modal.css | 67 ++++++++++ src/components/Modal/Modal.tsx | 25 ++++ src/state/atoms.ts | 5 + 12 files changed, 568 insertions(+), 17 deletions(-) create mode 100644 src/components/Modal/DonationModal.tsx create mode 100644 src/components/Modal/DonationStepCC.tsx create mode 100644 src/components/Modal/DonationStepDropin.tsx create mode 100644 src/components/Modal/DonationStepMethod.tsx create mode 100644 src/components/Modal/DonationStepThanks.tsx create mode 100644 src/components/Modal/Modal.css create mode 100644 src/components/Modal/Modal.tsx diff --git a/package.json b/package.json index b55f9e2..3dcf799 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,10 @@ "repository": "github:phosphor-icons/phosphor-home", "private": true, "dependencies": { + "@types/braintree-web": "^3.75.3", + "@types/braintree-web-drop-in": "^1.22.3", + "braintree-web": "^3.78.2", + "braintree-web-drop-in": "^1.30.1", "file-saver": "^2.0.2", "framer-motion": "^3.10.0", "fuse.js": "^6.4.1", diff --git a/src/components/App/App.css b/src/components/App/App.css index 2dc97d2..d076926 100644 --- a/src/components/App/App.css +++ b/src/components/App/App.css @@ -49,6 +49,7 @@ button { justify-content: flex-start; } +input.main-button, button.main-button { height: 64px; padding: 0 48px 0 40px; @@ -72,19 +73,29 @@ button.main-button { margin: 0 24px 24px 0; } +input.main-button:active, button.main-button:active { transform: translate(4px, 4px); box-shadow: 0 0 0 0 black; } +input.main-button:focus, button.main-button:focus { outline: none; } +input.main-button:disabled, +button.main-button:disabled { + border: 2px solid gray; + box-shadow: 4px 4px 0 0 gray; + cursor: not-allowed; +} + /* button.main-button:not(:last-child) { margin: 0 24px 24px 0; } */ +input.main-button, button.main-button svg { margin-right: 12px; } @@ -114,3 +125,55 @@ a.main-link:after { a.main-link:hover:after { width: 0%; } + +button.text-button { + display: flex; + align-items: center; + padding: 8px; + background-color: transparent; + font-size: 16px; + cursor: pointer; + border-radius: 8px; +} + +button.text-button svg { + margin: 8px; +} + +.radio-group { + display: flex; + flex-flow: row wrap; + justify-content: space-around; + row-gap: 16px; +} + +.radio-button input[type="radio"] { + display: none; +} + +.radio-button label { + display: inline-block; + padding: 8px; + min-width: 50px; + background-color: white; + border-radius: 8px; + border: 2px solid black; + font-weight: bold; + cursor: pointer; + text-align: center; + user-select: none; +} + +.radio-button label:hover { + background-color: #E0E0E0; +} + +.radio-button input[type="radio"]:checked + label { + color: white; + background-color: black; + +} + +.radio-button label input { + margin-left: 8px; +} \ No newline at end of file diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 4bfd6e9..d426e3e 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -2,6 +2,7 @@ import React, { Suspense } from "react"; import "./App.css"; import Header from "../Header/Header"; +import Modal from "../Modal/Modal"; import Toolbar from "../Toolbar/Toolbar"; import IconGrid from "../IconGrid/IconGrid"; import Footer from "../Footer/Footer"; @@ -10,6 +11,7 @@ import Notice from "../Notice/Notice"; import useIconParameters from "../../hooks/useIconParameters"; const errorFallback = ; +const paymentFallback = ; const waitingFallback = ; const App: React.FC = () => { @@ -26,6 +28,9 @@ const App: React.FC = () => { + + +