w-aura/src/components/CompatibilityV2/pages/Birthdate/index.tsx
2025-04-07 07:03:12 +00:00

103 lines
3.2 KiB
TypeScript

import Title from "@/components/Title";
import styles from "./styles.module.scss";
import { DatePicker } from "@/components/DateTimePicker";
import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { actions, selectors } from "@/store";
import Button from "../../components/Button";
import metricService from "@/services/metric/metricService";
import routes, { compatibilityV2Prefix } from "@/routes";
import { useNavigate } from "react-router-dom";
import { useTranslations } from "@/hooks/translations";
import { ELocalesPlacement } from "@/locales";
import { useSession } from "@/hooks/session/useSession";
import { ESourceAuthorization } from "@/api/resources/User";
import { usePreloadImages } from "@/hooks/preload/images";
import { getZodiacSignByDate, ZODIACS } from "@/services/zodiac-sign";
function Birthdate() {
const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2);
const { updateSession } = useSession();
const navigate = useNavigate();
const dispatch = useDispatch();
const birthdateFromStore = useSelector(selectors.selectBirthdate);
const [birthdate, setBirthdate] = useState(birthdateFromStore);
const [isDisabled, setIsDisabled] = useState(true);
const { gender } = useSelector(selectors.selectQuestionnaire);
const zodiacSign = getZodiacSignByDate(birthdate);
usePreloadImages(
!!zodiacSign?.length ?
[
`/zodiac-signs/${gender?.toLowerCase()}/${zodiacSign?.toLowerCase()}.svg`
] :
ZODIACS.map(
(zodiac) => `/zodiac-signs/${gender?.toLowerCase()}/${zodiac?.toLowerCase()}.svg`
)
);
const handleValid = (_birthdate: string) => {
setBirthdate(_birthdate);
setIsDisabled(_birthdate === "");
};
const getAge = () => {
const today = new Date();
const birthDate = new Date(birthdate);
let age = today?.getFullYear() - birthDate?.getFullYear();
const m = today?.getMonth() - birthDate?.getMonth();
if (m < 0 || (m === 0 && today?.getDate() < birthDate?.getDate())) {
age--;
}
return age;
};
const handleNext = () => {
const age = getAge();
metricService.userParams({
age,
});
updateSession(
{
profile: {
birthdate: `${birthdate} 00:00`,
},
},
ESourceAuthorization["aura.compatibility.v2"]
);
dispatch(actions.form.addDate(birthdate));
dispatch(actions.questionnaire.update({ birthdate }));
navigate(routes.client.compatibilityV2PalmsInformation());
};
return (
<div className={styles["page-container"]}>
<Title variant="h2" className={styles.title}>
{translate("/birthdate.title")}
</Title>
<p className={styles.description}>{translate("/birthdate.text")}</p>
<DatePicker
name="birthdate"
value={birthdate}
onValid={handleValid}
onInvalid={() => setIsDisabled(true)}
inputClassName="date-picker-input"
/>
<Button
className={styles.button}
onClick={handleNext}
disabled={isDisabled}
>
{translate("next")}
</Button>
<img
className={styles.image}
src={`${compatibilityV2Prefix}/hand-with-eye.svg`}
alt="Hand with eye"
/>
</div>
);
}
export default Birthdate;