diff --git a/src/components/Anonymous/pages/Payment/index.tsx b/src/components/Anonymous/pages/Payment/index.tsx index 983cb6c..531878c 100644 --- a/src/components/Anonymous/pages/Payment/index.tsx +++ b/src/components/Anonymous/pages/Payment/index.tsx @@ -12,81 +12,83 @@ import { ELocalesPlacement } from "@/locales"; import { useFunnel } from "@/hooks/funnel/useFunnel"; function AnonymousPaymentPage() { - const dispatch = useDispatch(); - const navigate = useNavigate(); - const { products } = useFunnel({ - funnel: ELocalesPlacement.EmailGenerator, - paymentPlacement: "TODO:FUNNEL" - }); - const activeProduct = products[0]; - const activeProductFromStore = useSelector(selectors.selectActiveProduct) - const { session, createSession } = useSession(); - const utm = useSelector(selectors.selectUTM); - const feature = useSelector(selectors.selectFeature); - const [isParametersInitialized, setIsParametersInitialized] = useState(false); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { products } = useFunnel({ + funnel: ELocalesPlacement.EmailGenerator, + paymentPlacement: "TODO:FUNNEL", + }); + const activeProduct = products[0]; + const activeProductFromStore = useSelector(selectors.selectActiveProduct); + const { session, createSession } = useSession(); + const utm = useSelector(selectors.selectUTM); + const feature = useSelector(selectors.selectFeature); + const [isParametersInitialized, setIsParametersInitialized] = useState(false); - const location = useLocation(); + const location = useLocation(); - useEffect(() => { - const _feature = location.pathname.replace( - routes.client.anonymousPayment(), - "" - ); - dispatch( - actions.userConfig.setFeature( - _feature.includes("/v1/gender") ? "" : _feature - ) - ); - dispatch(actions.privacyPolicy.updateChecked(true)) - }, [dispatch, location.pathname]); + useEffect(() => { + const _feature = location.pathname.replace( + routes.client.anonymousPayment(), + "" + ); + dispatch( + actions.userConfig.setFeature( + _feature.includes("/v1/gender") ? "" : _feature + ) + ); + dispatch(actions.privacyPolicy.updateChecked(true)); + }, [dispatch, location.pathname]); - useEffect(() => { - if (!isParametersInitialized) { - return setIsParametersInitialized(true); - } - (async () => { - await createSession(ESourceAuthorization["aura.test.payment"]) - })() - }, [utm, feature, isParametersInitialized]) - - useEffect(() => { - if (!!activeProduct) { - dispatch(actions.payment.update({ - activeProduct - })) - } - }, [activeProduct]); - - function onPaymentError(error?: string | undefined): void { - if (error === "Product not found") { - return navigate(routes.client.compatibilityV2TrialChoice()); - } + useEffect(() => { + if (!isParametersInitialized) { + return setIsParametersInitialized(true); } + (async () => { + await createSession(ESourceAuthorization["aura.test.payment"]); + })(); + }, [utm, feature, isParametersInitialized]); - function onPaymentSuccess(): void { - setTimeout(() => { - navigate(routes.client.home()); - }, 1500); + useEffect(() => { + if (!!activeProduct) { + dispatch( + actions.payment.update({ + activeProduct, + }) + ); } + }, [activeProduct]); - return ( -
- {!!activeProductFromStore && session?.["aura.test.payment"]?.length ? - - : - - } -
- ) + function onPaymentError(error?: string | null): void { + if (error === "Product not found") { + return navigate(routes.client.compatibilityV2TrialChoice()); + } + } + + function onPaymentSuccess(): void { + setTimeout(() => { + navigate(routes.client.home()); + }, 1500); + } + + return ( +
+ {!!activeProductFromStore && session?.["aura.test.payment"]?.length ? ( + + ) : ( + + )} +
+ ); } -export default AnonymousPaymentPage \ No newline at end of file +export default AnonymousPaymentPage; diff --git a/src/components/Payment/nmi/CheckoutForm/index.tsx b/src/components/Payment/nmi/CheckoutForm/index.tsx index e5fc3ad..f175d8a 100644 --- a/src/components/Payment/nmi/CheckoutForm/index.tsx +++ b/src/components/Payment/nmi/CheckoutForm/index.tsx @@ -22,7 +22,7 @@ interface ICheckoutFormProps { funnel: ELocalesPlacement; paymentPlacement: string; onSuccess?: () => void; - onError?: (error?: string) => void; + onError?: (error?: string | null) => void; onModalClosed?: () => void; } @@ -66,14 +66,15 @@ export default function CheckoutForm({ }); useEffect(() => { - if (error && onError) { - console.log(error); - if (error === "card_type_error") { - return setIsCardTypeError(true); - } - - onError(error); + // if (error) { + console.log(error); + if (error === "card_type_error") { + return setIsCardTypeError(true); + } else { + setIsCardTypeError(false); } + onError?.(error); + // } // eslint-disable-next-line react-hooks/exhaustive-deps }, [error]); diff --git a/src/components/Payment/nmi/PaymentForm/index.tsx b/src/components/Payment/nmi/PaymentForm/index.tsx index 8812379..5b3b656 100644 --- a/src/components/Payment/nmi/PaymentForm/index.tsx +++ b/src/components/Payment/nmi/PaymentForm/index.tsx @@ -11,103 +11,109 @@ import { EPaymentMethod } from "@/data/paymentMethods"; import { IFunnelPaymentVariant } from "@/api/resources/Session"; const getPrice = (product: IFunnelPaymentVariant | null) => { - if (!product) { - return 0; - } - return (product.trialPrice || 0) / 100; -} + if (!product) { + return 0; + } + return (product.trialPrice || 0) / 100; +}; interface IPaymentFormProps { - isSinglePayment?: boolean; - className?: string; - funnel: ELocalesPlacement; - paymentPlacement: string; - trialInterval: number; - onPaymentError?: (error?: string) => void; - onPaymentSuccess?: () => void; - onModalClosed?: () => void; + isSinglePayment?: boolean; + className?: string; + funnel: ELocalesPlacement; + paymentPlacement: string; + trialInterval: number; + onPaymentError?: (error?: string | null) => void; + onPaymentSuccess?: () => void; + onModalClosed?: () => void; } function PaymentForm({ - isSinglePayment = false, - className, - funnel, - paymentPlacement, - trialInterval, - onPaymentError, - onPaymentSuccess, - onModalClosed + isSinglePayment = false, + className, + funnel, + paymentPlacement, + trialInterval, + onPaymentError, + onPaymentSuccess, + onModalClosed, }: IPaymentFormProps) { - const { translate } = useTranslations(ELocalesPlacement.V1); - const currency = useSelector(selectors.selectCurrency); - const activeProduct = useSelector(selectors.selectActiveProduct); + const { translate } = useTranslations(ELocalesPlacement.V1); + const currency = useSelector(selectors.selectCurrency); + const activeProduct = useSelector(selectors.selectActiveProduct); - const isLoading = false; + const isLoading = false; - const paymentMethodsButtons = [ - { - id: EPaymentMethod.CREDIT_CARD, - icon: "/payment-form/credit-card.svg", - title: translate("payment_modal.credit_card") - } - ] + const paymentMethodsButtons = [ + { + id: EPaymentMethod.CREDIT_CARD, + icon: "/payment-form/credit-card.svg", + title: translate("payment_modal.credit_card"), + }, + ]; - return ( - <> - {isLoading && ( -
-
- -
-
- )} -
- {!isSinglePayment && - {translate("payment_modal.title")} - } - { }} - /> - {!isSinglePayment && activeProduct && ( -
-

- {translate("payment_modal.description", { - priceForDays: ( - - {translate("payment_modal.price_for_days", { - trialPrice: addCurrency( - getPrice(activeProduct), - currency - ), - trialDuration: trialInterval, - })} - - ), - emailReminder: ( - {translate("payment_modal.email_reminder")} - ), - })} -

-
- )} -
- {!!activeProduct && } -
-

{translate("payment_modal.address")}

-
- - ) + return ( + <> + {isLoading && ( +
+
+ +
+
+ )} +
+ {!isSinglePayment && ( + + {translate("payment_modal.title")} + + )} + {}} + /> + {!isSinglePayment && activeProduct && ( +
+

+ {translate("payment_modal.description", { + priceForDays: ( + + {translate("payment_modal.price_for_days", { + trialPrice: addCurrency( + getPrice(activeProduct), + currency + ), + trialDuration: trialInterval, + })} + + ), + emailReminder: ( + {translate("payment_modal.email_reminder")} + ), + })} +

+
+ )} +
+ {!!activeProduct && ( + + )} +
+

{translate("payment_modal.address")}

+
+ + ); } -export default PaymentForm \ No newline at end of file +export default PaymentForm; diff --git a/src/components/Payment/nmi/PaymentPage/index.tsx b/src/components/Payment/nmi/PaymentPage/index.tsx index 16ec087..981f231 100644 --- a/src/components/Payment/nmi/PaymentPage/index.tsx +++ b/src/components/Payment/nmi/PaymentPage/index.tsx @@ -28,7 +28,7 @@ interface IPaymentPageProps { sessionId?: string; funnel: ELocalesPlacement; paymentPlacement: string; - onError?: (error?: string) => void; + onError?: (error?: string | null) => void; onSuccess?: () => void; onBack?: () => void; onPopState?: () => void; @@ -89,13 +89,17 @@ function PaymentPage({ }, ]; - function onPaymentError(error?: string | undefined): void { - setIsPaymentError(true); - if (error !== "Product not found") { - metricService.reachGoal(EGoals.PAYMENT_ERROR, [ - EMetrics.YANDEX, - EMetrics.KLAVIYO, - ]); + function onPaymentError(error?: string | null): void { + if (error) { + setIsPaymentError(true); + if (error !== "Product not found") { + metricService.reachGoal(EGoals.PAYMENT_ERROR, [ + EMetrics.YANDEX, + EMetrics.KLAVIYO, + ]); + } + } else { + setIsPaymentError(false); } onError?.(error); } diff --git a/src/hooks/payment/nmi/usePayment.ts b/src/hooks/payment/nmi/usePayment.ts index a8b0507..4b518fd 100644 --- a/src/hooks/payment/nmi/usePayment.ts +++ b/src/hooks/payment/nmi/usePayment.ts @@ -263,6 +263,7 @@ export const usePayment = ({ }; const submitInlineForm = (address?: AddressFields) => { + setError(null); if (address) { addressRef.current = address; } diff --git a/src/routerComponents/Compatibility/v2/index.tsx b/src/routerComponents/Compatibility/v2/index.tsx index ce7d7b6..44ec408 100644 --- a/src/routerComponents/Compatibility/v2/index.tsx +++ b/src/routerComponents/Compatibility/v2/index.tsx @@ -59,12 +59,12 @@ function CompatibilityV2Routes() { const { setTheme } = useTheme(); const { isReady, variant: darkThemeCompatibilityV2Variant } = useUnleash({ - flag: EUnleashFlags.darkThemeCompatibilityV2 - }) + flag: EUnleashFlags.darkThemeCompatibilityV2, + }); const { funnelData } = useFunnel({ funnel: ELocalesPlacement.CompatibilityV2, - paymentPlacement: "" + paymentPlacement: "", }); const availablePaths = useMemo(() => { @@ -95,7 +95,7 @@ function CompatibilityV2Routes() { dispatch(actions.compatibilityV2.update({ fromRedesign: true })); }, [dispatch]); - function onPaymentError(error?: string | undefined): void { + function onPaymentError(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.compatibilityV2TrialChoice()); } @@ -115,14 +115,18 @@ function CompatibilityV2Routes() { function onPopState(): void { if (!availablePaths.main_secret_discount) return; if ( - document.location.toString() === `${window.location.origin}${routes.client.compatibilityV2Payment()}` || - document.location.toString() === `${window.location.origin}${routes.client.compatibilityV2TrialPayment()}` + document.location.toString() === + `${window.location.origin}${routes.client.compatibilityV2Payment()}` || + document.location.toString() === + `${ + window.location.origin + }${routes.client.compatibilityV2TrialPayment()}` ) { navigate(routes.client.compatibilityV2SaveOff()); } } - function onPaymentErrorDiscount(error?: string | undefined): void { + function onPaymentErrorDiscount(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.compatibilityV2SecretDiscount()); } @@ -140,20 +144,22 @@ function CompatibilityV2Routes() { } return () => { setTheme(ESiteTheme.Light); - } - }, [darkThemeCompatibilityV2Variant]) + }; + }, [darkThemeCompatibilityV2Variant]); if (!isReady) { - return
- -
+ return ( +
+ +
+ ); } return ( @@ -171,19 +177,21 @@ function CompatibilityV2Routes() { funnel={ELocalesPlacement.CompatibilityV2} paymentPlacement="add_consultant" nextRoute={ - availablePaths.add_guides ? - routes.client.compatibilityV2AddGuides() : - `${routes.client.getInformationPartner()}?path=back` + availablePaths.add_guides + ? routes.client.compatibilityV2AddGuides() + : `${routes.client.getInformationPartner()}?path=back` } /> } /> } + element={ + + } /> @@ -196,23 +204,29 @@ function CompatibilityV2Routes() { > } + element={ + + } /> } + path={removePrefix( + routes.client.compatibilityV2SecretDiscountPaymentModal() + )} + element={ + + } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } > } /> @@ -329,7 +355,9 @@ function CompatibilityV2Routes() { element={} /> } /> } /> diff --git a/src/routerComponents/Compatibility/v3/index.tsx b/src/routerComponents/Compatibility/v3/index.tsx index 7d54448..9fc6ac5 100644 --- a/src/routerComponents/Compatibility/v3/index.tsx +++ b/src/routerComponents/Compatibility/v3/index.tsx @@ -57,7 +57,7 @@ function CompatibilityV3Routes() { const { funnelData } = useFunnel({ funnel: ELocalesPlacement.CompatibilityV3, - paymentPlacement: "" + paymentPlacement: "", }); const availablePaths = useMemo(() => { @@ -88,7 +88,7 @@ function CompatibilityV3Routes() { dispatch(actions.compatibilityV3.update({ fromRedesign: true })); }, [dispatch]); - function onPaymentError(error?: string | undefined): void { + function onPaymentError(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.compatibilityV3TrialChoice()); } @@ -108,14 +108,18 @@ function CompatibilityV3Routes() { function onPopState(): void { if (!availablePaths.main_secret_discount) return; if ( - document.location.toString() === `${window.location.origin}${routes.client.compatibilityV3Payment()}` || - document.location.toString() === `${window.location.origin}${routes.client.compatibilityV3TrialPayment()}` + document.location.toString() === + `${window.location.origin}${routes.client.compatibilityV3Payment()}` || + document.location.toString() === + `${ + window.location.origin + }${routes.client.compatibilityV3TrialPayment()}` ) { navigate(routes.client.compatibilityV3SaveOff()); } } - function onPaymentErrorDiscount(error?: string | undefined): void { + function onPaymentErrorDiscount(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.compatibilityV3SecretDiscount()); } @@ -142,19 +146,21 @@ function CompatibilityV3Routes() { funnel={ELocalesPlacement.CompatibilityV3} paymentPlacement="add_consultant" nextRoute={ - availablePaths.add_guides ? - routes.client.compatibilityV3AddGuides() : - `${routes.client.getInformationPartner()}?path=back` + availablePaths.add_guides + ? routes.client.compatibilityV3AddGuides() + : `${routes.client.getInformationPartner()}?path=back` } /> } /> } + element={ + + } /> @@ -167,23 +173,29 @@ function CompatibilityV3Routes() { > } + element={ + + } /> } + path={removePrefix( + routes.client.compatibilityV3SecretDiscountPaymentModal() + )} + element={ + + } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } > } /> @@ -296,7 +320,9 @@ function CompatibilityV3Routes() { element={} /> } /> } /> diff --git a/src/routerComponents/Compatibility/v4/index.tsx b/src/routerComponents/Compatibility/v4/index.tsx index 5bd5def..bd6e7d7 100644 --- a/src/routerComponents/Compatibility/v4/index.tsx +++ b/src/routerComponents/Compatibility/v4/index.tsx @@ -82,7 +82,7 @@ function CompatibilityV4Routes() { const { funnelData } = useFunnel({ funnel: ELocalesPlacement.CompatibilityV4, - paymentPlacement: "" + paymentPlacement: "", }); const availablePaths = useMemo(() => { @@ -113,7 +113,7 @@ function CompatibilityV4Routes() { dispatch(actions.compatibilityV4.update({ fromRedesign: true })); }, [dispatch]); - function onPaymentError(error?: string | undefined): void { + function onPaymentError(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.compatibilityV4TrialChoice()); } @@ -133,14 +133,18 @@ function CompatibilityV4Routes() { function onPopState(): void { if (!availablePaths.main_secret_discount) return; if ( - document.location.toString() === `${window.location.origin}${routes.client.compatibilityV4Payment()}` || - document.location.toString() === `${window.location.origin}${routes.client.compatibilityV4TrialPayment()}` + document.location.toString() === + `${window.location.origin}${routes.client.compatibilityV4Payment()}` || + document.location.toString() === + `${ + window.location.origin + }${routes.client.compatibilityV4TrialPayment()}` ) { navigate(routes.client.compatibilityV4SaveOff()); } } - function onPaymentErrorDiscount(error?: string | undefined): void { + function onPaymentErrorDiscount(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.compatibilityV4SecretDiscount()); } @@ -167,19 +171,21 @@ function CompatibilityV4Routes() { funnel={ELocalesPlacement.CompatibilityV4} paymentPlacement="add_consultant" nextRoute={ - availablePaths.add_guides ? - routes.client.compatibilityV4AddGuides() : - `${routes.client.getInformationPartner()}?path=back` + availablePaths.add_guides + ? routes.client.compatibilityV4AddGuides() + : `${routes.client.getInformationPartner()}?path=back` } /> } /> } + element={ + + } /> @@ -192,23 +198,29 @@ function CompatibilityV4Routes() { > } + element={ + + } /> } + path={removePrefix( + routes.client.compatibilityV4SecretDiscountPaymentModal() + )} + element={ + + } /> } /> } /> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } > } /> @@ -445,7 +483,9 @@ function CompatibilityV4Routes() { element={} /> } /> } /> diff --git a/src/routerComponents/MarketingLanding/v1/index.tsx b/src/routerComponents/MarketingLanding/v1/index.tsx index 51ca4f9..a6049f4 100644 --- a/src/routerComponents/MarketingLanding/v1/index.tsx +++ b/src/routerComponents/MarketingLanding/v1/index.tsx @@ -19,119 +19,138 @@ import { ELocalesPlacement } from "@/locales"; const removePrefix = (path: string) => path.replace(emailMarketingV1Prefix, ""); function MarketingLandingV1Routes() { - const navigate = useNavigate(); + const navigate = useNavigate(); - function onPaymentError(error?: string | undefined): void { - if (error === "Product not found") { - return navigate(routes.client.emailMarketingV1SpecialOffer()); + function onPaymentError(error?: string | null): void { + if (error === "Product not found") { + return navigate(routes.client.emailMarketingV1SpecialOffer()); + } + } + + function onPaymentSuccess(): void { + setTimeout(() => { + navigate(routes.client.emailMarketingV1SkipTrial()); + }, 1500); + } + + function onBack(): void { + navigate(routes.client.emailMarketingV1SaveOff()); + } + + function onPopState(): void { + if ( + document.location.toString() === + `${window.location.origin}${routes.client.emailMarketingV1SpecialOffer()}` + ) { + navigate(routes.client.emailMarketingV1SaveOff()); + } + } + + function onPaymentErrorDiscount(error?: string | null): void { + if (error === "Product not found") { + return navigate(routes.client.emailMarketingV1SecretDiscount()); + } + } + + function onPaymentSuccessDiscount(): void { + setTimeout(() => { + navigate(routes.client.emailMarketingV1SkipTrial()); + }, 1500); + } + + return ( + + } + /> + }> + }> + } + /> + + } + /> + + } + /> + + + } - } - - function onPaymentSuccess(): void { - setTimeout(() => { - navigate(routes.client.emailMarketingV1SkipTrial()); - }, 1500); - } - - function onBack(): void { - navigate(routes.client.emailMarketingV1SaveOff()); - } - - function onPopState(): void { - if (document.location.toString() === `${window.location.origin}${routes.client.emailMarketingV1SpecialOffer()}`) { - navigate(routes.client.emailMarketingV1SaveOff()); - } - } - - function onPaymentErrorDiscount(error?: string | undefined): void { - if (error === "Product not found") { - return navigate(routes.client.emailMarketingV1SecretDiscount()); - } - } - - function onPaymentSuccessDiscount(): void { - setTimeout(() => { - navigate(routes.client.emailMarketingV1SkipTrial()); - }, 1500); - } - - return ( - - } + > + - }> - }> - } - /> - } - /> - } - /> - - - - } - > - } - /> - } - /> - - }> - } - /> - } - /> - } - /> - } - /> - } /> - - - ); + } + /> + + } + /> + + + + + } + > + } + /> + } + /> + } + /> + } + /> + } /> + + + ); } export default MarketingLandingV1Routes; diff --git a/src/routerComponents/Palmistry/v1/index.tsx b/src/routerComponents/Palmistry/v1/index.tsx index 14e88f8..bf48250 100644 --- a/src/routerComponents/Palmistry/v1/index.tsx +++ b/src/routerComponents/Palmistry/v1/index.tsx @@ -62,19 +62,19 @@ const availableUrlsDarkTheme = [ routes.client.palmistryV1Camera(), routes.client.palmistryV1ScannedPhoto(), routes.client.palmistryV1Email(), -] +]; function PalmistryV1Routes() { const navigate = useNavigate(); const dispatch = useDispatch(); const { isReady, variant: darkThemePalmistryV1Variant } = useUnleash({ - flag: EUnleashFlags.darkThemePalmistryV1 - }) + flag: EUnleashFlags.darkThemePalmistryV1, + }); const { funnelData } = useFunnel({ funnel: ELocalesPlacement.PalmistryV1, - paymentPlacement: "" + paymentPlacement: "", }); const availablePaths = useMemo(() => { @@ -105,7 +105,7 @@ function PalmistryV1Routes() { dispatch(actions.palmistry.update({ fromRedesign: true })); }, [dispatch]); - function onPaymentError(error?: string | undefined): void { + function onPaymentError(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.palmistryV1TrialChoice()); } @@ -125,14 +125,16 @@ function PalmistryV1Routes() { function onPopState(): void { if (!availablePaths.main_secret_discount) return; if ( - document.location.toString() === `${window.location.origin}${routes.client.palmistryV1Payment()}` || - document.location.toString() === `${window.location.origin}${routes.client.palmistryV1TrialPayment()}` + document.location.toString() === + `${window.location.origin}${routes.client.palmistryV1Payment()}` || + document.location.toString() === + `${window.location.origin}${routes.client.palmistryV1TrialPayment()}` ) { navigate(routes.client.palmistryV1SaveOff()); } } - function onPaymentErrorDiscount(error?: string | undefined): void { + function onPaymentErrorDiscount(error?: string | null): void { if (error === "Product not found") { return navigate(routes.client.palmistryV1SecretDiscount()); } @@ -157,19 +159,21 @@ function PalmistryV1Routes() { } else { document.body.classList.remove("dark-theme"); } - }, [window.location.pathname]) + }, [window.location.pathname]); if (!isReady) { - return
- -
+ return ( +
+ +
+ ); } return ( @@ -187,19 +191,21 @@ function PalmistryV1Routes() { funnel={ELocalesPlacement.PalmistryV1} paymentPlacement="add_consultant" nextRoute={ - availablePaths.add_guides ? - routes.client.palmistryV1AddGuides() : - `${routes.client.getInformationPartner()}?path=back` + availablePaths.add_guides + ? routes.client.palmistryV1AddGuides() + : `${routes.client.getInformationPartner()}?path=back` } /> } /> } + element={ + + } />
@@ -212,23 +218,29 @@ function PalmistryV1Routes() { > } + element={ + + } /> } + path={removePrefix( + routes.client.palmistryV1SecretDiscountPaymentModal() + )} + element={ + + } /> } + element={ + + } /> @@ -101,23 +106,29 @@ function PalmistryV2Routes() { > } + element={ + + } /> } + path={removePrefix( + routes.client.palmistryV2SecretDiscountPaymentModal() + )} + element={ + + } />