UNPKG

@quidone/react-native-wheel-picker

Version:

Picker is a UI component for selecting an item from a list of options.

77 lines (76 loc) 2.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _reactUsefulHooks = require("@rozhkov/react-useful-hooks"); var _react2 = require("../../../utils/react"); const SYNC_SCROLL_DELAY_MS = 100; const useSyncScrollEffect = ({ listRef, value, valueIndex, extraValues = [], activeIndexRef, touching, enableSyncScrollAfterScrollEnd }) => { const timeoutId = (0, _react.useRef)(undefined); const isScrollingRef = (0, _react.useRef)(false); const prevEnableSyncScrollAfterScrollEnd = (0, _react.useRef)(enableSyncScrollAfterScrollEnd); const cancelSyncScroll = (0, _reactUsefulHooks.useStableCallback)(() => { clearTimeout(timeoutId.current); timeoutId.current = undefined; }); const syncScroll = (0, _reactUsefulHooks.useStableCallback)(() => { if (listRef.current == null || touching || activeIndexRef.current === valueIndex) { return; } listRef.current.scrollToIndex({ index: valueIndex, animated: true }); }); const scheduleSyncScroll = (0, _reactUsefulHooks.useStableCallback)(delay => { cancelSyncScroll(); timeoutId.current = setTimeout(() => { timeoutId.current = undefined; syncScroll(); }, delay); }); (0, _react.useEffect)(() => cancelSyncScroll, [cancelSyncScroll]); (0, _react.useEffect)(() => { const prevEnabled = prevEnableSyncScrollAfterScrollEnd.current; prevEnableSyncScrollAfterScrollEnd.current = enableSyncScrollAfterScrollEnd; if (!enableSyncScrollAfterScrollEnd) { cancelSyncScroll(); return; } if (!prevEnabled && value !== undefined && !isScrollingRef.current) { scheduleSyncScroll(SYNC_SCROLL_DELAY_MS); } }, [cancelSyncScroll, enableSyncScrollAfterScrollEnd, scheduleSyncScroll, value]); (0, _react2.useEffectWithDynamicDepsLength)(() => { if (value === undefined) { return; } scheduleSyncScroll(0); }, [valueIndex, ...extraValues]); const onScrollStart = (0, _reactUsefulHooks.useStableCallback)(() => { isScrollingRef.current = true; cancelSyncScroll(); }); const onScrollEnd = (0, _reactUsefulHooks.useStableCallback)(() => { isScrollingRef.current = false; if (enableSyncScrollAfterScrollEnd && value !== undefined) { scheduleSyncScroll(SYNC_SCROLL_DELAY_MS); } }); return { onScrollStart, onScrollEnd }; }; var _default = exports.default = useSyncScrollEffect; //# sourceMappingURL=useSyncScrollEffect.js.map