- {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 (
+
+
+
+
+ All right!
You keep your emotions in check{" "}
+ {zodiacSign}, 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 (
+
+
+
+
+ Almost there!
Now let's tailor your plan by understanding the{" "}
+ Relationship Pattern.
+
+
+ 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 (
+
+
+
+
+ Wonderful!
+ Based on our data, only the top 17% of{" "}
+ {zodiacSign} 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 (
+
+
+
+
+ You’re not alone.
A lot of{" "}
+ {zodiacSign} 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 (
+
+
+
+
+ You’ve come to the right place,
+ {zodiacSign}!
+
+
+ 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 (
+
+
+
+
+ {zodiacSign}, here’s the
+ thing...
+ 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 (
+
+
+
+
+ It’s totally normal to feel nervous,{" "}
+ {zodiacSign}.
+
+
+ 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 (
+
+
+
+ {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 (
+
+
+
+
+ {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 (
+
+
+
+ {satisfied === "yes" && (
+
+ Well done!
Based on our data only the top 30% of{" "}
+ {zodiacSign} find it easy
+ to communicate with their{" "}
+ {partnerZodiacSign}{" "}
+ partner.
+
+ )}
+ {satisfied !== "yes" && (
+
+ You’re not alone.
Based on our data 74% of{" "}
+ {zodiacSign} find it
+ difficult to communicate with their{" "}
+ {partnerZodiacSign}{" "}
+ partner.
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 (
+
+
+
+
+ {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 (
+
+
+
+
+ Based on our data, 39% of{" "}
+ {zodiacSign} 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 (
+
+
+
+
+ Based on our data, 49% of{" "}
+ {zodiacSign} 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