From b2b21f5b9ad74a9e59e1a791888ec5f8a324b77a Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Thu, 17 Oct 2019 11:09:42 +0700 Subject: [PATCH] moving slider --- .../node/NodeImageSlideBlock/index.tsx | 67 +++++++++++++------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index c2efff13..7fc60160 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -35,7 +35,8 @@ const NodeImageSlideBlock: FC = ({ node, is_loading, updateLayout }) => const [initial_x, setInitialX] = useState(0); const [offset, setOffset] = useState(0); const [is_dragging, setIsDragging] = useState(false); - const slide = useRef(); + const slide = useRef(); + const wrap = useRef(); const images = useMemo( () => @@ -46,11 +47,14 @@ const NodeImageSlideBlock: FC = ({ node, is_loading, updateLayout }) => // console.log({ heights }); const updateSizes = useCallback(() => { - const values = Object.keys(refs.current).map(key => { + const values = Object.keys(refs.current).reduce((obj, key) => { const ref = refs.current[key]; if (!ref || !ref.getBoundingClientRect) return 0; - return ref.getBoundingClientRect().height; - }); + return { ...obj, [key]: ref.getBoundingClientRect().height }; + }, {}); + + setHeights(values); + console.log({ values }); }, [refs]); const setRef = useCallback( @@ -80,38 +84,58 @@ const NodeImageSlideBlock: FC = ({ node, is_loading, updateLayout }) => // setHeight(element_height); }, [refs, current, loaded]); + useEffect(() => { + if (!wrap || !wrap.current) return; + + const { width } = wrap.current.getBoundingClientRect(); + const selected = Math.abs(-offset / width); + const prev = heights[Math.floor(selected)] || 320; + const next = heights[Math.ceil(selected)] || 320; + const now = prev - (prev - next) * (selected % 1); + + setHeight(now); + console.log({ offset, prev, next, now, selected }); + }, [offset, heights]); // useEffect(() => { // const timer = setTimeout(() => setIsAnimated(true), 250); // // return () => clearTimeout(timer); // }, []); - const stopDragging = useCallback(() => { - window.removeEventListener('mouseup', stopDragging); - setIsDragging(false); - }, [setIsDragging]); - - const startDragging: MouseEventHandler = useCallback( - event => { - window.addEventListener('mouseup', stopDragging); - setIsDragging(true); - setInitialX(event.clientX); - setInitialOffset(offset); - }, - [setIsDragging, stopDragging, setInitialX, offset, setInitialOffset] - ); - const onDrag = useCallback( event => { if (!is_dragging) return; - setOffset(initial_offset + event.clientX - initial_x); }, [is_dragging, initial_x, setOffset, initial_offset] ); + const stopDragging = useCallback(() => { + window.removeEventListener('mouseup', stopDragging); + setIsDragging(false); + }, [setIsDragging, onDrag]); + + const startDragging: MouseEventHandler = useCallback( + event => { + setIsDragging(true); + setInitialX(event.clientX); + setInitialOffset(offset); + + window.addEventListener('mouseup', stopDragging); + }, + [setIsDragging, stopDragging, setInitialX, offset, setInitialOffset, onDrag] + ); + + useEffect(() => { + window.addEventListener('mousemove', onDrag); + + return () => { + window.removeEventListener('mousemove', onDrag); + }; + }, [onDrag]); + return ( -
+
= ({ node, is_loading, updateLayout }) => width: `${images.length * 100}%`, }} onMouseDown={startDragging} - onMouseMove={onDrag} ref={slide} > {(is_loading || !loaded[0] || !images.length) &&
}