@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
JavaScript
;
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