diff --git a/packages/core/src/lib/components/image/hooks/image-viewer/index.ts b/packages/core/src/lib/components/image/hooks/image-viewer/index.ts index 073a40d..d9a495b 100644 --- a/packages/core/src/lib/components/image/hooks/image-viewer/index.ts +++ b/packages/core/src/lib/components/image/hooks/image-viewer/index.ts @@ -1,3 +1,4 @@ export * from "./use-cursor-visibility"; export * from "./use-image-navigation"; export * from "./use-image-scale"; +export * from "./use-prevent-scroll"; diff --git a/packages/core/src/lib/components/image/hooks/image-viewer/use-cursor-visibility.tsx b/packages/core/src/lib/components/image/hooks/image-viewer/use-cursor-visibility.tsx index 08527e8..2f21a01 100644 --- a/packages/core/src/lib/components/image/hooks/image-viewer/use-cursor-visibility.tsx +++ b/packages/core/src/lib/components/image/hooks/image-viewer/use-cursor-visibility.tsx @@ -1,11 +1,11 @@ import { useState, useRef, useCallback } from "react"; -export const useCursorVisibility = (isScaleFocus: boolean) => { - const [isCursorVisible, setIsisCursorVisible] = useState(true); +export const useCursorVisibility = () => { + const [isCursorVisible, setIsCursorVisible] = useState(true); const cursorTimeOutRef = useRef(); const handleMoveMouse = useCallback(() => { - setIsisCursorVisible(true); + setIsCursorVisible(true); clearTimeout(cursorTimeOutRef.current); @@ -13,12 +13,10 @@ export const useCursorVisibility = (isScaleFocus: boolean) => { clearTimeout(cursorTimeOutRef.current); } - if (!isScaleFocus) { - cursorTimeOutRef.current = setTimeout(() => { - setIsisCursorVisible(false); - }, 2000); - } - }, [isScaleFocus]); + cursorTimeOutRef.current = setTimeout(() => { + setIsCursorVisible(false); + }, 2000); + }, []); return { isCursorVisible, diff --git a/packages/core/src/lib/components/image/hooks/image-viewer/use-prevent-scroll.tsx b/packages/core/src/lib/components/image/hooks/image-viewer/use-prevent-scroll.tsx new file mode 100644 index 0000000..570e3f6 --- /dev/null +++ b/packages/core/src/lib/components/image/hooks/image-viewer/use-prevent-scroll.tsx @@ -0,0 +1,25 @@ +import { useEffect } from "react"; + +import { getGapStyles, getGapWidth } from "../../lib"; + +export const usePreventScroll = (isOpened: boolean) => { + useEffect(() => { + const styleElement = document.createElement("style"); + + if (isOpened) { + document.body.setAttribute("data-scroll-locked", "true"); + const gap = getGapWidth(); + + const scrollLockedStyles = getGapStyles(gap); + styleElement.textContent = scrollLockedStyles; + document.head.appendChild(styleElement); + } + + return () => { + document.body.removeAttribute("data-scroll-locked"); + if (styleElement.parentNode) { + styleElement.parentNode.removeChild(styleElement); + } + }; + }, [isOpened]); +}; diff --git a/packages/core/src/lib/components/image/image-viewer.tsx b/packages/core/src/lib/components/image/image-viewer.tsx index a55d54b..18edcf3 100644 --- a/packages/core/src/lib/components/image/image-viewer.tsx +++ b/packages/core/src/lib/components/image/image-viewer.tsx @@ -5,6 +5,7 @@ import { useCursorVisibility, useImageNavigation, useImageScale, + usePreventScroll, } from "./hooks/image-viewer"; import { getCursorStyle } from "./lib"; @@ -51,8 +52,7 @@ const ImageViewer: React.FC = ({ handleScaleDown, } = useImageScale(); - const { isCursorVisible, handleMoveMouse } = - useCursorVisibility(isScaleFocus); + const { isCursorVisible, handleMoveMouse } = useCursorVisibility(); useEffect(() => { if (currentImageIndex || isOpened) { @@ -106,6 +106,8 @@ const ImageViewer: React.FC = ({ [urls, setCurrentImageIndex, setIsOpened], ); + usePreventScroll(isOpened); + return ( <>