UNPKG

react-scrolllock-configurable

Version:

Prevent scroll on the body when component is mounted.

151 lines (120 loc) 3.59 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.pipe = exports.listenerOptions = undefined; exports.preventTouchMove = preventTouchMove; exports.allowTouchMove = allowTouchMove; exports.preventInertiaScroll = preventInertiaScroll; exports.isTouchDevice = isTouchDevice; exports.camelToKebab = camelToKebab; exports.parse = parse; exports.getPadding = getPadding; exports.getWindowHeight = getWindowHeight; exports.getDocumentHeight = getDocumentHeight; exports.makeStyleTag = makeStyleTag; exports.injectStyles = injectStyles; exports.insertStyleTag = insertStyleTag; var _exenv = require('exenv'); var listenerOptions = exports.listenerOptions = { capture: false, passive: false }; // ============================== // Touch Helpers // ============================== function preventTouchMove(e) { e.preventDefault(); return false; } function allowTouchMove(e) { var target = e.currentTarget; if (target.scrollHeight > target.clientHeight) { e.stopPropagation(); return true; } e.preventDefault(); return false; } function preventInertiaScroll() { var top = this.scrollTop; var totalScroll = this.scrollHeight; var currentScroll = top + this.offsetHeight; if (top === 0) { this.scrollTop = 1; } else if (currentScroll === totalScroll) { this.scrollTop = top - 1; } } // `ontouchstart` check works on most browsers // `maxTouchPoints` works on IE10/11 and Surface function isTouchDevice() { if (!_exenv.canUseDOM) return false; return 'ontouchstart' in window || navigator.maxTouchPoints; } // ============================== // Misc. // ============================== function camelToKebab(str) { return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); } function parse(val) { return isNaN(val) ? val : val + 'px'; } // Take a list of functions and return a function that applies the list of // functions from left to right var pipeFns = function pipeFns(a, b) { return function () { return b(a.apply(undefined, arguments)); }; }; var pipe = exports.pipe = function pipe() { for (var _len = arguments.length, fns = Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } return fns.reduce(pipeFns); }; // ============================== // Document Helpers // ============================== function getPadding() { if (!_exenv.canUseDOM) return 0; var currentPadding = parseInt(document.body.paddingRight, 10) || 0; var clientWidth = document.body ? document.body.clientWidth : 0; var adjustedPadding = window.innerWidth - clientWidth + currentPadding || 0; return adjustedPadding; } function getWindowHeight() { var multiplier = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; if (_exenv.canUseDOM) { return window.innerHeight * multiplier; } } function getDocumentHeight() { if (_exenv.canUseDOM) { return document.body.clientHeight; } } // ============================== // Style Sheets // ============================== function makeStyleTag() { if (!_exenv.canUseDOM) return; var tag = document.createElement('style'); tag.type = 'text/css'; tag.setAttribute('data-react-scrolllock', ''); return tag; } function injectStyles(tag, css) { if (!_exenv.canUseDOM) return; if (tag.styleSheet) { tag.styleSheet.cssText = css; } else { tag.appendChild(document.createTextNode(css)); } } function insertStyleTag(tag) { if (!_exenv.canUseDOM) return; var head = document.head || document.getElementsByTagName('head')[0]; head.appendChild(tag); }