// @flow /** @jsx jsx */ import { jsx } from '@emotion/react'; import React, { type Element } from 'react'; import useScrollCapture from './useScrollCapture'; import useScrollLock from './useScrollLock'; type RefCallback = (T | null) => void; type Props = { children: (RefCallback) => Element<*>, lockEnabled: boolean, captureEnabled: boolean, onBottomArrive?: (event: SyntheticEvent) => void, onBottomLeave?: (event: SyntheticEvent) => void, onTopArrive?: (event: SyntheticEvent) => void, onTopLeave?: (event: SyntheticEvent) => void, }; const blurSelectInput = () => document.activeElement && document.activeElement.blur(); export default function ScrollManager({ children, lockEnabled, captureEnabled = true, onBottomArrive, onBottomLeave, onTopArrive, onTopLeave, }: Props) { const setScrollCaptureTarget = useScrollCapture({ isEnabled: captureEnabled, onBottomArrive, onBottomLeave, onTopArrive, onTopLeave, }); const setScrollLockTarget = useScrollLock({ isEnabled: lockEnabled }); const targetRef = element => { setScrollCaptureTarget(element); setScrollLockTarget(element); }; return ( {lockEnabled && (
)} {children(targetRef)} ); }