diff --git a/public/airplane.png b/public/airplane.png new file mode 100644 index 0000000..92cf5c1 Binary files /dev/null and b/public/airplane.png differ diff --git a/public/bar_chart.png b/public/bar_chart.png new file mode 100644 index 0000000..f557422 Binary files /dev/null and b/public/bar_chart.png differ diff --git a/public/birds_squabble.webp b/public/birds_squabble.webp new file mode 100755 index 0000000..a7b9f81 Binary files /dev/null and b/public/birds_squabble.webp differ diff --git a/public/both.svg b/public/both.svg new file mode 100755 index 0000000..2699314 --- /dev/null +++ b/public/both.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/check-mark.svg b/public/check-mark.svg new file mode 100755 index 0000000..f3720c5 --- /dev/null +++ b/public/check-mark.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/public/cityscape_at_dusk.png b/public/cityscape_at_dusk.png new file mode 100644 index 0000000..b1e5058 Binary files /dev/null and b/public/cityscape_at_dusk.png differ diff --git a/public/cloud.png b/public/cloud.png new file mode 100755 index 0000000..c437749 Binary files /dev/null and b/public/cloud.png differ diff --git a/public/clouds.svg b/public/clouds.svg new file mode 100755 index 0000000..d8d30fc --- /dev/null +++ b/public/clouds.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/company_and_sunset.webp b/public/company_and_sunset.webp new file mode 100644 index 0000000..6a9f0e2 Binary files /dev/null and b/public/company_and_sunset.webp differ diff --git a/public/compass.svg b/public/compass.svg new file mode 100755 index 0000000..8955f4e --- /dev/null +++ b/public/compass.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/confused.png b/public/confused.png new file mode 100644 index 0000000..c7590f9 Binary files /dev/null and b/public/confused.png differ diff --git a/public/couple_and_sunset_2.webp b/public/couple_and_sunset_2.webp new file mode 100644 index 0000000..f2ac54f Binary files /dev/null and b/public/couple_and_sunset_2.webp differ diff --git a/public/couple_in_bad_1.webp b/public/couple_in_bad_1.webp new file mode 100644 index 0000000..acfdd3e Binary files /dev/null and b/public/couple_in_bad_1.webp differ diff --git a/public/couple_in_bad_2.webp b/public/couple_in_bad_2.webp new file mode 100644 index 0000000..550969d Binary files /dev/null and b/public/couple_in_bad_2.webp differ diff --git a/public/darts.svg b/public/darts.svg new file mode 100755 index 0000000..bb89132 --- /dev/null +++ b/public/darts.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/down_arrow.png b/public/down_arrow.png new file mode 100755 index 0000000..5ef2910 Binary files /dev/null and b/public/down_arrow.png differ diff --git a/public/family.png b/public/family.png new file mode 100755 index 0000000..70eee56 Binary files /dev/null and b/public/family.png differ diff --git a/public/flexed_biceps.png b/public/flexed_biceps.png new file mode 100644 index 0000000..8155ca0 Binary files /dev/null and b/public/flexed_biceps.png differ diff --git a/public/fork_and_knife_with_plate.png b/public/fork_and_knife_with_plate.png new file mode 100644 index 0000000..c8a5572 Binary files /dev/null and b/public/fork_and_knife_with_plate.png differ diff --git a/public/girl_talking.webp b/public/girl_talking.webp new file mode 100755 index 0000000..162c427 Binary files /dev/null and b/public/girl_talking.webp differ diff --git a/public/girl_thinking.webp b/public/girl_thinking.webp new file mode 100644 index 0000000..57cd577 Binary files /dev/null and b/public/girl_thinking.webp differ diff --git a/public/hourglass.png b/public/hourglass.png new file mode 100755 index 0000000..43c3c98 Binary files /dev/null and b/public/hourglass.png differ diff --git a/public/jigsaw.png b/public/jigsaw.png new file mode 100755 index 0000000..1c7a9ab Binary files /dev/null and b/public/jigsaw.png differ diff --git a/public/laughing_women.webp b/public/laughing_women.webp new file mode 100644 index 0000000..7f9a3e8 Binary files /dev/null and b/public/laughing_women.webp differ diff --git a/public/national_park.png b/public/national_park.png new file mode 100644 index 0000000..d2a32ab Binary files /dev/null and b/public/national_park.png differ diff --git a/public/parachute.png b/public/parachute.png new file mode 100644 index 0000000..dca2f75 Binary files /dev/null and b/public/parachute.png differ diff --git a/public/pleading_face.png b/public/pleading_face.png new file mode 100644 index 0000000..2105516 Binary files /dev/null and b/public/pleading_face.png differ diff --git a/public/plus.svg b/public/plus.svg new file mode 100755 index 0000000..c02e713 --- /dev/null +++ b/public/plus.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/public/questionnaire/zodiacs/aquarius.webp b/public/questionnaire/zodiacs/aquarius.webp new file mode 100644 index 0000000..c417d08 Binary files /dev/null and b/public/questionnaire/zodiacs/aquarius.webp differ diff --git a/public/questionnaire/zodiacs/aries.webp b/public/questionnaire/zodiacs/aries.webp new file mode 100644 index 0000000..5b6b0a5 Binary files /dev/null and b/public/questionnaire/zodiacs/aries.webp differ diff --git a/public/questionnaire/zodiacs/cancer.webp b/public/questionnaire/zodiacs/cancer.webp new file mode 100644 index 0000000..0d246fa Binary files /dev/null and b/public/questionnaire/zodiacs/cancer.webp differ diff --git a/public/questionnaire/zodiacs/capricorn.webp b/public/questionnaire/zodiacs/capricorn.webp new file mode 100644 index 0000000..68c73f4 Binary files /dev/null and b/public/questionnaire/zodiacs/capricorn.webp differ diff --git a/public/questionnaire/zodiacs/female/aquarius.webp b/public/questionnaire/zodiacs/female/aquarius.webp new file mode 100644 index 0000000..c10a48b Binary files /dev/null and b/public/questionnaire/zodiacs/female/aquarius.webp differ diff --git a/public/questionnaire/zodiacs/female/aries.webp b/public/questionnaire/zodiacs/female/aries.webp new file mode 100644 index 0000000..eb2bf57 Binary files /dev/null and b/public/questionnaire/zodiacs/female/aries.webp differ diff --git a/public/questionnaire/zodiacs/female/cancer.webp b/public/questionnaire/zodiacs/female/cancer.webp new file mode 100644 index 0000000..bb7121b Binary files /dev/null and b/public/questionnaire/zodiacs/female/cancer.webp differ diff --git a/public/questionnaire/zodiacs/female/capricorn.webp b/public/questionnaire/zodiacs/female/capricorn.webp new file mode 100644 index 0000000..d0c9ddb Binary files /dev/null and b/public/questionnaire/zodiacs/female/capricorn.webp differ diff --git a/public/questionnaire/zodiacs/female/gemini.webp b/public/questionnaire/zodiacs/female/gemini.webp new file mode 100644 index 0000000..faee016 Binary files /dev/null and b/public/questionnaire/zodiacs/female/gemini.webp differ diff --git a/public/questionnaire/zodiacs/female/leo.webp b/public/questionnaire/zodiacs/female/leo.webp new file mode 100644 index 0000000..a3be6fe Binary files /dev/null and b/public/questionnaire/zodiacs/female/leo.webp differ diff --git a/public/questionnaire/zodiacs/female/libra.webp b/public/questionnaire/zodiacs/female/libra.webp new file mode 100644 index 0000000..7875be8 Binary files /dev/null and b/public/questionnaire/zodiacs/female/libra.webp differ diff --git a/public/questionnaire/zodiacs/female/pisces.webp b/public/questionnaire/zodiacs/female/pisces.webp new file mode 100644 index 0000000..8174c38 Binary files /dev/null and b/public/questionnaire/zodiacs/female/pisces.webp differ diff --git a/public/questionnaire/zodiacs/female/sagittarius.webp b/public/questionnaire/zodiacs/female/sagittarius.webp new file mode 100644 index 0000000..44e028b Binary files /dev/null and b/public/questionnaire/zodiacs/female/sagittarius.webp differ diff --git a/public/questionnaire/zodiacs/female/scorpio.webp b/public/questionnaire/zodiacs/female/scorpio.webp new file mode 100644 index 0000000..998e48b Binary files /dev/null and b/public/questionnaire/zodiacs/female/scorpio.webp differ diff --git a/public/questionnaire/zodiacs/female/taurus.webp b/public/questionnaire/zodiacs/female/taurus.webp new file mode 100644 index 0000000..9fe9126 Binary files /dev/null and b/public/questionnaire/zodiacs/female/taurus.webp differ diff --git a/public/questionnaire/zodiacs/female/virgo.webp b/public/questionnaire/zodiacs/female/virgo.webp new file mode 100644 index 0000000..9638355 Binary files /dev/null and b/public/questionnaire/zodiacs/female/virgo.webp differ diff --git a/public/questionnaire/zodiacs/gemini.webp b/public/questionnaire/zodiacs/gemini.webp new file mode 100644 index 0000000..b6ef13f Binary files /dev/null and b/public/questionnaire/zodiacs/gemini.webp differ diff --git a/public/questionnaire/zodiacs/leo.webp b/public/questionnaire/zodiacs/leo.webp new file mode 100644 index 0000000..0655aba Binary files /dev/null and b/public/questionnaire/zodiacs/leo.webp differ diff --git a/public/questionnaire/zodiacs/libra.webp b/public/questionnaire/zodiacs/libra.webp new file mode 100644 index 0000000..1661588 Binary files /dev/null and b/public/questionnaire/zodiacs/libra.webp differ diff --git a/public/questionnaire/zodiacs/male/aquarius.webp b/public/questionnaire/zodiacs/male/aquarius.webp new file mode 100755 index 0000000..c417d08 Binary files /dev/null and b/public/questionnaire/zodiacs/male/aquarius.webp differ diff --git a/public/questionnaire/zodiacs/male/aries.webp b/public/questionnaire/zodiacs/male/aries.webp new file mode 100755 index 0000000..5b6b0a5 Binary files /dev/null and b/public/questionnaire/zodiacs/male/aries.webp differ diff --git a/public/questionnaire/zodiacs/male/cancer.webp b/public/questionnaire/zodiacs/male/cancer.webp new file mode 100755 index 0000000..0d246fa Binary files /dev/null and b/public/questionnaire/zodiacs/male/cancer.webp differ diff --git a/public/questionnaire/zodiacs/male/capricorn.webp b/public/questionnaire/zodiacs/male/capricorn.webp new file mode 100755 index 0000000..68c73f4 Binary files /dev/null and b/public/questionnaire/zodiacs/male/capricorn.webp differ diff --git a/public/questionnaire/zodiacs/male/gemini.webp b/public/questionnaire/zodiacs/male/gemini.webp new file mode 100755 index 0000000..b6ef13f Binary files /dev/null and b/public/questionnaire/zodiacs/male/gemini.webp differ diff --git a/public/questionnaire/zodiacs/male/leo.webp b/public/questionnaire/zodiacs/male/leo.webp new file mode 100755 index 0000000..0655aba Binary files /dev/null and b/public/questionnaire/zodiacs/male/leo.webp differ diff --git a/public/questionnaire/zodiacs/male/libra.webp b/public/questionnaire/zodiacs/male/libra.webp new file mode 100755 index 0000000..1661588 Binary files /dev/null and b/public/questionnaire/zodiacs/male/libra.webp differ diff --git a/public/questionnaire/zodiacs/male/pisces.webp b/public/questionnaire/zodiacs/male/pisces.webp new file mode 100755 index 0000000..4df2cb3 Binary files /dev/null and b/public/questionnaire/zodiacs/male/pisces.webp differ diff --git a/public/questionnaire/zodiacs/male/sagittarius.webp b/public/questionnaire/zodiacs/male/sagittarius.webp new file mode 100755 index 0000000..a772e6f Binary files /dev/null and b/public/questionnaire/zodiacs/male/sagittarius.webp differ diff --git a/public/questionnaire/zodiacs/male/scorpio.webp b/public/questionnaire/zodiacs/male/scorpio.webp new file mode 100755 index 0000000..b9260bd Binary files /dev/null and b/public/questionnaire/zodiacs/male/scorpio.webp differ diff --git a/public/questionnaire/zodiacs/male/taurus.webp b/public/questionnaire/zodiacs/male/taurus.webp new file mode 100755 index 0000000..f429036 Binary files /dev/null and b/public/questionnaire/zodiacs/male/taurus.webp differ diff --git a/public/questionnaire/zodiacs/male/virgo.webp b/public/questionnaire/zodiacs/male/virgo.webp new file mode 100755 index 0000000..cea36bd Binary files /dev/null and b/public/questionnaire/zodiacs/male/virgo.webp differ diff --git a/public/questionnaire/zodiacs/pisces.webp b/public/questionnaire/zodiacs/pisces.webp new file mode 100644 index 0000000..4df2cb3 Binary files /dev/null and b/public/questionnaire/zodiacs/pisces.webp differ diff --git a/public/questionnaire/zodiacs/sagittarius.webp b/public/questionnaire/zodiacs/sagittarius.webp new file mode 100644 index 0000000..a772e6f Binary files /dev/null and b/public/questionnaire/zodiacs/sagittarius.webp differ diff --git a/public/questionnaire/zodiacs/scorpio.webp b/public/questionnaire/zodiacs/scorpio.webp new file mode 100644 index 0000000..b9260bd Binary files /dev/null and b/public/questionnaire/zodiacs/scorpio.webp differ diff --git a/public/questionnaire/zodiacs/taurus.webp b/public/questionnaire/zodiacs/taurus.webp new file mode 100644 index 0000000..f429036 Binary files /dev/null and b/public/questionnaire/zodiacs/taurus.webp differ diff --git a/public/questionnaire/zodiacs/virgo.webp b/public/questionnaire/zodiacs/virgo.webp new file mode 100644 index 0000000..cea36bd Binary files /dev/null and b/public/questionnaire/zodiacs/virgo.webp differ diff --git a/public/scalesHead.svg b/public/scalesHead.svg new file mode 100755 index 0000000..261655c --- /dev/null +++ b/public/scalesHead.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/scalesHeart.svg b/public/scalesHeart.svg new file mode 100755 index 0000000..0e3a5d3 --- /dev/null +++ b/public/scalesHeart.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/smiling_face_with_heart_eyes.png b/public/smiling_face_with_heart_eyes.png new file mode 100644 index 0000000..606ee56 Binary files /dev/null and b/public/smiling_face_with_heart_eyes.png differ diff --git a/public/smiling_face_with_smiling_eyes.png b/public/smiling_face_with_smiling_eyes.png new file mode 100644 index 0000000..3a5774f Binary files /dev/null and b/public/smiling_face_with_smiling_eyes.png differ diff --git a/public/sun.svg b/public/sun.svg new file mode 100644 index 0000000..437b5ed --- /dev/null +++ b/public/sun.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/thumbs_more_up.png b/public/thumbs_more_up.png new file mode 100644 index 0000000..5972685 Binary files /dev/null and b/public/thumbs_more_up.png differ diff --git a/public/two_halves_of_a_heart.webp b/public/two_halves_of_a_heart.webp new file mode 100644 index 0000000..f795760 Binary files /dev/null and b/public/two_halves_of_a_heart.webp differ diff --git a/public/umbrella.svg b/public/umbrella.svg new file mode 100644 index 0000000..a3ec38f --- /dev/null +++ b/public/umbrella.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/wink.png b/public/wink.png new file mode 100644 index 0000000..70ccd43 Binary files /dev/null and b/public/wink.png differ diff --git a/public/woman_feeding_baby.png b/public/woman_feeding_baby.png new file mode 100755 index 0000000..81cf1f4 Binary files /dev/null and b/public/woman_feeding_baby.png differ diff --git a/public/woman_gets_angry.webp b/public/woman_gets_angry.webp new file mode 100644 index 0000000..f59c289 Binary files /dev/null and b/public/woman_gets_angry.webp differ diff --git a/src/components/Answer/index.tsx b/src/components/Answer/index.tsx old mode 100644 new mode 100755 index 719175c..32efe87 --- a/src/components/Answer/index.tsx +++ b/src/components/Answer/index.tsx @@ -2,15 +2,36 @@ import { IAnswer } from "@/data"; import styles from "./styles.module.css"; interface IAnswerProps { + classNameContainer?: string; answer: IAnswer; + type?: "multiply" | "single" | "only-text-single"; + active?: boolean; onClick: () => void; } -function Answer({ answer, onClick }: IAnswerProps) { +function Answer({ + answer, + type = "single", + active, + classNameContainer = "", + onClick, +}: IAnswerProps) { return ( -
- {answer.id} +
+ {type !== "only-text-single" && ( + {answer.id} + )}

{answer.answer}

+ {type === "multiply" && ( +
+ {active && Check mark} +
+ )}
); } diff --git a/src/components/Answer/styles.module.css b/src/components/Answer/styles.module.css old mode 100644 new mode 100755 index 361279a..6243f62 --- a/src/components/Answer/styles.module.css +++ b/src/components/Answer/styles.module.css @@ -19,6 +19,16 @@ background: rgb(234, 238, 247); } +.container.active { + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); +} + .icon { width: 48px; height: 48px; @@ -29,3 +39,27 @@ line-height: 20px; color: #000; } + +.active .answer { + color: #fff; +} + +.circle { + background: rgb(251, 251, 255); + border: 1px solid rgb(224, 224, 224); + border-radius: 50%; + width: 24px; + height: 24px; + margin-left: auto; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; +} + +.circle > img { + display: block; + width: 14px; + height: 12px; +} diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx old mode 100644 new mode 100755 index 789ba1b..0f7ed0e --- a/src/components/App/index.tsx +++ b/src/components/App/index.tsx @@ -66,10 +66,25 @@ import GoalSetupPage from "../pages/GoalSetup"; import HyperPersonalizedAstrologyPage from "../pages/HyperPersonalizedAstrologyPage"; import NoBirthtimePage from "../pages/NoBirthtime"; import LoadingInRelationshipPage from "../pages/LoadingInRelationship"; -import WorksForUsPage from "../pages/WorksForUs"; +import QuestionnaireIntermediatePage from "../pages/QuestionnaireIntermediate"; import RelationshipAlmostTherePage from "../pages/RelationshipAlmostThere"; import Modal from "../Modal"; import FullDataModal from "../FullDataModal"; +import SingleZodiacInfoPage from "../pages/SingleZodiacInfo"; +import ProblemsPage from "../pages/Problems"; +import WorksRouterPage from "../pages/WorksRouter"; +import NotAlonePage from "../pages/NotAlone"; +import AlmostTherePage from "../pages/AlmostThere"; +import AllRightPage from "../pages/AllRight"; +import PartnerRightPlacePage from "../pages/PartnerRightPlace"; +import PartnerThingPage from "../pages/PartnerThing"; +import PartnerTotallyNormalPage from "../pages/PartnerTotallyNormal"; +import WithHeartPage from "../pages/WithHeart"; +import WithHeadPage from "../pages/WithHead"; +import BothPage from "../pages/Both"; +import RelationshipZodiacInfoPage from "../pages/RelationshipZodiacInfo"; +import Satisfied from "../pages/Satisfied"; +import AboutUsPage from "../pages/AboutUs"; function App(): JSX.Element { const [isSpecialOfferOpen, setIsSpecialOfferOpen] = useState(false); @@ -138,7 +153,7 @@ function App(): JSX.Element { useEffect(() => { if (!user) return; dispatch(actions.form.addEmail(user.email)); - }, []); + }, [dispatch, user]); return ( @@ -164,11 +179,54 @@ function App(): JSX.Element { path={routes.client.loadingInRelationship()} element={} /> - } /> + } + /> + } + /> + } + /> + } /> + } /> + } + /> } /> + } + /> + } /> + } + /> + } + /> + } + /> + } /> + } /> + } /> + } + /> + } /> + } /> {/* Test Routes End */} }> - }> - {/* }> + {/* } /> */} - } - /> - } - /> - - }> - } /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - } - /> - + } + /> + } + /> + + }> + } /> + } + /> + } + /> + } + /> + } + /> + } /> + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } /> diff --git a/src/components/AttentionPage/index.tsx b/src/components/AttentionPage/index.tsx old mode 100644 new mode 100755 diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx old mode 100644 new mode 100755 index f9172a9..82b501b --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -48,11 +48,16 @@ function Header({ }, [location.pathname, initialPath, isNavigated]); const goBack = () => { - if (initialPath && isNotEntrypoint(initialPath) && !isNavigated) { - navigate(routes.client.root()); - } else { - navigate(-1); + if ( + location.pathname.includes("/questionnaire") || + location.pathname.includes("/about-us") + ) { + return navigate(-1); } + if (initialPath && isNotEntrypoint(initialPath) && !isNavigated) { + return navigate(routes.client.root()); + } + return navigate(-1); }; return ( diff --git a/src/components/Stepper/index.tsx b/src/components/Stepper/index.tsx old mode 100644 new mode 100755 index 77c08c6..1d2d9f0 --- a/src/components/Stepper/index.tsx +++ b/src/components/Stepper/index.tsx @@ -1,5 +1,6 @@ import { IStep } from "@/data"; import styles from "./styles.module.css"; +import { useEffect, useState } from "react"; interface IStepperProps { steps: IStep[]; @@ -8,12 +9,71 @@ interface IStepperProps { } function Stepper({ steps, currentStep, currentQuestion }: IStepperProps) { - const lastStepIndex = steps.length - 1; + const [filterSteps, setFilterSteps] = useState(steps); + const [currentStepIndex, setCurrentStepIndex] = useState(currentStep); + const lastStepIndex = filterSteps.length - 1; + + useEffect(() => { + if ( + ![ + "relationship_pattern", + "relationships", + "personalityTraits", + "partnerProfile", + ].includes(steps[currentStep].id) + ) { + return setFilterSteps( + steps.filter( + (item) => + !["relationship_pattern", "personalityTraits"].includes(item.id) + ) + ); + } + if (steps[currentStep].id === "personalityTraits") { + return setFilterSteps( + steps.filter( + (item) => + !["relationship_pattern", "partnerProfile"].includes(item.id) + ) + ); + } + if (steps[currentStep].id === "partnerProfile") { + return setFilterSteps( + steps.filter( + (item) => !["relationships", "personalityTraits"].includes(item.id) + ) + ); + } + if (steps[currentStep].id === "relationship_pattern") { + return setFilterSteps( + steps.filter( + (item) => !["relationships", "personalityTraits"].includes(item.id) + ) + ); + } + if (steps[currentStep].id === "relationships") { + return setFilterSteps( + steps.filter( + (item) => + !["relationship_pattern", "personalityTraits"].includes(item.id) + ) + ); + } + }, [currentStep, steps]); + + useEffect(() => { + const idCurrentStep = steps[currentStep].id; + setCurrentStepIndex( + filterSteps.findIndex((step) => step.id === idCurrentStep) + ); + }, [currentStep, filterSteps, steps]); + const getLinePercent = (index: number) => { - if (index < currentStep) { + if (index < currentStepIndex) { return 100; - } else if (index === currentStep) { - const percent = (currentQuestion / steps[index].questions.length) * 100; + } else if (index === currentStepIndex) { + const percent = + (currentQuestion / filterSteps[index].questions.length) * 100; if (percent > 100) { return 100; } @@ -24,28 +84,28 @@ function Stepper({ steps, currentStep, currentQuestion }: IStepperProps) { }; const getIndexOfStep = (id: string) => { - return steps.findIndex((item) => item.id === id); + return filterSteps.findIndex((item) => item.id === id); }; return (
- {steps.map((step, index) => { + {filterSteps.map((step, index) => { return (
currentStep ? "transparent" : step.color, + index > currentStepIndex ? "transparent" : step.color, borderColor: step.color, color: step.color, }} > - {index > currentStep ? getIndexOfStep(step.id) : null} + {index > currentStepIndex ? getIndexOfStep(step.id) : null}
= currentStep ? "transparent" : "#bb6bd9", + lastStepIndex >= currentStepIndex ? "transparent" : "#bb6bd9", borderColor: "#bb6bd9", color: "#bb6bd9", }} > - {lastStepIndex >= currentStep ? lastStepIndex + 1 : null} + {lastStepIndex >= currentStepIndex ? lastStepIndex + 1 : null}
); diff --git a/src/components/pages/AboutUs/index.tsx b/src/components/pages/AboutUs/index.tsx new file mode 100755 index 0000000..a45d7bf --- /dev/null +++ b/src/components/pages/AboutUs/index.tsx @@ -0,0 +1,44 @@ +import { IAnswer, aboutUsAnswers } from "@/data"; +import styles from "./styles.module.css"; +import Title from "@/components/Title"; +import Answer from "@/components/Answer"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; + +function AboutUsPage() { + const navigate = useNavigate(); + const dispatch = useDispatch(); + + const handleClick = (answer: IAnswer) => { + dispatch( + actions.questionnaire.update({ + aboutUs: answer.id, + }) + ); + navigate(routes.client.priceList()); + }; + + return ( +
+ + Where did you hear about us? + + +
+ {aboutUsAnswers.map((answer, index) => ( + handleClick(answer)} + /> + ))} +
+
+ ); +} + +export default AboutUsPage; diff --git a/src/components/pages/AboutUs/styles.module.css b/src/components/pages/AboutUs/styles.module.css new file mode 100755 index 0000000..8a557cb --- /dev/null +++ b/src/components/pages/AboutUs/styles.module.css @@ -0,0 +1,36 @@ +.page { + position: relative; + height: fit-content; + min-height: calc(100vh - 50px); + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + background-position-y: bottom; + background-position-x: center; + background-size: cover; + background-repeat: no-repeat; + color: #fff; + padding-bottom: 64px; +} + +.title { + font-size: 24px; + line-height: 28px; + align-self: flex-start; + margin-bottom: 30px; + text-align: left; + color: rgb(51, 51, 51); +} + +.answers-container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; +} + +.answer-container { + justify-content: center; +} diff --git a/src/components/pages/AllRight/index.tsx b/src/components/pages/AllRight/index.tsx new file mode 100644 index 0000000..f33e4f3 --- /dev/null +++ b/src/components/pages/AllRight/index.tsx @@ -0,0 +1,52 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { selectors } from "@/store"; +import { useSelector } from "react-redux"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function AllRightPage() { + const navigate = useNavigate(); + const { birthdate } = useSelector(selectors.selectQuestionnaire); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/personalityTraits/attitude`); + }; + + return ( +
+ The sun +
+ + All right! <br /> You keep your emotions in check{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span>, but sometimes + people might want you to show more passion. We can give you some + insights about that! + +
+
+ + Back + + + Next + +
+
+ ); +} + +export default AllRightPage; diff --git a/src/components/pages/AllRight/styles.module.css b/src/components/pages/AllRight/styles.module.css new file mode 100644 index 0000000..73b6b97 --- /dev/null +++ b/src/components/pages/AllRight/styles.module.css @@ -0,0 +1,59 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: url("/laughing_women.webp"); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/AlmostThere/index.tsx b/src/components/pages/AlmostThere/index.tsx new file mode 100644 index 0000000..4c6649f --- /dev/null +++ b/src/components/pages/AlmostThere/index.tsx @@ -0,0 +1,49 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; + +function AlmostTherePage() { + const navigate = useNavigate(); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/relationship_pattern/priority`); + }; + + return ( +
+ The magnifier +
+ + Almost there! <br /> Now let's tailor your plan by understanding the{" "} + <span style={{ color: "#bb6cd9" }}>Relationship Pattern</span>. + +

+ Please take your time when answering. Each response is used to craft + your guidance plan. +

+
+
+ + Back + + + Next + +
+
+ ); +} + +export default AlmostTherePage; diff --git a/src/components/pages/AlmostThere/styles.module.css b/src/components/pages/AlmostThere/styles.module.css new file mode 100644 index 0000000..d1b9343 --- /dev/null +++ b/src/components/pages/AlmostThere/styles.module.css @@ -0,0 +1,59 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: url("/couple_and_sunset_2.webp"); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/Both/index.tsx b/src/components/pages/Both/index.tsx new file mode 100755 index 0000000..e3cce15 --- /dev/null +++ b/src/components/pages/Both/index.tsx @@ -0,0 +1,53 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function BothPage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(routes.client.aboutUs()); + }; + + return ( +
+ The both +
+ + Wonderful! <br /> + Based on our data, only the top 17% of{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span> people make + decisions with their heart and head. Using both in equal measure is + the key to feeling harmonious in your relationships. + +
+
+ + Back + + + Next + +
+
+ ); +} + +export default BothPage; diff --git a/src/components/pages/Both/styles.module.css b/src/components/pages/Both/styles.module.css new file mode 100755 index 0000000..2cb498b --- /dev/null +++ b/src/components/pages/Both/styles.module.css @@ -0,0 +1,65 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/LoadingInRelationship/index.tsx b/src/components/pages/LoadingInRelationship/index.tsx index d7d213b..0ec8731 100644 --- a/src/components/pages/LoadingInRelationship/index.tsx +++ b/src/components/pages/LoadingInRelationship/index.tsx @@ -32,7 +32,7 @@ function LoadingInRelationshipPage() { }, [loadingProgress]); const handleNext = () => { - navigate(`${routes.client.questionnaire()}/profile/relationshipProblem`); + navigate(routes.client.problems()); }; return ( diff --git a/src/components/pages/NotAlone/index.tsx b/src/components/pages/NotAlone/index.tsx new file mode 100644 index 0000000..b73401a --- /dev/null +++ b/src/components/pages/NotAlone/index.tsx @@ -0,0 +1,52 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { selectors } from "@/store"; +import { useSelector } from "react-redux"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function NotAlonePage() { + const navigate = useNavigate(); + const { birthdate } = useSelector(selectors.selectQuestionnaire); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/personalityTraits/attitude`); + }; + + return ( +
+ The starry key +
+ + You’re not alone. <br /> A lot of{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span> people find it + difficult to control emotions due to their zodiac sign traits. Don’t + worry, we know how to address that! + +
+
+ + Back + + + Next + +
+
+ ); +} + +export default NotAlonePage; diff --git a/src/components/pages/NotAlone/styles.module.css b/src/components/pages/NotAlone/styles.module.css new file mode 100644 index 0000000..b3f3a75 --- /dev/null +++ b/src/components/pages/NotAlone/styles.module.css @@ -0,0 +1,59 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: url("/company_and_sunset.webp"); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/PartnerRightPlace/index.tsx b/src/components/pages/PartnerRightPlace/index.tsx new file mode 100755 index 0000000..a95a54c --- /dev/null +++ b/src/components/pages/PartnerRightPlace/index.tsx @@ -0,0 +1,55 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function PartnerRightPlacePage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/relationships/appreciated`); + }; + + return ( +
+ The darts +
+ + You’ve come to the right place, <br /> + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span>! + +

+ Knowing that your goal is already doable puts you ahead. Let’s keep + going so we can build a guidance plan based on your astrological + blueprint. +

+
+
+ + Back + + + Next + +
+
+ ); +} + +export default PartnerRightPlacePage; diff --git a/src/components/pages/PartnerRightPlace/styles.module.css b/src/components/pages/PartnerRightPlace/styles.module.css new file mode 100755 index 0000000..2cb498b --- /dev/null +++ b/src/components/pages/PartnerRightPlace/styles.module.css @@ -0,0 +1,65 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/PartnerThing/index.tsx b/src/components/pages/PartnerThing/index.tsx new file mode 100755 index 0000000..a0e9deb --- /dev/null +++ b/src/components/pages/PartnerThing/index.tsx @@ -0,0 +1,56 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function PartnerThingPage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/relationships/appreciated`); + }; + + return ( +
+ The compass +
+ + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span>, here’s the + thing... <br /> + You can do this! + +

+ We'll start with small insights so it doesn't feel too overwhelming. + Let'skeep going and build a guidance plan based on your astrological + blueprint. +

+
+
+ + Back + + + Next + +
+
+ ); +} + +export default PartnerThingPage; diff --git a/src/components/pages/PartnerThing/styles.module.css b/src/components/pages/PartnerThing/styles.module.css new file mode 100755 index 0000000..0772a10 --- /dev/null +++ b/src/components/pages/PartnerThing/styles.module.css @@ -0,0 +1,66 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; + } + + .title { + font-size: 16px; + line-height: 28px; + max-width: 322px; + } + + .text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; + } + + .blue { + font-weight: bolder; + color: #56ccf2; + } + + .buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; + } + + .button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; + } + + .next-button { + background-color: #fff; + color: #6a3aa2; + } + \ No newline at end of file diff --git a/src/components/pages/PartnerTotallyNormal/index.tsx b/src/components/pages/PartnerTotallyNormal/index.tsx new file mode 100755 index 0000000..85498d7 --- /dev/null +++ b/src/components/pages/PartnerTotallyNormal/index.tsx @@ -0,0 +1,54 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function PartnerTotallyNormalPage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/relationships/appreciated`); + }; + + return ( +
+ The clouds +
+ + It’s totally normal to feel nervous,{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span>. + +

+ But we know you can do this. Let’s keep going so we can build a + guidance plan based on your astrological blueprint. +

+
+
+ + Back + + + Next + +
+
+ ); +} + +export default PartnerTotallyNormalPage; diff --git a/src/components/pages/PartnerTotallyNormal/styles.module.css b/src/components/pages/PartnerTotallyNormal/styles.module.css new file mode 100755 index 0000000..0772a10 --- /dev/null +++ b/src/components/pages/PartnerTotallyNormal/styles.module.css @@ -0,0 +1,66 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; + } + + .title { + font-size: 16px; + line-height: 28px; + max-width: 322px; + } + + .text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; + } + + .blue { + font-weight: bolder; + color: #56ccf2; + } + + .buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; + } + + .button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; + } + + .next-button { + background-color: #fff; + color: #6a3aa2; + } + \ No newline at end of file diff --git a/src/components/pages/Problems/index.tsx b/src/components/pages/Problems/index.tsx new file mode 100644 index 0000000..1b4f80b --- /dev/null +++ b/src/components/pages/Problems/index.tsx @@ -0,0 +1,179 @@ +import { useNavigate } from "react-router-dom"; +import styles from "./styles.module.css"; +import Stepper from "@/components/Stepper"; +import { useEffect, useState } from "react"; +import { IAnswer, IQuestion, relationshipAnswers, singleAnswers, stepsQuestionary } from "@/data"; +import Title from "@/components/Title"; +import Answer from "@/components/Answer"; +import routes from "@/routes"; +import { useDispatch, useSelector } from "react-redux"; +import { actions } from "@/store"; +import { selectQuestionnaire } from "@/store/questionnaire"; +import { getAge } from "@/services/date"; + +function ProblemsPage(): JSX.Element { + const question = "problems"; + const stepId = "profile"; + const navigate = useNavigate(); + const dispatch = useDispatch(); + const [currentStep, setCurrentStep] = useState(); + const [currentQuestion, setCurrentQuestion] = useState(); + const steps = stepsQuestionary.filter((item) => !!item.questions.length); + const [questionTitle, setQuestionTitle] = useState(""); + const [answers, setAnswers] = useState([]); + const questionsAnswers = useSelector(selectQuestionnaire); + const gender = + questionsAnswers.gender[0].toUpperCase() + questionsAnswers.gender.slice(1); + + useEffect(() => { + const flowChoice = questionsAnswers.flowChoice; + if (["relationship", "married"].includes(flowChoice)) { + return setAnswers(relationshipAnswers); + } + if (["single", "complicated", "other"].includes(flowChoice)) { + return setAnswers(singleAnswers); + } + }, [questionsAnswers.flowChoice]); + + useEffect(() => { + const flowChoice = questionsAnswers.flowChoice; + if (["relationship", "married"].includes(flowChoice)) { + return setQuestionTitle( + `${gender} in their ${getAge(questionsAnswers.birthdate)}s ${ + questionsAnswers.parent === "yes" && "who have children" + } need a slightly different approach to improve their relationship. Which statement best describes you?` + ); + } + if (["single", "complicated", "other"].includes(flowChoice)) { + return setQuestionTitle( + `Single ${gender} in their ${getAge(questionsAnswers.birthdate)}s ${ + questionsAnswers.parent === "yes" && "who have children" + } need a slightly different approach to find their perfect partner. But first, how did you feel in your last relationship?` + ); + } + }, [ + questionsAnswers.birthdate, + questionsAnswers.flowChoice, + gender, + questionsAnswers.parent, + ]); + + useEffect(() => { + const currentStepIndex = steps.findIndex((item) => item.id === stepId); + if (currentStepIndex === -1) return navigate(routes.client.notFound()); + setCurrentStep(currentStepIndex || 0); + const _currentQuestion = steps[currentStepIndex].questions.find( + (item) => item.id === question + ); + if (!_currentQuestion) return navigate(routes.client.gender()); + setCurrentQuestion(_currentQuestion); + }, [navigate, question, stepId, steps]); + + const answerClickHandler = (answer: IAnswer) => { + if (!stepId || !question) return; + const questionIndex = getIndexOfQuestion(question); + if (questionIndex === -1) return; + const currentStepIndex = steps.findIndex((item) => item.id === stepId); + + const questionsLength = steps[currentStepIndex].questions.length; + + const currentQuestion = steps[currentStepIndex].questions[questionIndex]; + + dispatch( + actions.questionnaire.update({ + [currentQuestion.id]: answer.id, + }) + ); + + if (answer.navigateToUrl?.length) { + return navigate(answer.navigateToUrl); + } + + if (currentQuestion.navigateToUrl?.length) { + return navigate(currentQuestion.navigateToUrl); + } + + if ( + currentStepIndex >= steps.length - 1 && + questionIndex >= questionsLength - 1 + ) { + return navigate(routes.client.priceList()); + } + + if (questionIndex < questionsLength - 1) { + return navigate( + `${routes.client.questionnaire()}/${steps[currentStepIndex].id}/${ + steps[currentStepIndex].questions[questionIndex + 1].id + }` + ); + } + + if ( + currentStepIndex < steps.length - 1 && + questionIndex >= questionsLength - 1 + ) { + return navigate( + `${routes.client.questionnaire()}/${steps[currentStepIndex + 1].id}/${ + steps[currentStepIndex + 1].questions[0].id + }` + ); + } + }; + + const getIndexOfQuestion = (questionId: string) => { + const currentStepIndex = steps.findIndex((item) => item.id === stepId); + if (currentStepIndex === -1) return -1; + return steps[currentStepIndex].questions.findIndex( + (item) => item.id === questionId + ); + }; + + return ( +
+ {currentQuestion && (!!currentStep || currentStep === 0) && ( + <> + + + {steps[currentStep].label} + + + {questionTitle} + + {!!currentQuestion.description && ( +

{currentQuestion.description}

+ )} +
+ {!currentQuestion.answersElement && + (currentQuestion.answers?.length + ? currentQuestion.answers + : answers + ).map((answer) => { + // if (!isShowAnswer(answer)) return null; + return ( + { + answerClickHandler(answer); + }} + /> + ); + })} + {!!currentQuestion.answersElement && currentQuestion.answersElement} +
+ + )} +
+ ); +} + +export default ProblemsPage; diff --git a/src/components/pages/Problems/styles.module.css b/src/components/pages/Problems/styles.module.css new file mode 100644 index 0000000..b323dfa --- /dev/null +++ b/src/components/pages/Problems/styles.module.css @@ -0,0 +1,52 @@ +.page { + position: relative; + height: fit-content; + min-height: calc(100vh - 50px); + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + background-position-y: bottom; + background-position-x: center; + background-size: cover; + background-repeat: no-repeat; + color: #fff; +} + +.current-step { + font-weight: 600; + font-size: 14px; + text-align: center; + color: rgb(142, 140, 240); + margin-top: 5px; + margin-bottom: 20px; + position: relative; +} + +.title { + font-size: 24px; + line-height: 28px; + align-self: flex-start; + margin-bottom: 30px; + text-align: left; + color: rgb(51, 51, 51); +} + +.answers-container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; +} + +.description { + font-size: 14px; + line-height: 24px; + font-weight: normal; + margin-top: -20px; + margin-bottom: 30px; + align-self: flex-start; + text-align: left; + color: rgb(79, 79, 79); +} diff --git a/src/components/pages/Questionnaire/CustomAnswers/Birthdate/index.tsx b/src/components/pages/Questionnaire/CustomAnswers/Birthdate/index.tsx old mode 100644 new mode 100755 index d1b7a69..0fa2dc4 --- a/src/components/pages/Questionnaire/CustomAnswers/Birthdate/index.tsx +++ b/src/components/pages/Questionnaire/CustomAnswers/Birthdate/index.tsx @@ -35,13 +35,11 @@ function BirthdateCustomAnswer({ const handleNext = () => { if (affiliation === "self") { dispatch(actions.questionnaire.update({ birthdate })); - navigate(`${routes.client.questionnaire()}/profile/isBirthTime`); + navigate(routes.client.singleZodiacInfo()); } if (affiliation === "partner") { dispatch(actions.questionnaire.update({ partnerBirthdate: birthdate })); - navigate( - `${routes.client.questionnaire()}/partnerProfile/partnerIsBirthTime` - ); + navigate(routes.client.relationshipZodiacInfo()); } }; diff --git a/src/components/pages/Questionnaire/CustomAnswers/MultipleAnswers/index.tsx b/src/components/pages/Questionnaire/CustomAnswers/MultipleAnswers/index.tsx new file mode 100755 index 0000000..e30f3c8 --- /dev/null +++ b/src/components/pages/Questionnaire/CustomAnswers/MultipleAnswers/index.tsx @@ -0,0 +1,65 @@ +import { IAnswer } from "@/data"; +import styles from "./styles.module.css"; +import Answer from "@/components/Answer"; +import { useState } from "react"; +import MainButton from "@/components/MainButton"; +import { useTranslation } from "react-i18next"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; + +interface IMultiplyAnswersProps { + answers: IAnswer[]; +} + +function MultiplyAnswers({ answers }: IMultiplyAnswersProps) { + const { t } = useTranslation(); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { currentlyAffecting } = useSelector(selectors.selectQuestionnaire); + const [selectedAnswers, setSelectedAnswers] = useState( + currentlyAffecting?.split("$") || [] + ); + + const handleClick = (answer: IAnswer) => { + if (selectedAnswers.includes(answer.id)) { + return setSelectedAnswers((prevState) => + prevState.filter((item) => item !== answer.id) + ); + } + return setSelectedAnswers((prevState) => [...prevState, answer.id]); + }; + + const handleNext = () => { + dispatch( + actions.questionnaire.update({ + currentlyAffecting: selectedAnswers.join("$"), + }) + ); + navigate(`${routes.client.questionnaire()}/relationships/partnerPriority`); + }; + + return ( + <> + {answers.map((answer, index) => ( + handleClick(answer)} + /> + ))} + + {t("next")} + + + ); +} + +export default MultiplyAnswers; diff --git a/src/components/pages/Questionnaire/CustomAnswers/MultipleAnswers/styles.module.css b/src/components/pages/Questionnaire/CustomAnswers/MultipleAnswers/styles.module.css new file mode 100755 index 0000000..fc42bac --- /dev/null +++ b/src/components/pages/Questionnaire/CustomAnswers/MultipleAnswers/styles.module.css @@ -0,0 +1,10 @@ +.button { + margin-top: 8px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); +} diff --git a/src/components/pages/Questionnaire/index.tsx b/src/components/pages/Questionnaire/index.tsx old mode 100644 new mode 100755 index d5d2038..eff3a34 --- a/src/components/pages/Questionnaire/index.tsx +++ b/src/components/pages/Questionnaire/index.tsx @@ -30,27 +30,6 @@ function QuestionnairePage(): JSX.Element { setCurrentQuestion(_currentQuestion); }, [navigate, question, stepId, steps]); - // useEffect(() => { - // if (!question) { - // navigate(routes.client.gender()); - // } - - // console.log(question); - - // const currentQuestionIndex = questions.findIndex( - // (item) => item.id === question - // ); - - // const _currentQuestion = questions[currentQuestionIndex]; - - // setCurrentQuestion(_currentQuestion); - // console.log(_currentQuestion); - - // if (!_currentQuestion) { - // navigate(routes.client.gender()); - // } - // }, [currentQuestion, navigate, question]); - const answerClickHandler = (answer: IAnswer) => { if (!stepId || !question) return; const questionIndex = getIndexOfQuestion(question); @@ -79,7 +58,7 @@ function QuestionnairePage(): JSX.Element { currentStepIndex >= steps.length - 1 && questionIndex >= questionsLength - 1 ) { - return navigate(routes.client.priceList()); + return navigate(routes.client.aboutUs()); } if (questionIndex < questionsLength - 1) { diff --git a/src/components/pages/QuestionnaireIntermediate/WorksForUsDescription/index.tsx b/src/components/pages/QuestionnaireIntermediate/WorksForUsDescription/index.tsx new file mode 100644 index 0000000..bdb5519 --- /dev/null +++ b/src/components/pages/QuestionnaireIntermediate/WorksForUsDescription/index.tsx @@ -0,0 +1,13 @@ +import styles from "../styles.module.css"; + +function WorksForUsDescription() { + return ( +

+ Now, we need some information about{" "} + Your Partner’s Profile to create the + astrological synastry blueprint between you and your partner. +

+ ); +} + +export default WorksForUsDescription; diff --git a/src/components/pages/QuestionnaireIntermediate/WorksTraitsDescription/index.tsx b/src/components/pages/QuestionnaireIntermediate/WorksTraitsDescription/index.tsx new file mode 100644 index 0000000..5a3b7d3 --- /dev/null +++ b/src/components/pages/QuestionnaireIntermediate/WorksTraitsDescription/index.tsx @@ -0,0 +1,12 @@ +import styles from "../styles.module.css"; + +function WorksTraitsDescription() { + return ( +

+ Now, we need some information about your{" "} + Personality Traits to dig deeper! +

+ ); +} + +export default WorksTraitsDescription; diff --git a/src/components/pages/QuestionnaireIntermediate/index.tsx b/src/components/pages/QuestionnaireIntermediate/index.tsx new file mode 100644 index 0000000..9728c0d --- /dev/null +++ b/src/components/pages/QuestionnaireIntermediate/index.tsx @@ -0,0 +1,68 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { textVariables } from "@/data"; + +function QuestionnaireIntermediatePage() { + const navigate = useNavigate(); + const { problems } = useSelector(selectors.selectQuestionnaire); + const path = window.location.href.split("/").pop(); + const backgroundImages = + textVariables[path as keyof typeof textVariables].backgroundImages; + const backgroundImage = + backgroundImages && backgroundImages[problems] + ? backgroundImages[problems] + : "/couple_holding_hands_1.webp"; + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + if (path === "works-traits") { + return navigate(`${routes.client.questionnaire()}/personalityTraits/relateToStatement`); + } + navigate(`${routes.client.questionnaire()}/partnerProfile/partnerGender`); + }; + + return ( +
+ The starry key +
+ {path && ( + + {textVariables[path as keyof typeof textVariables].titles[ + problems + ] || ""} + + )} + {textVariables[path as keyof typeof textVariables].description} +
+
+ + Back + + + Next + +
+
+ ); +} + +export default QuestionnaireIntermediatePage; diff --git a/src/components/pages/QuestionnaireIntermediate/styles.module.css b/src/components/pages/QuestionnaireIntermediate/styles.module.css new file mode 100644 index 0000000..2b294a6 --- /dev/null +++ b/src/components/pages/QuestionnaireIntermediate/styles.module.css @@ -0,0 +1,59 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: url("/couple_holding_hands_1.webp"); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/RelationshipZodiacInfo/index.tsx b/src/components/pages/RelationshipZodiacInfo/index.tsx new file mode 100755 index 0000000..e6842b6 --- /dev/null +++ b/src/components/pages/RelationshipZodiacInfo/index.tsx @@ -0,0 +1,98 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; +import { getRandomArbitrary } from "@/services/random-value"; +import { zodiacSignsCompatibility } from "@/data/zodiacSignsCompatibility"; +import { useMemo } from "react"; + +function RelationshipZodiacInfoPage() { + const navigate = useNavigate(); + const { gender, partnerGender, birthdate, partnerBirthdate } = useSelector( + selectors.selectQuestionnaire + ); + const [zodiacSign, partnerZodiacSign] = [ + getZodiacSignByDate(birthdate), + getZodiacSignByDate(partnerBirthdate), + ]; + const randomCompatibility = useMemo(() => { + const replaceValues = { + _gender_: gender, + _zodiacSign_: zodiacSign, + _partnerGender_: partnerGender, + _partnerZodiacSign_: partnerZodiacSign, + }; + + let result = + zodiacSignsCompatibility[ + getRandomArbitrary(0, zodiacSignsCompatibility.length) + ]; + + for (const key in replaceValues) { + result = result.replace( + key, + String(replaceValues[key as keyof typeof replaceValues]) + ); + } + + return result; + }, [gender, partnerGender, partnerZodiacSign, zodiacSign]); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate( + `${routes.client.questionnaire()}/partnerProfile/partnerIsBirthTime` + ); + }; + + return ( +
+
+ The zodiac signs + Plus + The zodiac signs +
+
+ + {partnerZodiacSign} {partnerGender}s + +

{randomCompatibility}

+
+
+ + So how compatible are you? + +

Let's go further and find out

+
+
+ + Back + + + Next + +
+
+ ); +} + +export default RelationshipZodiacInfoPage; diff --git a/src/components/pages/RelationshipZodiacInfo/styles.module.css b/src/components/pages/RelationshipZodiacInfo/styles.module.css new file mode 100755 index 0000000..01d4610 --- /dev/null +++ b/src/components/pages/RelationshipZodiacInfo/styles.module.css @@ -0,0 +1,104 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.image-container { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + gap: 32px; +} + +.image-container > img { + max-width: 118px; +} + +.compatibility-description-container { + color: rgb(255, 255, 255); + border-radius: 12px; + overflow: hidden; + padding: 10px 14px; + font-weight: 600; + background: rgba(234, 238, 247, 0.15); +} + +.text-container { + width: 100%; + border-radius: 12px; + overflow: hidden; + padding: 10px 14px; + font-weight: 600; + background: linear-gradient( + 95deg, + rgb(207, 139, 243) -16.49%, + rgb(167, 112, 239) -15.14%, + rgb(253, 185, 155) 115.23% + ); +} + +.title { + font-weight: 700; + font-size: 20px; + line-height: 28px; + max-width: 322px; + text-align: left; + margin: 0; +} + +.text { + font-size: 18px; + text-align: left; + line-height: 140%; + max-width: 322px; + margin-top: 8px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/Satisfied/index.tsx b/src/components/pages/Satisfied/index.tsx new file mode 100755 index 0000000..0052f73 --- /dev/null +++ b/src/components/pages/Satisfied/index.tsx @@ -0,0 +1,72 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { selectors } from "@/store"; +import { useSelector } from "react-redux"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function Satisfied() { + const navigate = useNavigate(); + const { birthdate, partnerBirthdate, satisfied } = useSelector( + selectors.selectQuestionnaire + ); + const [zodiacSign, partnerZodiacSign] = [ + getZodiacSignByDate(birthdate), + getZodiacSignByDate(partnerBirthdate), + ]; + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/relationships/emotionalConnection`); + }; + + return ( +
+ {`The +
+ {satisfied === "yes" && ( + + Well done! <br /> Based on our data only the top 30% of{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span> find it easy + to communicate with their{" "} + <span style={{ color: "#f2c94c" }}>{partnerZodiacSign}</span>{" "} + partner. + + )} + {satisfied !== "yes" && ( + + You’re not alone. <br /> Based on our data 74% of{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span> find it + difficult to communicate with their{" "} + <span style={{ color: "#f2c94c" }}>{partnerZodiacSign}</span>{" "} + partner. <br /> We can help you improve this. + + )} +
+
+ + Back + + + Next + +
+
+ ); +} + +export default Satisfied; diff --git a/src/components/pages/Satisfied/styles.module.css b/src/components/pages/Satisfied/styles.module.css new file mode 100755 index 0000000..35f7c37 --- /dev/null +++ b/src/components/pages/Satisfied/styles.module.css @@ -0,0 +1,59 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: url("/girl_talking.webp"); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/SingleZodiacInfo/index.tsx b/src/components/pages/SingleZodiacInfo/index.tsx new file mode 100644 index 0000000..ddc542c --- /dev/null +++ b/src/components/pages/SingleZodiacInfo/index.tsx @@ -0,0 +1,61 @@ +import { useSelector } from "react-redux"; +import styles from "./styles.module.css"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { IZodicSignsInfo, zodicSignsInfo } from "@/data"; +import Title from "@/components/Title"; +import MainButton from "@/components/MainButton"; + +function SingleZodiacInfoPage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectQuestionnaire).birthdate; + const gender = useSelector(selectors.selectQuestionnaire).gender; + const zodiac = getZodiacSignByDate(birthdate); + const zodiacInfo = zodicSignsInfo[gender as keyof IZodicSignsInfo].find( + (sign) => sign.name === zodiac + ); + + const image = zodiacInfo?.img; + + const handleNext = () => { + navigate(`${routes.client.questionnaire()}/profile/isBirthTime`); + }; + + const handleBack = () => { + navigate(-1); + }; + + return ( +
+ The image of the zodiac sign +
+ + {zodiac} {gender}s + +

{zodiacInfo?.description}

+
+
+ + Back + + + Next + +
+
+ ); +} + +export default SingleZodiacInfoPage; diff --git a/src/components/pages/SingleZodiacInfo/styles.module.css b/src/components/pages/SingleZodiacInfo/styles.module.css new file mode 100644 index 0000000..4ee023c --- /dev/null +++ b/src/components/pages/SingleZodiacInfo/styles.module.css @@ -0,0 +1,77 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + height: fit-content; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + color: #fff; + padding-top: 64px; +} + +.image { + height: 285px; +} + +.zodiac-info-container { + width: 100%; + color: rgb(255, 255, 255); + border-radius: 12px; + overflow: hidden; + padding: 10px 14px; + font-weight: 600; + background: rgba(234, 238, 247, 0.15); +} + +.title { + font-size: 18px; + line-height: 1.5; + font-weight: 700; + text-align: left; + margin: 0; +} + +.description { + margin-top: 4px; + font-size: 16px; + line-height: 1.5; + text-align: left; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/WithHead/index.tsx b/src/components/pages/WithHead/index.tsx new file mode 100755 index 0000000..44dcf56 --- /dev/null +++ b/src/components/pages/WithHead/index.tsx @@ -0,0 +1,52 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function WithHeadPage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(routes.client.aboutUs()); + }; + + return ( +
+ The scales +
+ + Based on our data, 39% of{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span> people also + make decisions with their head. But don't worry, we'll consider that + while creating your guidance plan. + +
+
+ + Back + + + Next + +
+
+ ); +} + +export default WithHeadPage; diff --git a/src/components/pages/WithHead/styles.module.css b/src/components/pages/WithHead/styles.module.css new file mode 100755 index 0000000..2cb498b --- /dev/null +++ b/src/components/pages/WithHead/styles.module.css @@ -0,0 +1,65 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/WithHeart/index.tsx b/src/components/pages/WithHeart/index.tsx new file mode 100755 index 0000000..946d9df --- /dev/null +++ b/src/components/pages/WithHeart/index.tsx @@ -0,0 +1,52 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import MainButton from "@/components/MainButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function WithHeartPage() { + const navigate = useNavigate(); + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + navigate(routes.client.aboutUs()); + }; + + return ( +
+ The scales +
+ + Based on our data, 49% of{" "} + <span style={{ color: "#f2c94c" }}>{zodiacSign}</span> people also + make decisions with their heart. But don't worry, we'll consider that + while creating your guidance plan. + +
+
+ + Back + + + Next + +
+
+ ); +} + +export default WithHeartPage; diff --git a/src/components/pages/WithHeart/styles.module.css b/src/components/pages/WithHeart/styles.module.css new file mode 100755 index 0000000..2cb498b --- /dev/null +++ b/src/components/pages/WithHeart/styles.module.css @@ -0,0 +1,65 @@ +.page { + position: relative; + height: fit-content; + min-height: 100vh; + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + gap: 40px; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ); + background-position-y: bottom; + background-position-x: center; + background-size: cover; + color: #fff; + padding-top: 64px; +} + +.title { + font-size: 16px; + line-height: 28px; + max-width: 322px; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 140%; + max-width: 322px; +} + +.blue { + font-weight: bolder; + color: #56ccf2; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; +} + +.button { + width: 160px; + min-width: fit-content; + height: 48px; + min-height: fit-content; + border: solid 1px #fff; + border-radius: 16px; + font-size: 18px; + font-weight: 500; + background-color: transparent; +} + +.next-button { + background-color: #fff; + color: #6a3aa2; +} diff --git a/src/components/pages/WorksRouter/index.tsx b/src/components/pages/WorksRouter/index.tsx new file mode 100644 index 0000000..b0efb10 --- /dev/null +++ b/src/components/pages/WorksRouter/index.tsx @@ -0,0 +1,14 @@ +import routes from "@/routes"; +import { selectors } from "@/store"; +import { useSelector } from "react-redux"; +import { Navigate } from "react-router-dom"; + +function WorksRouterPage() { + const { flowChoice } = useSelector(selectors.selectQuestionnaire); + if (["relationship", "married"].includes(flowChoice)) { + return ; + } + return ; +} + +export default WorksRouterPage; diff --git a/src/data.tsx b/src/data.tsx old mode 100644 new mode 100755 index 8dd5d24..8e10865 --- a/src/data.tsx +++ b/src/data.tsx @@ -3,6 +3,9 @@ import routes from "./routes"; import BirthdateCustomAnswer from "./components/pages/Questionnaire/CustomAnswers/Birthdate"; import BirthtimeCustomAnswer from "./components/pages/Questionnaire/CustomAnswers/Birthtime"; import BirthPlaceCustomAnswer from "./components/pages/Questionnaire/CustomAnswers/BirthPlace"; +import WorksForUsDescription from "./components/pages/QuestionnaireIntermediate/WorksForUsDescription"; +import WorksTraitsDescription from "./components/pages/QuestionnaireIntermediate/WorksTraitsDescription"; +import MultiplyAnswers from "./components/pages/Questionnaire/CustomAnswers/MultipleAnswers"; export const predictionMoonsPeriods: IPredictionMoon[] = [ { @@ -66,6 +69,137 @@ export interface IAnswer { navigateToUrl?: string; } +export const aboutUsAnswers: IAnswer[] = [ + { + id: "poster", + answer: "Poster or Billboard", + icon: "", + }, + { + id: "friend", + answer: "Friend or Family", + icon: "", + }, + { + id: "instagram", + answer: "Instagram", + icon: "", + }, + { + id: "direct_mail", + answer: "Direct Mail or Package Insert", + icon: "", + }, + { + id: "tv", + answer: "Online TV or Streaming TV", + icon: "", + }, + { + id: "radio", + answer: "Radio", + icon: "", + }, + { + id: "search_engine", + answer: "Search Engine (Google, Bing, etc.)", + icon: "", + }, + { + id: "newspaper", + answer: "Newspaper or Magazine", + icon: "", + }, + { + id: "facebook", + answer: "Facebook", + icon: "", + }, + { + id: "blog_post", + answer: "Blog Post or Website Review", + icon: "", + }, + { + id: "Podcast", + answer: "Podcast", + icon: "", + }, + { + id: "influencer", + answer: "Influencer", + icon: "", + }, + { + id: "youtube", + answer: "Youtube", + icon: "", + }, + { + id: "pinterest", + answer: "Pinterest", + icon: "", + }, + { + id: "other", + answer: "Other", + icon: "", + }, +]; + +const currentlyAffectingAnswers: IAnswer[] = [ + { + id: "infidelity", + answer: "Infidelity", + icon: "/broken_heart.png", + }, + { + id: "depression", + answer: "Depression", + icon: "/cloud.png", + }, + { + id: "low_sexual", + answer: "Low sexual desire", + icon: "/down_arrow.png", + }, + { + id: "poor_body", + answer: "Poor body image", + icon: "/neutral_face.png", + }, + { + id: "postpartum", + answer: "Postpartum depression", + icon: "/woman_feeding_baby.png", + }, + { + id: "anxiety", + answer: "Anxiety", + icon: "/anxious_face_with_sweat.png", + }, + { + id: "parenting_issues", + answer: "Parenting issues", + icon: "/family.png", + }, + { + id: "blended_family", + answer: "Blended family issues", + icon: "/jigsaw.png", + }, + { + id: "divorce", + answer: "Divorce is on the table", + icon: "/hourglass.png", + }, + { + id: "none_of_these", + answer: "None of these", + icon: "/cross_mark.png", + }, +]; + export const stepsQuestionary: IStep[] = [ { id: "profile", @@ -228,6 +362,7 @@ export const stepsQuestionary: IStep[] = [ question: "What's your date of birth?", answersElement: , backgroundImage: "/date_of_birth_zodiac_signs.webp", + navigateToUrl: routes.client.singleZodiacInfo(), }, { id: "isBirthTime", @@ -262,28 +397,262 @@ export const stepsQuestionary: IStep[] = [ answersElement: , backgroundImage: "/bunch_of_cards.webp", }, - // TODO: add more questions { - id: "relationshipProblem", - question: - "Male in their 20s who have children need a slightly different approach to improve their relationship. Which statement best describes you?", - navigateToUrl: routes.client.worksForUs(), + id: "problems", + question: "", + navigateToUrl: routes.client.worksRouter(), + answers: [], + }, + ], + }, + { + id: "personalityTraits", + label: "Personality traits", + color: "#56ccf2", + questions: [ + { + id: "relateToStatement", + question: "Do you relate to the statement below?", + description: + "“I really dislike being alone as much as I hate to admit it.”", answers: [ { - id: "very_unhappy", - answer: - "I’m very unhappy with how things are going in my relationship", - icon: "/slightly_frowning_face.png", + id: "yes", + answer: "Yes", + icon: "/check_mark_button.png", }, { - id: "unhappy", - answer: - "I’m unhappy with parts of my relationship, but some things are working well", + id: "no", + answer: "No", + icon: "/cross_mark.png", + }, + ], + }, + { + id: "notice", + question: "Do you tend to notice what’s wrong more than what’s right?", + answers: [ + { + id: "very_frequently", + answer: "Very frequently", + icon: "/thumbs_up.png", + }, + { + id: "frequently", + answer: "Frequently", + icon: "/thumbs_more_up.png", + }, + { + id: "occasionally", + answer: "Occasionally", + icon: "/thumbs_middle.png", + }, + { + id: "rarely", + answer: "Rarely", + icon: "/thumbs_more_down.png", + }, + { + id: "never", + answer: "Never", + icon: "/thumbs_down.png", + }, + ], + }, + { + id: "sensitive", + question: "Are you sensitive to criticism?", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/thumbs_up.png", + }, + { + id: "sometimes", + answer: "Sometimes", + icon: "/thumbs_more_up.png", + }, + { + id: "rarely", + answer: "Rarely", + icon: "/thumbs_more_down.png", + }, + { + id: "not_all", + answer: "Not at all", + icon: "/thumbs_down.png", + }, + ], + }, + { + id: "tendToOverthink", + question: "Do you tend to overthink?", + backgroundImage: "/girl_thinking.webp", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/check_mark_button.png", + }, + { + id: "no", + answer: "No", + icon: "/cross_mark.png", + }, + ], + }, + { + id: "mostImportant", + question: "What is most important to you?", + answers: [ + { + id: "success", + answer: "Success", + icon: "/bar_chart.png", + }, + { + id: "romance", + answer: "Romance", + icon: "/two-hearts.png", + }, + { + id: "stability", + answer: "Stability", + icon: "/scales.png", + }, + { + id: "freedom", + answer: "Freedom", + icon: "/airplane.png", + }, + { + id: "happiness", + answer: "Happiness", + icon: "/star_struck.png", + }, + { + id: "health", + answer: "Health", + icon: "/flexed_biceps.png", + }, + { + id: "all", + answer: "All above", + icon: "/check_mark_button.png", + }, + ], + }, + { + id: "emotionalControl", + question: "Is emotional control tricky for you?", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/thumbs_up.png", + navigateToUrl: routes.client.notAlone(), + }, + { + id: "sometimes", + answer: "Sometimes", + icon: "/thumbs_more_up.png", + navigateToUrl: routes.client.notAlone(), + }, + { + id: "rarely", + answer: "Rarely", + icon: "/thumbs_more_down.png", + navigateToUrl: routes.client.allRight(), + }, + { + id: "not_all", + answer: "Not at all", + icon: "/thumbs_down.png", + navigateToUrl: routes.client.allRight(), + }, + ], + }, + { + id: "attitude", + question: "Do you love your job?", + answers: [ + { + id: "yes", + answer: "Yes! I do something I love", + icon: "/smiling_face_with_heart_eyes.png", + }, + { + id: "not_working", + answer: "I’m not working", + icon: "/smiling_face_with_heart_eyes.png", + }, + { + id: "hate", + answer: "I hate my job", + icon: "/pleading_face.png", + }, + { + id: "okay", + answer: "It’s okay, it pays the bills", + icon: "/slightly_smiling_face.png", + }, + { + id: "underpaid", + answer: "I’m underpaid", + icon: "/face_with_raised_eyebrow.png", + }, + { + id: "stopped_growing", + answer: "I have stopped growing professionally", + icon: "/neutral_face.png", + }, + ], + }, + { + id: "want", + question: "Do you always know exactly what you want?", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/slightly_smiling_face.png", + }, + { + id: "no", + answer: "No", + icon: "/confused.png", + }, + { + id: "not_shure", + answer: "Not shure", + icon: "/neutral_face.png", + }, + ], + }, + { + id: "relaxing", + question: "Do you have trouble relaxing?", + navigateToUrl: routes.client.almostThere(), + answers: [ + { + id: "not_all", + answer: "Not at all", + icon: "/smiling_face_with_smiling_eyes.png", + }, + { + id: "yes", + answer: "Yes", + icon: "/confused.png", + }, + { + id: "sometimes", + answer: "Sometimes", icon: "/neutral_face.png", }, { - id: "happy", - answer: "I’m generally happy in my relationship", + id: "rarely", + answer: "Rarely", icon: "/slightly_smiling_face.png", }, ], @@ -317,6 +686,7 @@ export const stepsQuestionary: IStep[] = [ answersElement: , backgroundImage: "/date_of_birth_zodiac_signs.webp", }, + // TODO: add compatibility page { id: "partnerIsBirthTime", question: "Do you know your partner’s time of birth?", @@ -390,7 +760,12 @@ export const stepsQuestionary: IStep[] = [ }, ], }, - // TODO: add more questions + { + id: "currentlyAffecting", + question: + "Are any of these factors currently affecting your relationship?", + answersElement: , + }, { id: "partnerPriority", question: "Do you agree with the statement below?", @@ -433,15 +808,16 @@ export const stepsQuestionary: IStep[] = [ id: "yes", answer: "Yes", icon: "/check_mark_button.png", + navigateToUrl: routes.client.satisfiedResult(), }, { id: "no", answer: "No", icon: "/cross_mark.png", + navigateToUrl: routes.client.satisfiedResult(), }, ], }, - // TODO: add more questions { id: "emotionalConnection", question: "Do you agree with the statement below?", @@ -475,7 +851,6 @@ export const stepsQuestionary: IStep[] = [ }, ], }, - // TODO: add more questions { id: "bigPicture", question: @@ -522,6 +897,7 @@ export const stepsQuestionary: IStep[] = [ { id: "irritated", question: "Does your partner get angry or irritated easily?", + backgroundImage: "/birds_squabble.webp", answers: [ { id: "yes", @@ -580,21 +956,25 @@ export const stepsQuestionary: IStep[] = [ id: "optimistic", answer: "Optimistic! They are totally doable, with some guidance.", icon: "/slightly_smiling_face.png", + navigateToUrl: routes.client.partnerRightPlace(), }, { id: "cautious", answer: "Cautious. I’ve struggled before, but I’m hopeful.", icon: "/unamused.png", + navigateToUrl: routes.client.partnerThing(), }, { id: "feeling", answer: "I’m feeling a little anxious, honestly.", icon: "/anxious_face_with_sweat.png", + navigateToUrl: routes.client.partnerTotallyNormal(), }, { id: "not_shure", answer: "Not sure / Don’t know", icon: "/thinking_face.png", + navigateToUrl: routes.client.partnerTotallyNormal(), }, ], }, @@ -638,19 +1018,593 @@ export const stepsQuestionary: IStep[] = [ id: "heart", answer: "Heart", icon: "/red-heart.png", + navigateToUrl: routes.client.withHeart(), }, { id: "head", answer: "Head", icon: "/brain.png", + navigateToUrl: routes.client.withHead(), }, { id: "both", answer: "Both", icon: "/paperclip.png", + navigateToUrl: routes.client.both(), + }, + ], + }, + ], + }, + { + id: "relationship_pattern", + label: "Relationship Pattern", + color: "#bb6bd9", + questions: [ + { + id: "priority", + question: "Do you agree with the statement below?", + description: "“When I am in a relationship, sex is a priority.“", + backgroundImage: "/couple_in_bad_1.webp", + answers: [ + { + id: "strongly_agree", + answer: "Strongly agree", + icon: "/raising_hands.png", + }, + { + id: "agree", + answer: "Agree", + icon: "/thumbs_up.png", + }, + { + id: "neutral", + answer: "Neutral", + icon: "/thumbs_middle.png", + }, + { + id: "disagree", + answer: "Disagree", + icon: "/thumbs_more_down.png", + }, + { + id: "strongly_disagree", + answer: "Strongly disagree", + icon: "/thumbs_down.png", + }, + ], + }, + { + id: "comfortable", + question: "Do you agree with the statement below?", + description: "“I feel comfortable around people I barely know.“", + answers: [ + { + id: "strongly_agree", + answer: "Strongly agree", + icon: "/raising_hands.png", + }, + { + id: "agree", + answer: "Agree", + icon: "/thumbs_up.png", + }, + { + id: "neutral", + answer: "Neutral", + icon: "/thumbs_middle.png", + }, + { + id: "disagree", + answer: "Disagree", + icon: "/thumbs_more_down.png", + }, + { + id: "strongly_disagree", + answer: "Strongly disagree", + icon: "/thumbs_down.png", + }, + ], + }, + { + id: "goodEnough", + question: "Do you often worry that you’re not good enough?", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/thumbs_up.png", + }, + { + id: "sometimes", + answer: "Sometimes", + icon: "/thumbs_middle.png", + }, + { + id: "rarely", + answer: "Rarely", + icon: "/thumbs_more_down.png", + }, + { + id: "not_all", + answer: "Not at all", + icon: "/thumbs_down.png", + }, + ], + }, + { + id: "angry", + question: "Do you easily get angry or irritated?", + backgroundImage: "/woman_gets_angry.webp", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/face_with_raised_eyebrow.png", + }, + { + id: "sometimes", + answer: "Sometimes", + icon: "/thinking_face.png", + }, + { + id: "rarely", + answer: "Rarely", + icon: "/neutral_face.png", + }, + { + id: "not_all", + answer: "Not at all", + icon: "/slightly_smiling_face.png", + }, + ], + }, + { + id: "innerSelf", + question: "Do you share your inner self with people you like?", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/thumbs_up.png", + }, + { + id: "no", + answer: "No", + icon: "/thumbs_down.png", + }, + { + id: "not_sure", + answer: "Not sure", + icon: "/neutral_face.png", + }, + ], + }, + { + id: "aboutPeople", + question: + "Do you remember small details about the people who are important to you?", + answers: [ + { + id: "yes", + answer: "Yes", + icon: "/raising_hands.png", + }, + { + id: "sometimes", + answer: "Sometimes", + icon: "/slightly_smiling_face.png", + }, + { + id: "rarely", + answer: "Rarely", + icon: "/thinking_face.png", + }, + { + id: "not_all", + answer: "Not at all", + icon: "/thumbs_down.png", + }, + ], + }, + { + id: "idealDate", + question: "What is your ideal date?", + answers: [ + { + id: "dinner", + answer: "Dinner at a fancy restaurant", + icon: "/fork_and_knife_with_plate.png", + }, + { + id: "nature", + answer: "A hike in nature", + icon: "/mountain.png", + }, + { + id: "talking", + answer: "Talking under the stars", + icon: "/cityscape_at_dusk.png", + }, + { + id: "walk", + answer: "A walk in the park", + icon: "/national_park.png", + }, + { + id: "skydiving", + answer: "Skydiving", + icon: "/parachute.png", + }, + ], + }, + { + id: "futurePartner", + question: + "Would you describe your future partner as detail-oriented or a big-picture person?", + answers: [ + { + id: "detail", + answer: "Detail-oriented", + icon: "/microscope.png", + }, + { + id: "big_picture", + answer: "Big picture", + icon: "/mountain.png", + }, + { + id: "both", + answer: "A bit of both", + icon: "/paperclip.png", + }, + ], + }, + { + id: "idealPartner", + question: "Is your ideal partner an introvert or extrovert?", + answers: [ + { + id: "introvert", + answer: "Introvert", + icon: "/blue_book.png", + }, + { + id: "extrovert", + answer: "Extrovert", + icon: "/party_popper.png", + }, + { + id: "both", + answer: "A bit of both", + icon: "/scales.png", + }, + ], + }, + { + id: "relationshipGoal", + question: "When you think about your relationship goals, you feel...?", + answers: [ + { + id: "optimistic", + answer: "Optimistic! They are totally doable, with some guidance.", + icon: "/slightly_smiling_face.png", + navigateToUrl: routes.client.partnerRightPlace(), + }, + { + id: "cautious", + answer: "Cautious. I’ve struggled before, but I’m hopeful.", + icon: "/unamused.png", + navigateToUrl: routes.client.partnerThing(), + }, + { + id: "anxious", + answer: "I’m feeling a little anxious, honestly.", + icon: "/anxious_face_with_sweat.png", + navigateToUrl: routes.client.partnerTotallyNormal(), + }, + { + id: "not_sure", + answer: "Not sure / Don’t know", + icon: "/thinking_face.png", + navigateToUrl: routes.client.partnerTotallyNormal(), }, ], }, ], }, ]; + +interface IZodicSignInfo { + name: string; + img: string; + description: string; +} + +export interface IZodicSignsInfo { + male: IZodicSignInfo[]; + female: IZodicSignInfo[]; +} + +export const zodicSignsInfo: IZodicSignsInfo = { + male: [ + { + name: "Capricorn", + img: "/questionnaire/zodiacs/male/capricorn.webp", + description: + "The Capricorn male, with mountain goat tenacity, climbs life's peaks with disciplined dedication.", + }, + { + name: "Aquarius", + img: "/questionnaire/zodiacs/male/aquarius.webp", + description: + "Revolutionary in thought, the Aquarius male breaks boundaries, envisioning a brighter, unconventional tomorrow.", + }, + { + name: "Pisces", + img: "/questionnaire/zodiacs/male/pisces.webp", + description: + "Dreamy and empathetic, the Pisces male navigates realms of emotion, often expressing his soul through artistry.", + }, + { + name: "Aries", + img: "/questionnaire/zodiacs/male/aries.webp", + description: + "The Aries male charges forward with unparalleled energy, always ready to conquer new frontiers.", + }, + { + name: "Taurus", + img: "/questionnaire/zodiacs/male/taurus.webp", + description: + "The Taurus male values stability, often displaying a potent mix of resilience and sensuality.", + }, + { + name: "Gemini", + img: "/questionnaire/zodiacs/male/gemini.webp", + description: + "Ever-curious, the Gemini male is a whirlwind of ideas, often switching between topics with excitement.", + }, + { + name: "Cancer", + img: "/questionnaire/zodiacs/male/cancer.webp", + description: + "Deeply intuitive, the Cancer male guards his emotional realm, drawing strength from familial bonds.", + }, + { + name: "Leo", + img: "/questionnaire/zodiacs/male/leo.webp", + description: + "With his regal demeanor, the Leo male has a magnetic charisma that demands the spotlight.", + }, + { + name: "Virgo", + img: "/questionnaire/zodiacs/male/virgo.webp", + description: + "With an eye for detail, the Virgo male seeks perfection, often being the methodical problem solver in the room.", + }, + { + name: "Libra", + img: "/questionnaire/zodiacs/male/libra.webp", + description: + "Driven by harmony, the Libra male gracefully balances life's challenges, always seeking the middle ground.", + }, + { + name: "Scorpio", + img: "/questionnaire/zodiacs/male/scorpio.webp", + description: + "The Scorpio male delves deep, with an intensity that can unravel life's mysteries, driven by passion and determination.", + }, + { + name: "Sagittarius", + img: "/questionnaire/zodiacs/male/sagittarius.webp", + description: + "With wanderlust in his heart, the Sagittarius male chases knowledge and adventure, ever the eternal optimist.", + }, + ], + female: [ + { + name: "Capricorn", + img: "/questionnaire/zodiacs/female/capricorn.webp", + description: + "Grounded and wise, the Capricorn female stands as a pillar of resilience, merging ambition with purpose.", + }, + { + name: "Aquarius", + img: "/questionnaire/zodiacs/female/aquarius.webp", + description: + "The Aquarius female, with her avant-garde spirit, dances to her own rhythm, forever championing innovation.", + }, + { + name: "Pisces", + img: "/questionnaire/zodiacs/female/pisces.webp", + description: + "Ethereal and compassionate, the Pisces female feels deeply, weaving tales of romance and magic in her wake.", + }, + { + name: "Aries", + img: "/questionnaire/zodiacs/female/aries.webp", + description: + "Radiating confidence, the Aries female often leads the pack, fueled by ambition and determination.", + }, + { + name: "Taurus", + img: "/questionnaire/zodiacs/female/taurus.webp", + description: + "Grounded and graceful, the Taurus female appreciates the beauty and luxury in life, always seeking comfort.", + }, + { + name: "Gemini", + img: "/questionnaire/zodiacs/female/gemini.webp", + description: + "Sparkling with wit, the Gemini female charms with her versatility, constantly adapting to change.", + }, + { + name: "Cancer", + img: "/questionnaire/zodiacs/female/cancer.webp", + description: + "The nurturing spirit of a Cancer female creates an embracing cocoon of comfort for loved ones.", + }, + { + name: "Leo", + img: "/questionnaire/zodiacs/female/leo.webp", + description: + "Vibrant and confident, the Leo female radiates warmth, ruling her domain with generosity and grace.", + }, + { + name: "Virgo", + img: "/questionnaire/zodiacs/female/virgo.webp", + description: + "Discerning and diligent, the Virgo female navigates life with analytical prowess and a pure heart.", + }, + { + name: "Libra", + img: "/questionnaire/zodiacs/female/libra.webp", + description: + "Charm personified, the Libra female is the embodiment of elegance, wielding diplomacy with an artful touch.", + }, + { + name: "Scorpio", + img: "/questionnaire/zodiacs/female/scorpio.webp", + description: + "The enigmatic Scorpio female possesses a magnetic allure, her depths veiling strength and vulnerability.", + }, + { + name: "Sagittarius", + img: "/questionnaire/zodiacs/female/sagittarius.webp", + description: + "Vivacious and free-spirited, the Sagittarius female journeys through life, spreading joy and infectious enthusiasm.", + }, + ], +}; + +interface ITextVariables { + [key: string]: { + backgroundImages?: { + [key: string]: string; + }; + titles: { + [key: string]: JSX.Element | string; + }; + description: JSX.Element | string; + }; +} + +export const textVariables: ITextVariables = { + "works-for-us": { + titles: { + very_unhappy: + "We’ve got you covered! We’ll start with small, personalized insights into you and your partner’s personality traits.", + unhappy: + "You’re probably doing better than you think! We’ll help you identify how to improve and stick with it.", + happy: `Wonderful! + Let's find out what's working (and what isn’t) and go from + there.`, + }, + backgroundImages: { + happy: "/couple_in_bad_2.webp", + }, + description: , + }, + "works-traits": { + titles: { + very_unhappy: + "To find out what works for us, we often need to understand what doesn't. We’ll give you insights on how to build a happy and lasting relationship with your new partner.", + unhappy: + "To find out what works for us, we often need to understand what doesn't. We’ll give you insights on how to build a happy and lasting relationship with your new partner.", + happy: + "Sometimes that happens and you need to move on! We'll give you insights on how to build a long lasting relationship with your next partner.", + never_been: + "Well, exciting times ahead! We'll give you insights about your most compatible partner.", + }, + backgroundImages: { + never_been: "/two_halves_of_a_heart.webp", + }, + description: , + }, + "not-alone": { + titles: { + yes: ( + <> + You’re not alone.
A lot of{" "} + $zodiac people find it + difficult to control emotions due to their zodiac sign traits. Don’t + worry, we know how to address that! + + ), + sometimes: ( + <> + You’re not alone.
A lot of{" "} + $zodiac people find it + difficult to control emotions due to their zodiac sign traits. Don’t + worry, we know how to address that! + + ), + rarely: ( + <> + All right!
You keep your emotions in check{" "} + $zodiac, but sometimes + people might want you to show more passion. We can give you some + insights about that! + + ), + not_all: ( + <> + All right!
You keep your emotions in check{" "} + $zodiac, but sometimes + people might want you to show more passion. We can give you some + insights about that! + + ), + }, + description: "", + backgroundImages: { + yes: "/company_and_sunset.webp", + sometimes: "/company_and_sunset.webp", + rarely: "/laughing_women.webp", + not_all: "/laughing_women.webp", + }, + }, +}; + +export const relationshipAnswers: IAnswer[] = [ + { + id: "very_unhappy", + answer: "I’m very unhappy with how things are going in my relationship", + icon: "/slightly_frowning_face.png", + }, + { + id: "unhappy", + answer: + "I’m unhappy with parts of my relationship, but some things are working well", + icon: "/neutral_face.png", + }, + { + id: "happy", + answer: "I’m generally happy in my relationship", + icon: "/slightly_smiling_face.png", + }, +]; + +export const singleAnswers: IAnswer[] = [ + { + id: "very_unhappy", + answer: "I was unhappy with low things were going in my relationship", + icon: "/slightly_frowning_face.png", + }, + { + id: "unhappy", + answer: + "I was unhappy with parts of my relationship, but some thing were working", + icon: "/neutral_face.png", + }, + { + id: "happy", + answer: "I was generally happy with my relationship", + icon: "/slightly_smiling_face.png", + }, + { + id: "never_been", + answer: "I’ve never been in a relationship", + icon: "/wink.png", + }, +]; diff --git a/src/data/zodiacSignsCompatibility.ts b/src/data/zodiacSignsCompatibility.ts new file mode 100755 index 0000000..0ee3a45 --- /dev/null +++ b/src/data/zodiacSignsCompatibility.ts @@ -0,0 +1,7 @@ +export const zodiacSignsCompatibility = [ + "In the celestial orchestra, the notes played by a _gender_s _zodiacSign_ and a _partnerGender_s _partnerZodiacSign_ create a melody of their own.", + "Each interaction between a _gender_s _zodiacSign_ and a _partnerGender_s _partnerZodiacSign_ weaves a new starry tale.", + "The stars shimmer differently when a _gender_s _zodiacSign_ aligns paths with a _partnerGender_s _partnerZodiacSign_.", + "The astral energies of a _gender_s _zodiacSign_ merge uniquely with those of a _partnerGender_s _partnerZodiacSign_.", + "The astral realms take notice when a _gender_s _zodiacSign_ and a _partnerGender_s _partnerZodiacSign_ form a connection." +]; diff --git a/src/routes.ts b/src/routes.ts old mode 100644 new mode 100755 index 1a98043..d49f354 --- a/src/routes.ts +++ b/src/routes.ts @@ -50,9 +50,25 @@ const routes = { [host, "hyper-personalized-astrology"].join("/"), noTime: () => [host, "no-time"].join("/"), loadingInRelationship: () => [host, "loading-in-relationship"].join("/"), + worksRouter: () => [host, "works-router"].join("/"), worksForUs: () => [host, "works-for-us"].join("/"), + worksTraits: () => [host, "works-traits"].join("/"), relationshipAlmostThere: () => [host, "relationship-almost-there"].join("/"), + singleZodiacInfo: () => [host, "single-zodiac-info"].join("/"), + problems: () => [host, "problems"].join("/"), + notAlone: () => [host, "not-alone"].join("/"), + allRight: () => [host, "all-right"].join("/"), + almostThere: () => [host, "almost-there"].join("/"), + partnerRightPlace: () => [host, "partner-right-place"].join("/"), + partnerThing: () => [host, "partner-thing"].join("/"), + partnerTotallyNormal: () => [host, "partner-totally-normal"].join("/"), + withHeart: () => [host, "with-heart"].join("/"), + withHead: () => [host, "with-head"].join("/"), + both: () => [host, "both"].join("/"), + relationshipZodiacInfo: () => [host, "relationship-zodiac-info"].join("/"), + satisfiedResult: () => [host, "satisfied-result"].join("/"), + aboutUs: () => [host, "about-us"].join("/"), notFound: () => [host, "404"].join("/"), }, server: { @@ -181,6 +197,20 @@ export const withoutFooterRoutes = [ routes.client.loadingInRelationship(), routes.client.worksForUs(), routes.client.relationshipAlmostThere(), + routes.client.singleZodiacInfo(), + routes.client.worksTraits(), + routes.client.notAlone(), + routes.client.allRight(), + routes.client.almostThere(), + routes.client.partnerRightPlace(), + routes.client.partnerThing(), + routes.client.partnerTotallyNormal(), + routes.client.withHeart(), + routes.client.withHead(), + routes.client.both(), + routes.client.relationshipZodiacInfo(), + routes.client.satisfiedResult(), + routes.client.aboutUs(), ]; export const withoutFooterPartOfRoutes = [routes.client.questionnaire()]; @@ -226,6 +256,19 @@ export const withoutHeaderRoutes = [ routes.client.loadingInRelationship(), routes.client.worksForUs(), routes.client.relationshipAlmostThere(), + routes.client.singleZodiacInfo(), + routes.client.worksTraits(), + routes.client.notAlone(), + routes.client.allRight(), + routes.client.almostThere(), + routes.client.partnerRightPlace(), + routes.client.partnerThing(), + routes.client.partnerTotallyNormal(), + routes.client.withHeart(), + routes.client.withHead(), + routes.client.both(), + routes.client.relationshipZodiacInfo(), + routes.client.satisfiedResult(), ]; export const hasNoHeader = (path: string) => { return !withoutHeaderRoutes.includes(`/${path.split("/")[1]}`); diff --git a/src/services/date/index.ts b/src/services/date/index.ts index 5150550..aa3fed7 100644 --- a/src/services/date/index.ts +++ b/src/services/date/index.ts @@ -8,8 +8,19 @@ export const getDateAsString = (date: Date | IDate | string): string => { if (date instanceof Date) { return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; } - if (typeof date === 'string') { + if (typeof date === "string") { return date; } return `${date.year}-${date.month}-${date.day}`; }; + +export const getAge = (date: Date | string) => { + const today = new Date(); + const birthDate = new Date(date); + let age = today.getFullYear() - birthDate.getFullYear(); + const m = today.getMonth() - birthDate.getMonth(); + if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { + age--; + } + return age; +}; diff --git a/src/store/questionnaire.ts b/src/store/questionnaire.ts old mode 100644 new mode 100755 index a1f3ee4..35f9491 --- a/src/store/questionnaire.ts +++ b/src/store/questionnaire.ts @@ -2,6 +2,7 @@ import { createSlice, createSelector } from "@reduxjs/toolkit"; import type { PayloadAction } from "@reduxjs/toolkit"; export interface IQuestionnaire { + // profile gender: string; flowChoice: string; goal: string; @@ -11,12 +12,26 @@ export interface IQuestionnaire { isBirthTime: string; birthtime: string; birthPlace: string; - relationshipProblem: string; + problems: string; + // personality traits + relateToStatement: string; + notice: string; + sensitive: string; + tendToOverthink: string; + mostImportant: string; + emotionalControl: string; + attitude: string; + want: string; + relaxing: string; + // partner partnerGender: string; partnerBirthdate: string; + partnerIsBirthTime: string; partnerBirthtime: string; partnerBirthPlace: string; + // relationships issueTogether: string; + currentlyAffecting: string; partnerPriority: string; satisfied: string; emotionalConnection: string; @@ -27,6 +42,19 @@ export interface IQuestionnaire { aboutGoals: string; appreciated: string; decisions: string; + // relationship_pattern + priority: string; + comfortable: string; + goodEnough: string; + angry: string; + innerSelf: string; + aboutPeople: string; + idealDate: string; + futurePartner: string; + idealPartner: string; + relationshipGoal: string; + // aboutUs + aboutUs: string; } const initialState: IQuestionnaire = { @@ -39,7 +67,7 @@ const initialState: IQuestionnaire = { isBirthTime: "", birthtime: "12:00", birthPlace: "", - relationshipProblem: "", + problems: "", partnerGender: "", partnerBirthdate: "", partnerBirthtime: "12:00", @@ -55,6 +83,28 @@ const initialState: IQuestionnaire = { aboutGoals: "", appreciated: "", decisions: "", + relateToStatement: "", + notice: "", + sensitive: "", + tendToOverthink: "", + mostImportant: "", + emotionalControl: "", + attitude: "", + want: "", + relaxing: "", + partnerIsBirthTime: "", + currentlyAffecting: "", + aboutUs: "", + priority: "", + comfortable: "", + goodEnough: "", + angry: "", + innerSelf: "", + aboutPeople: "", + idealDate: "", + futurePartner: "", + idealPartner: "", + relationshipGoal: "" }; const questionnaireSlice = createSlice({ diff --git a/src/store/token.ts b/src/store/token.ts old mode 100644 new mode 100755