carbon-react
Version:
A library of reusable React components for easily building user interfaces.
2 lines (1 loc) • 1.35 kB
JavaScript
import{useRef as e,useCallback as t}from"react";import r from"../../../__internal__/utils/helpers/guid/index.js";import l from"./scroll-block-manager.js";const o=new l,n=()=>{const{documentElement:e,body:t}=document||{},r=window.innerWidth-e.clientWidth;return[{element:e,property:"position",blockingValue:"relative"},{element:e,property:"overflow",blockingValue:"hidden"},{element:t,property:"position",blockingValue:"relative"},{element:t,property:"overflow",blockingValue:"hidden"},{element:t,property:"paddingRight",blockingValue:`${(parseInt(window.getComputedStyle(t).getPropertyValue("padding-right"))||0)+r}px`}]},i=()=>{const{current:l}=e(r()),i=e([]),a=t((()=>{n().forEach((({element:e,property:t},r)=>{e.style[t]=i.current[r]}))}),[]);return{blockScroll:t((()=>{const e=n(),t=o.isBlocked();if(o.registerComponent(l),t)return;const r=e.map((({element:e,property:t})=>e.style[t]));i.current=r,o.saveRestoreValuesCallback(a),o.saveOriginalValues(r),e.slice(-3).forEach((({element:e,property:t,blockingValue:r})=>{e.style[t]=r}))}),[a,l]),allowScroll:t((()=>{if(o.unregisterComponent(l),o.isBlocked())return;const e=o.getRestoreValuesCallback();if(e)return e(),void o.saveRestoreValuesCallback(null);const t=o.getOriginalValues();n().forEach((({element:e,property:r},l)=>{e.style[r]=t[l]})),o.saveOriginalValues([])}),[l])}};export{i as default};