UNPKG

@geist-ui/react

Version:

Modern and minimalist React UI library.

77 lines (61 loc) 2.16 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import { useEffect, useRef, useState } from 'react'; var defaultOptions = { scrollLayer: false }; var elementStack = new Map(); var isIos = function isIos() { /* istanbul ignore next */ if (typeof window === 'undefined' || !window.navigator) return false; return /iP(ad|hone|od)/.test(window.navigator.platform); }; var touchHandler = function touchHandler(event) { if (event.touches && event.touches.length > 1) return true; event.preventDefault(); return false; }; var useBodyScroll = function useBodyScroll(elementRef, options) { /* istanbul ignore next */ if (typeof document === 'undefined') return [false, function (t) { return t; }]; var elRef = elementRef || useRef(document.body); var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), hidden = _useState2[0], setHidden = _useState2[1]; var safeOptions = _extends({}, defaultOptions, options || {}); // don't prevent touch event when layer contain scroll var isIosWithCustom = function isIosWithCustom() { if (safeOptions.scrollLayer) return false; return isIos(); }; useEffect(function () { if (!elRef || !elRef.current) return; var lastOverflow = elRef.current.style.overflow; if (hidden) { if (elementStack.has(elRef.current)) return; if (!isIosWithCustom()) { elRef.current.style.overflow = 'hidden'; } else { document.addEventListener('touchmove', touchHandler, { passive: false }); } elementStack.set(elRef.current, { last: lastOverflow }); return; } // reset element overflow if (!elementStack.has(elRef.current)) return; if (!isIosWithCustom()) { var store = elementStack.get(elRef.current); elRef.current.style.overflow = store.last; } else { document.removeEventListener('touchmove', touchHandler); } elementStack["delete"](elRef.current); }, [hidden, elRef]); return [hidden, setHidden]; }; export default useBodyScroll;