103 lines
3.2 KiB
TypeScript
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;
|