From 249599f276028e9c4e601aa50f6dbe087acab9e5 Mon Sep 17 00:00:00 2001 From: NickJ202 Date: Wed, 14 Feb 2024 18:08:06 -0500 Subject: [PATCH] turbo payment intent --- package.json | 3 +- src/components/molecules/Modal/styles.ts | 2 +- .../TurboBalanceFund/TurboBalanceFund.tsx | 178 +++++++++++++++--- .../molecules/TurboBalanceFund/styles.ts | 7 + src/helpers/config.ts | 3 + src/helpers/endpoints.ts | 2 +- src/helpers/language.ts | 2 +- src/helpers/themes.ts | 1 + src/helpers/types.ts | 5 + 9 files changed, 169 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 7da3530..a2b95ad 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "dependencies": { "@irys/sdk": "^0.1.0-a1", "@permaweb/stampjs": "0.6.1", - "@rive-app/react-canvas": "^4.5.4", + "@stripe/react-stripe-js": "^2.4.0", + "@stripe/stripe-js": "^2.4.0", "@types/react-router-dom": "^5.3.3", "arbundles": "^0.10.1", "arweave-wallet-connector": "^1.0.2", diff --git a/src/components/molecules/Modal/styles.ts b/src/components/molecules/Modal/styles.ts index a7b46aa..2a42e75 100644 --- a/src/components/molecules/Modal/styles.ts +++ b/src/components/molecules/Modal/styles.ts @@ -23,7 +23,7 @@ export const Container = styled.div<{ max-width: ${(props) => (props.noHeader ? '100%' : '90vw')}; background: ${(props) => (props.noHeader ? 'transparent' : props.theme.colors.container.primary.background)}; border-radius: ${STYLING.dimensions.radius.primary}; - margin: 60px auto; + margin: 20px auto; `; export const Header = styled.div` diff --git a/src/components/molecules/TurboBalanceFund/TurboBalanceFund.tsx b/src/components/molecules/TurboBalanceFund/TurboBalanceFund.tsx index 1620ff2..59ab208 100644 --- a/src/components/molecules/TurboBalanceFund/TurboBalanceFund.tsx +++ b/src/components/molecules/TurboBalanceFund/TurboBalanceFund.tsx @@ -1,9 +1,15 @@ import React from 'react'; +import { Elements, PaymentElement, useElements, useStripe } from '@stripe/react-stripe-js'; +import { loadStripe } from '@stripe/stripe-js'; +import { useTheme } from 'styled-components'; import { Button } from 'components/atoms/Button'; import { FormField } from 'components/atoms/FormField'; import { Loader } from 'components/atoms/Loader'; +import { Notification } from 'components/atoms/Notification'; +import { STRIPE_PUBLISHABLE_KEY, STYLING } from 'helpers/config'; import { getTurboCheckoutEndpoint, getTurboPriceWincEndpoint } from 'helpers/endpoints'; +import { NotificationResponseType } from 'helpers/types'; import { formatTurboAmount, formatUSDAmount, getARAmountFromWinc } from 'helpers/utils'; import { useArweaveProvider } from 'providers/ArweaveProvider'; import { useLanguageProvider } from 'providers/LanguageProvider'; @@ -13,13 +19,121 @@ import { Modal } from '../Modal'; import * as S from './styles'; import { IProps } from './types'; +const stripePromise = loadStripe(STRIPE_PUBLISHABLE_KEY); + +function CheckoutForm(props: { + handleGoBack: () => void; + amount: number; + wincConversion: number; + currency: string; + handleClose: () => void; +}) { + const stripe = useStripe(); + const elements = useElements(); + + const arProvider = useArweaveProvider(); + + const languageProvider = useLanguageProvider(); + const language = languageProvider.object[languageProvider.current]; + + const [loading, setLoading] = React.useState(false); + const [result, setResult] = React.useState(null); + + const [mounting, setMounting] = React.useState(true); + + React.useEffect(() => { + (async function () { + await new Promise((r) => setTimeout(r, 500)); + setMounting(false); + })(); + }, []); + + async function handleSubmit(e: any) { + e.preventDefault(); + setLoading(true); + if (!stripe || !elements) { + return; + } + try { + if (arProvider.walletAddress) { + const paymentResponse = await stripe.confirmPayment({ + elements, + confirmParams: { + return_url: `https://helix.arweave.dev`, + }, + redirect: 'if_required', + }); + + if (paymentResponse.error) { + console.error(paymentResponse.error.message); + } else { + if (paymentResponse && paymentResponse.paymentIntent && paymentResponse.paymentIntent.status) { + if (paymentResponse.paymentIntent.status === 'succeeded') { + setResult({ status: true, message: language.successfullyFunded }); + } else { + setResult({ status: false, message: language.errorOccurred }); + } + } + } + } + } catch (e: any) { + console.error(e); + } + setLoading(false); + } + + return ( + <> + + + {language.amount} + + {`${formatUSDAmount(props.amount)} = ${formatTurboAmount(props.wincConversion)}`} + + + {mounting ? : } + + +