From ee0aeaf4e72d976e86609b82cc710aadcba8aa61 Mon Sep 17 00:00:00 2001 From: zojgame Date: Thu, 2 May 2024 18:16:37 +0500 Subject: [PATCH] compass --- .../complexPage/ComplexButtomPanel.tsx | 11 +++-- src/components/complexPage/FloorLayout.tsx | 2 +- src/components/complexPage/SequenceSlider.tsx | 40 +++++++++++-------- src/pages/Complex.tsx | 5 ++- src/store/useSequence.tsx | 14 +++++++ 5 files changed, 50 insertions(+), 22 deletions(-) create mode 100644 src/store/useSequence.tsx diff --git a/src/components/complexPage/ComplexButtomPanel.tsx b/src/components/complexPage/ComplexButtomPanel.tsx index 851e9d6..0884bec 100644 --- a/src/components/complexPage/ComplexButtomPanel.tsx +++ b/src/components/complexPage/ComplexButtomPanel.tsx @@ -1,13 +1,17 @@ import useModal from "../../store/useModal"; +import useSequence from "../../store/useSequence"; import Button from "../Button"; import DisclaimerIcon from "../icons/DisclaimerIcon"; import DisclaimerModal from "../modals/DisclaimerModal"; -const ButtomPanel = () => { +const ComplexButtomPanel = () => { const { setModal } = useModal(); + const { currentCompassRotate } = useSequence(); + const handleOnDisclaimerClick = () => { setModal(); }; + return (
@@ -25,9 +29,10 @@ const ButtomPanel = () => {
compass
@@ -35,4 +40,4 @@ const ButtomPanel = () => { ); }; -export default ButtomPanel; +export default ComplexButtomPanel; diff --git a/src/components/complexPage/FloorLayout.tsx b/src/components/complexPage/FloorLayout.tsx index 27da03d..82805df 100644 --- a/src/components/complexPage/FloorLayout.tsx +++ b/src/components/complexPage/FloorLayout.tsx @@ -1,5 +1,5 @@ const FloorLayout = () => { - return <>; + return
; }; export default FloorLayout; diff --git a/src/components/complexPage/SequenceSlider.tsx b/src/components/complexPage/SequenceSlider.tsx index 950aa4c..9710ae1 100644 --- a/src/components/complexPage/SequenceSlider.tsx +++ b/src/components/complexPage/SequenceSlider.tsx @@ -5,9 +5,9 @@ import { isMobile } from "react-device-detect"; import { useSwipeable } from "react-swipeable"; import { Transition } from "react-transition-group"; import Button from "../Button"; -import ActiveResizeIcon from "../icons/ActiveResizeIcon"; import LeftArrowSliderIcon from "../icons/LeftArrowSliderIcon"; import RightArrowSliderIcon from "../icons/RightArrowSliderIcon"; +import useSequence from "../../store/useSequence"; // const marks = [ // { @@ -54,26 +54,32 @@ interface SequenceSliderProps { function SequenceSlider({ path }: SequenceSliderProps) { const [selectedImageRightIndex, setSelectedRightImageIndex] = useState(keyframes[3]); - const [selectedImageLeftIndex, setSelectedImageLeftIndex] = useState( - arrayLength - keyframes[3] - ); + const [selectedImageLeftKeyframe, setSelectedImageLeftKeyframe] = + useState(arrayLength - keyframes[3]); const [isAnimate, setIsAnimate] = useState(false); - + const [loadedImages, setLoadedImages] = useState(0); const [keyframeIndex, setKeyframeIndex] = useState(3); + const { setCurrentCompassRotate, currentCompassRotate } = useSequence(); + const [width, setWidth] = useState(); + const [top, setTop] = useState(); + + useEffect(() => { + setCurrentCompassRotate(keyframes[3]); + }, []); + const handlers = useSwipeable({ trackMouse: true, onSwipedLeft: () => !isAnimate && next(), onSwipedRight: () => !isAnimate && prev(), }); - const [loadedImages, setLoadedImages] = useState(0); - function handleLoad() { setLoadedImages((prev) => prev + 1); } function animateToRight(currentOffset: number) { const obj = { selectedImageIndex: selectedImageRightIndex }; + setCurrentCompassRotate(currentCompassRotate + currentOffset); gsap.to(obj, { selectedImageIndex: selectedImageRightIndex + currentOffset, @@ -81,12 +87,15 @@ function SequenceSlider({ path }: SequenceSliderProps) { ease: "power1.inOut", onUpdate: () => { const roundedIndex = Math.round(obj.selectedImageIndex); + if (roundedIndex >= arrayLength) { setSelectedRightImageIndex(roundedIndex - arrayLength); - setSelectedImageLeftIndex(arrayLength - (roundedIndex - arrayLength)); + setSelectedImageLeftKeyframe( + arrayLength - (roundedIndex - arrayLength) + ); } else { setSelectedRightImageIndex(roundedIndex); - setSelectedImageLeftIndex(arrayLength - roundedIndex); + setSelectedImageLeftKeyframe(arrayLength - roundedIndex); } }, onComplete: () => { @@ -96,21 +105,23 @@ function SequenceSlider({ path }: SequenceSliderProps) { } function animateToLeft(currentOffset: number) { - const obj = { selectedImageIndex: selectedImageLeftIndex }; + const obj = { selectedImageIndex: selectedImageLeftKeyframe }; + setCurrentCompassRotate(currentCompassRotate - currentOffset); gsap.to(obj, { - selectedImageIndex: selectedImageLeftIndex + currentOffset, + selectedImageIndex: selectedImageLeftKeyframe + currentOffset, duration: 0.75, ease: "power1.inOut", onUpdate: () => { const roundedIndex = Math.round(obj.selectedImageIndex); + if (roundedIndex > arrayLength) { setSelectedRightImageIndex( arrayLength - (roundedIndex - arrayLength) ); - setSelectedImageLeftIndex(roundedIndex - arrayLength); + setSelectedImageLeftKeyframe(roundedIndex - arrayLength); } else { - setSelectedImageLeftIndex(roundedIndex); + setSelectedImageLeftKeyframe(roundedIndex); setSelectedRightImageIndex(arrayLength - roundedIndex); } }, @@ -148,9 +159,6 @@ function SequenceSlider({ path }: SequenceSliderProps) { animateToLeft(currentOffset); } - const [width, setWidth] = useState(); - const [top, setTop] = useState(); - function handleResize() { setWidth(window.innerWidth); setTop(window.innerWidth / 2 - window.innerHeight / 2); diff --git a/src/pages/Complex.tsx b/src/pages/Complex.tsx index 70955b7..148f913 100644 --- a/src/pages/Complex.tsx +++ b/src/pages/Complex.tsx @@ -1,4 +1,4 @@ -import ButtomPanel from "../components/ButtomPanel"; +import ComplexButtomPanel from "../components/complexPage/ComplexButtomPanel"; import ComplexTopPanel from "../components/complexPage/ComplexTopPanel"; import SequenceSlider from "../components/complexPage/SequenceSlider"; @@ -8,7 +8,8 @@ const Complex = () => {
- + {/* */} +
); }; diff --git a/src/store/useSequence.tsx b/src/store/useSequence.tsx new file mode 100644 index 0000000..cbbec41 --- /dev/null +++ b/src/store/useSequence.tsx @@ -0,0 +1,14 @@ +import { create } from "zustand"; + +interface SequenceStore { + currentCompassRotate: number; + setCurrentCompassRotate: (keyframe: number) => void; +} + +const useSequence = create((set) => ({ + currentCompassRotate: 0, + setCurrentCompassRotate: (keyframe) => + set(() => ({ currentCompassRotate: keyframe })), +})); + +export default useSequence;