139 lines
4.3 KiB
TypeScript
139 lines
4.3 KiB
TypeScript
import { useEffect, useMemo, useRef, useState } from "react";
|
|
|
|
import { Step } from "@/hooks/palmistry/use-steps";
|
|
import useSteps from "@/hooks/palmistry/use-steps";
|
|
import ScannedPhoto from "@/components/palmistry/scanned-photo/scanned-photo";
|
|
import { useSelector } from "react-redux";
|
|
import { selectors } from "@/store";
|
|
import { useNavigate } from "react-router-dom";
|
|
import routes from "@/routes";
|
|
import { IPalmistryLine } from "@/api/resources/Palmistry";
|
|
import { IPalmistryFingerLocal } from "@/store/palmistry";
|
|
|
|
const drawElementChangeDelay = 1500;
|
|
const startDelay = 500;
|
|
// const goNextDelay = 12000;
|
|
|
|
export default function StepScanPhoto() {
|
|
const steps = useSteps();
|
|
const navigate = useNavigate();
|
|
|
|
const storedPhoto = steps.getStoredValue(Step.Upload);
|
|
|
|
const lines = useSelector(selectors.selectPalmistryLines);
|
|
const fingers = useSelector(selectors.selectPalmistryFingers);
|
|
const drawElements = useMemo(() => [...fingers, ...lines], [fingers, lines]);
|
|
|
|
const [currentElementIndex, setCurrentElementIndex] = useState(0);
|
|
const [smallPhotoState, setSmallPhotoState] = useState(false);
|
|
const [title, setTitle] = useState("");
|
|
const [shouldDisplayPalmLines, setShouldDisplayPalmLines] = useState(false);
|
|
const changeTitleTimeOut = useRef<NodeJS.Timeout>();
|
|
|
|
const prevElementIndex = useRef<number | null>(null);
|
|
|
|
const goNextElement = (delay: number) => {
|
|
changeTitleTimeOut.current = setTimeout(() => {
|
|
const title =
|
|
(drawElements[currentElementIndex] as IPalmistryFingerLocal)
|
|
.fingerName || drawElements[currentElementIndex].name;
|
|
setTitle(title);
|
|
setCurrentElementIndex((prevState) => prevState + 1);
|
|
}, delay);
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (!drawElements.length) {
|
|
return navigate(routes.client.palmistryUpload());
|
|
}
|
|
}, [drawElements, navigate]);
|
|
|
|
useEffect(() => {
|
|
// if (currentElementIndex === 0) {
|
|
// new Promise((resolve) => setTimeout(resolve, startDelay));
|
|
// }
|
|
if (
|
|
currentElementIndex < drawElements?.length &&
|
|
currentElementIndex !== prevElementIndex.current
|
|
) {
|
|
prevElementIndex.current = currentElementIndex;
|
|
goNextElement(drawElementChangeDelay);
|
|
setShouldDisplayPalmLines(
|
|
lines?.includes(drawElements[currentElementIndex] as IPalmistryLine)
|
|
);
|
|
}
|
|
|
|
if (currentElementIndex >= drawElements?.length) {
|
|
const toSmallTimeOut = setTimeout(() => {
|
|
setSmallPhotoState(true);
|
|
}, drawElementChangeDelay);
|
|
const goNextTimeOut = setTimeout(
|
|
steps.goNext,
|
|
drawElementChangeDelay * drawElements.length + 8000
|
|
);
|
|
return () => {
|
|
clearTimeout(toSmallTimeOut);
|
|
clearTimeout(goNextTimeOut);
|
|
};
|
|
}
|
|
return () => {
|
|
if (changeTitleTimeOut.current) clearTimeout(changeTitleTimeOut.current);
|
|
};
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [currentElementIndex]);
|
|
|
|
// if (!storedPhoto) {
|
|
// return <Title variant="h4">Upload your photo</Title>;
|
|
// }
|
|
|
|
// console.log(shouldDisplayPalmLines);
|
|
// return <Title variant="h4">Upload your photo</Title>;
|
|
|
|
return (
|
|
<>
|
|
<h2
|
|
className="palmistry-container__title"
|
|
style={{
|
|
animationDelay: `${drawElementChangeDelay * drawElements.length}ms`,
|
|
animationDuration: `${drawElementChangeDelay}ms`,
|
|
}}
|
|
>
|
|
{title}
|
|
</h2>
|
|
<ScannedPhoto
|
|
photo={storedPhoto}
|
|
small={smallPhotoState}
|
|
drawElementChangeDelay={drawElementChangeDelay}
|
|
startDelay={startDelay}
|
|
displayLines={shouldDisplayPalmLines}
|
|
lines={lines}
|
|
fingers={fingers}
|
|
drawElements={drawElements}
|
|
/>
|
|
|
|
<h2
|
|
className="palmistry-container__waiting-title"
|
|
style={{
|
|
animationDelay: `${
|
|
drawElementChangeDelay * drawElements.length + 2500
|
|
}ms`,
|
|
}}
|
|
>
|
|
We are putting together a comprehensive Palmistry Reading just for you!
|
|
</h2>
|
|
|
|
<h3
|
|
className="palmistry-container__waiting-description"
|
|
style={{
|
|
animationDelay: `${
|
|
drawElementChangeDelay * drawElements.length + 3000
|
|
}ms`,
|
|
}}
|
|
>
|
|
Wow, looks like there is a lot we can tell about your ambitious and
|
|
strong self-confident future.
|
|
</h3>
|
|
</>
|
|
);
|
|
}
|