diff --git a/src/components/palmistry/apple-pay-button/apple-pay-button.css b/src/components/palmistry/apple-pay-button/apple-pay-button.css deleted file mode 100644 index ca71bf4..0000000 --- a/src/components/palmistry/apple-pay-button/apple-pay-button.css +++ /dev/null @@ -1,4 +0,0 @@ -.apple-pay-button { - width: 100%; - margin-bottom: 10px; -} diff --git a/src/components/palmistry/apple-pay-button/apple-pay-button.tsx b/src/components/palmistry/apple-pay-button/apple-pay-button.tsx deleted file mode 100644 index 1f8030e..0000000 --- a/src/components/palmistry/apple-pay-button/apple-pay-button.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import './apple-pay-button.css'; - -import React from 'react'; -import { - PaymentRequestButtonElement, - useStripe, - useElements, -} from '@stripe/react-stripe-js'; -import { PaymentRequest } from '@stripe/stripe-js'; - -import { SubscriptionPlan } from '../../../hooks/palmistry/use-subscription-plans'; - -type Props = { - subscriptionPlan: SubscriptionPlan | null; - paymentResultUrl: string; - clientSecret: string; - subscriptionReceiptId?: string; -} - -const redirectDelay = 3000; - -export default function ApplePayButton(props: Props) { - const stripe = useStripe(); - const elements = useElements(); - const [paymentRequest, setPaymentRequest] = React.useState(null); - - React.useEffect(() => { - if (!stripe || !elements || !props.subscriptionPlan) return; - - const pr = stripe.paymentRequest({ - country: 'US', - currency: 'usd', - total: { - label: 'Subscription', - amount: props.subscriptionPlan.trial.price_cents, - }, - requestPayerName: true, - requestPayerEmail: true, - }); - - pr.canMakePayment().then((result) => { - if (result) setPaymentRequest(pr); - }); - - pr.on('paymentmethod', async (e) => { - const { error: stripeError } = await stripe.confirmCardPayment( - props.clientSecret, - { payment_method: e.paymentMethod.id }, - { handleActions: false }, - ); - - if (stripeError) { - e.complete('fail'); - - setTimeout(() => { - document.location.href = `${props.paymentResultUrl}/?redirect_status=failed`; - }, redirectDelay); - - return; - } - - e.complete('success'); - - setTimeout(() => { - document.location.href = `${props.paymentResultUrl}/?redirect_status=succeeded`; - }, redirectDelay); - }); - }, [ - props.subscriptionPlan, - props.clientSecret, - elements, - stripe, - props.subscriptionReceiptId, - props.paymentResultUrl, - ]); - - if (!paymentRequest) return null; - - return ( - - ); -} diff --git a/src/components/palmistry/payment-widget/payment-widget.tsx b/src/components/palmistry/payment-widget/payment-widget.tsx deleted file mode 100644 index 8224550..0000000 --- a/src/components/palmistry/payment-widget/payment-widget.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; -import { Stripe, StripeError, loadStripe } from '@stripe/stripe-js'; -import { Elements } from '@stripe/react-stripe-js'; - -import { SubscriptionPlanId, SubscriptionPlan } from '../../../hooks/palmistry/use-subscription-plans'; -import ApplePayButton from '../apple-pay-button/apple-pay-button'; -import StipeForm from '../stripe-form/stripe-form'; -import Loader from '../loader/loader'; -import AlertModal from '../alert-modal/alert-modal'; - -type Props = { - subscriptionPlanId: SubscriptionPlanId; - storedSubscriptionPlan: SubscriptionPlan | null; -}; - -export default function PaymentWidget(props: Props) { - const [stripePromise, setStripePromise] = React.useState | null>(null); - const [subscriptionReceiptId, setSubscriptionReceiptId] = React.useState(null); - const [clientSecret, setClientSecret] = React.useState(undefined); - const [isProcessing, setIsProcessing] = React.useState(true); - const [errorMessage, setErrorMessage] = React.useState(''); - - const initStripe = async () => { - // const siteConfig = await getAppsAuraweb(); - // setStripePromise(loadStripe(siteConfig.data.stripe_public_key)); - }; - - React.useEffect(() => { - const getSubscriptionReceipt = async () => { - try { - // const { subscription_receipt } = await postSubscriptionReceipts(props.subscriptionPlanId, 'stripe'); - // setSubscriptionReceiptId(subscription_receipt.id); - // setClientSecret(subscription_receipt.data.client_secret); - } catch (error) { - console.error(error); - } - }; - - Promise.all([initStripe(), getSubscriptionReceipt()]).then(() => setIsProcessing(false)); - }, [props.subscriptionPlanId]); - - const stripeElementsOptions = React.useMemo(() => ({ clientSecret }), [clientSecret]); - const paymentResultUrl = `https://aura.witapps.us/payment/result/${subscriptionReceiptId}/`; - - return ( -
- {subscriptionReceiptId && stripePromise && clientSecret && ( - - - setIsProcessing(true)} - onSuccess={() => { - setIsProcessing(false); - document.location.href = 'https://aura.witapps.us/payment/success/'; - }} - onError={(error: StripeError) => { - setIsProcessing(false); - console.error(error); - setErrorMessage(error.message || 'An error occurred. Please try again.'); - }} - /> - - )} - - {isProcessing && } - - {errorMessage && ( - setErrorMessage('')} title="Error">{errorMessage} - )} -
- ); -} diff --git a/src/components/palmistry/step-paywall/step-paywall.tsx b/src/components/palmistry/step-paywall/step-paywall.tsx index a1cdf52..d4780d1 100644 --- a/src/components/palmistry/step-paywall/step-paywall.tsx +++ b/src/components/palmistry/step-paywall/step-paywall.tsx @@ -18,7 +18,7 @@ export default function StepPaywall() { }, [storedEmail]); const onNext = () => { - steps.saveToStorage('lastPassedStep', steps.current); + steps.saveToStorage('lastPassedStep', steps.current as Step); navigate('/palmistry/payment'); }; diff --git a/src/hooks/palmistry/use-steps.ts b/src/hooks/palmistry/use-steps.ts index ca4c7b5..5a25d70 100644 --- a/src/hooks/palmistry/use-steps.ts +++ b/src/hooks/palmistry/use-steps.ts @@ -153,10 +153,10 @@ export default function useSteps() { } function goNext(choice?: Choice) { - setLastPassedStep(current); + setLastPassedStep(current as Step); - if (currentNumber >= sortedList.indexOf(lastPassedStep)) { - saveToStorage('lastPassedStep', current); + if (currentNumber >= sortedList.indexOf(lastPassedStep as Step)) { + saveToStorage('lastPassedStep', current as Step); } navigate(`/palmistry/${getNextStep(choice)}`); @@ -180,7 +180,7 @@ export default function useSteps() { } function saveCurrent(value: string) { - saveToStorage(current, value); + saveToStorage(current as Step, value); } return { @@ -193,7 +193,7 @@ export default function useSteps() { defaultStep, currentNumber, isInvalid, - storedValue: storedValues[current], + storedValue: storedValues[current as Step], lastPassedStep, goBack, goNext, diff --git a/src/hooks/palmistry/use-subscription-plans.ts b/src/hooks/palmistry/use-subscription-plans.ts deleted file mode 100644 index b7e304d..0000000 --- a/src/hooks/palmistry/use-subscription-plans.ts +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; -import { useTranslation } from "react-i18next"; - -import useSteps, { Step } from '@/hooks/palmistry/use-steps'; -import { useApi } from "@/api"; -import { ISubscriptionPlan } from "@/api/resources/SubscriptionPlans"; - -export enum SubscriptionPlanId { - // for test - // Stripe28 = 'stripe.28', - // Stripe29 = 'stripe.29', - // Stripe30 = 'stripe.30', - // Stripe31 = 'stripe.31', - // for prod - Stripe12 = 'stripe.12', - Stripe13 = 'stripe.13', - Stripe14 = 'stripe.14', - Stripe15 = 'stripe.15', -} - -export type SubscriptionPlan = { - id: string; - trial: { - price_cents: number; - }; - formattedPrice: string; - price_cents: number; -}; - -const subscriptionPlanIds = Object.values(SubscriptionPlanId); - -const bestPlanId = [...subscriptionPlanIds].reverse()[0]; - -function formatPrice(cents: number) { - return (cents / 100).toFixed(2); -} - -export default function useSubscriptionPlans() { - const steps = useSteps(); - const api = useApi(); - const { t, i18n } = useTranslation(); - - const locale = i18n.language; - - const [subscriptionPlans, setSubscriptionPlans] = React.useState>([]); - - const storedSubscriptionPlanId = steps.getStoredValue(Step.SubscriptionPlan) as SubscriptionPlanId; - - const fillSubscriptionPlans = async () => { - const { sub_plans } = await api.getSubscriptionPlans({ locale }); - - setSubscriptionPlans(subscriptionPlanIds - .map((id) => { - const plan = sub_plans.find((p: ISubscriptionPlan) => p.id === id) as ISubscriptionPlan; - - if (!plan) { - return null; - } - - return { - ...plan, - formattedPrice: formatPrice(plan.trial.price_cents), - }; - }), - ); - }; - - React.useEffect(() => { - fillSubscriptionPlans(); - }, []); - - return { - subscriptionPlans, - bestPlanId, - storedSubscriptionPlanId, - storedSubscriptionPlan: subscriptionPlans.find((p) => p.id === storedSubscriptionPlanId) || null, - }; -}