171 lines
6.6 KiB
TypeScript
171 lines
6.6 KiB
TypeScript
import React from "react";
|
|
import { AnimatePresence, motion } from "framer-motion";
|
|
import { useLocation, useSearchParams } from "react-router-dom";
|
|
|
|
import "./steps-manager.css";
|
|
|
|
import Progressbar from "@/components/palmistry/progress-bar/progress-bar";
|
|
import PalmistryContainer from "@/components/palmistry/palmistry-container/palmistry-container";
|
|
import useSteps, { Step } from "@/hooks/palmistry/use-steps";
|
|
import StepWelcome from "@/components/palmistry/step-welcome/step-welcome";
|
|
import StepGender from "@/components/palmistry/step-gender/step-gender";
|
|
import StepBirthdate from "@/components/palmistry/step-birthdate/step-birthdate";
|
|
import StepPalmsHold from "@/components/palmistry/step-palms-hold/step-palms-hold";
|
|
import StepWish from "@/components/palmistry/step-wish/step-wish";
|
|
import StepRelationshipStatus from "@/components/palmistry/step-relationship-status/step-relationship-status";
|
|
import StepResonatedElement from "@/components/palmistry/step-resonated-element/step-resonated-element";
|
|
import StepColorYouLike from "@/components/palmistry/step-color-you-like/step-color-you-like";
|
|
import StepDecisions from "@/components/palmistry/step-decisions/step-decisions";
|
|
import StepGuidancePlan from "@/components/palmistry/step-guidance-plan/step-guidance-plan";
|
|
import StepPersonalStatement from "@/components/palmistry/step-personal-statement/step-personal-statement";
|
|
import StepScanInfo from "@/components/palmistry/step-scan-info/step-scan-info";
|
|
import StepUpload from "@/components/palmistry/step-upload/step-upload";
|
|
import StepScanPhoto from "@/components/palmistry/step-scan-photo/step-scan-photo";
|
|
import StepEmail from "@/components/palmistry/step-email/step-email";
|
|
import StepSubscriptionPlan from "@/components/palmistry/step-subscription-plan/step-subscription-plan";
|
|
import StepPaywall from "@/components/palmistry/step-paywall/step-paywall";
|
|
import PaymentScreen from "@/components/palmistry/payment-screen/payment-screen";
|
|
import DiscountScreen from "@/components/palmistry/discount-screen/discount-screen";
|
|
import PremiumBundleScreen from "@/components/palmistry/premium-bundle-screen/premium-bundle-screen";
|
|
|
|
const PalmistryContainerWrapper = (props: {
|
|
children: React.ReactNode;
|
|
currentStep: Step;
|
|
}) => {
|
|
return (
|
|
<PalmistryContainer
|
|
singleQuestion={[
|
|
Step.Wish,
|
|
Step.RelationshipStatus,
|
|
Step.ResonatedElement,
|
|
Step.ColorYouLike,
|
|
Step.Decisions,
|
|
].includes(props.currentStep)}
|
|
type={props.currentStep}
|
|
>
|
|
{props.children}
|
|
</PalmistryContainer>
|
|
);
|
|
};
|
|
|
|
const animationDuration = 0.2;
|
|
|
|
export default function StepsManager() {
|
|
const steps = useSteps();
|
|
const { pathname } = useLocation();
|
|
const [searchParams] = useSearchParams();
|
|
|
|
const [modalIsOpen, setModalIsOpen] = React.useState(false);
|
|
|
|
React.useLayoutEffect(() => {
|
|
if (!steps.isInited) return;
|
|
steps.goFirstUnpassedStep(searchParams.toString());
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [steps.isInited]);
|
|
|
|
const motionDivClassName = [
|
|
"steps-manager__motion-div",
|
|
modalIsOpen ? "steps-manager__motion-div_no-transform" : "",
|
|
];
|
|
|
|
const nonSliderSteps = [Step.Payment, Step.Discount, Step.PremiumBundle];
|
|
|
|
return (
|
|
<div className="steps-manager">
|
|
{steps.currentNumber >= steps.progressBarRange[0] &&
|
|
steps.currentNumber <= steps.progressBarRange[1] && (
|
|
<Progressbar step={steps.currentNumber} />
|
|
)}
|
|
|
|
<main className="steps-manager__main">
|
|
{(nonSliderSteps.includes(steps.current as Step) || steps.current === Step.Paywall) && (
|
|
<div style={steps.current === Step.Paywall ? {visibility: 'hidden', position: 'absolute'} : {}}>
|
|
<PalmistryContainerWrapper currentStep={steps.current as Step}>
|
|
{[Step.Paywall, Step.Payment].includes(steps.current as Step) && <PaymentScreen />}
|
|
{steps.current === Step.Discount && <DiscountScreen/>}
|
|
{steps.current === Step.PremiumBundle && <PremiumBundleScreen/>}
|
|
</PalmistryContainerWrapper>
|
|
</div>
|
|
)}
|
|
|
|
{!nonSliderSteps.includes(steps.current as Step) && (
|
|
<AnimatePresence mode="wait" initial={false}>
|
|
<motion.div
|
|
className={motionDivClassName.join(" ")}
|
|
key={pathname}
|
|
initial="pageInitial"
|
|
animate="pageAnimate"
|
|
exit="pageExit"
|
|
variants={{
|
|
pageInitial: {
|
|
transform: "translateX(100vw)",
|
|
width: "100%",
|
|
},
|
|
pageAnimate: {
|
|
transform: "translateX(0)",
|
|
width: "100%",
|
|
},
|
|
pageExit: {
|
|
transform: "translateX(-200vw)",
|
|
opacity: 0,
|
|
width: "100%",
|
|
},
|
|
}}
|
|
transition={{
|
|
duration: animationDuration,
|
|
ease: "linear",
|
|
}}
|
|
>
|
|
<PalmistryContainerWrapper currentStep={steps.current as Step}>
|
|
{steps.current === Step.Welcome && <StepWelcome />}
|
|
|
|
{steps.current === Step.Gender && <StepGender />}
|
|
|
|
{steps.current === Step.Birthdate && <StepBirthdate />}
|
|
|
|
{steps.current === Step.PalmsHold && <StepPalmsHold />}
|
|
|
|
{steps.current === Step.Wish && <StepWish />}
|
|
|
|
{steps.current === Step.RelationshipStatus && (
|
|
<StepRelationshipStatus />
|
|
)}
|
|
|
|
{steps.current === Step.ResonatedElement && (
|
|
<StepResonatedElement />
|
|
)}
|
|
|
|
{steps.current === Step.ColorYouLike && <StepColorYouLike />}
|
|
|
|
{steps.current === Step.Decisions && <StepDecisions />}
|
|
|
|
{steps.current === Step.GuidancePlan && <StepGuidancePlan />}
|
|
|
|
{steps.current === Step.PersonalStatement && (
|
|
<StepPersonalStatement />
|
|
)}
|
|
|
|
{steps.current === Step.ScanInfo && <StepScanInfo />}
|
|
|
|
{steps.current === Step.Upload && (
|
|
<StepUpload onOpenModal={setModalIsOpen} />
|
|
)}
|
|
|
|
{steps.current === Step.ScanPhoto && <StepScanPhoto />}
|
|
|
|
{steps.current === Step.Email && <StepEmail />}
|
|
|
|
{steps.current === Step.SubscriptionPlan && (
|
|
<StepSubscriptionPlan />
|
|
)}
|
|
|
|
{steps.current === Step.Paywall && <StepPaywall />}
|
|
</PalmistryContainerWrapper>
|
|
</motion.div>
|
|
</AnimatePresence>
|
|
)}
|
|
</main>
|
|
</div>
|
|
);
|
|
}
|