@ozen-ui/kit
Version:
React component library
79 lines (78 loc) • 3.21 kB
JavaScript
import React, { useEffect, useRef } from 'react';
import { useStoredValue } from '../../../hooks/useStoredValue';
import { useBottomSheetBaseHeight, useBottomSheetBaseReady, useBottomSheetBaseSnaps, } from '../hooks';
import { bottomSheetCalculateSnaps } from '../utils';
import { BottomSheetBaseContext } from './BottomSheetBaseContext';
export var BottomSheetBaseContextProvider = function (_a) {
var children = _a.children, isOpen = _a.isOpen, snapsProp = _a.snaps, maxHeightProp = _a.maxHeight, defaultSnapProp = _a.defaultSnap, onClose = _a.onClose, isClosable = _a.isClosable, setIsAnimating = _a.setIsAnimating;
var rootRef = useRef(null);
var scrollRef = useRef(null);
var contentRef = useRef(null);
var blocksRefs = useStoredValue({});
var _b = useBottomSheetBaseReady(), isReady = _b.isReady, registerReady = _b.registerReady;
var canDrag = useStoredValue(true);
var _c = useBottomSheetBaseHeight({
customMaxHeight: maxHeightProp,
contentRef: contentRef,
registerReady: registerReady,
blocksRefs: blocksRefs,
}), minHeight = _c.minHeight, maxHeight = _c.maxHeight, recalculateHeight = _c.recalculateHeight;
var addBlockRef = function (id, instance) {
blocksRefs.current[id] = instance;
recalculateHeight();
};
var _d = bottomSheetCalculateSnaps({
minHeight: minHeight,
maxHeight: maxHeight,
isReady: isReady,
snaps: snapsProp,
defaultSnap: defaultSnapProp,
}), minSnap = _d.minSnap, maxSnap = _d.maxSnap, defaultSnap = _d.defaultSnap, snaps = _d.snaps, findClosestSnapFn = _d.findClosestSnap;
var findClosestSnap = useStoredValue(function () { return findClosestSnapFn; });
useEffect(function () {
findClosestSnap.current = findClosestSnapFn;
}, [findClosestSnapFn]);
var snapsControl = useBottomSheetBaseSnaps({
minSnap: minSnap,
maxSnap: maxSnap,
defaultSnap: defaultSnap,
rootRef: rootRef,
onAnimationStart: function () {
canDrag.current = false;
setIsAnimating(true);
},
onAnimationFinish: function () {
canDrag.current = true;
setIsAnimating(false);
},
isReady: isReady,
findClosestSnap: findClosestSnap,
});
useEffect(function () {
if (!isReady) {
return;
}
if (isOpen) {
snapsControl.toDefault(true);
}
else {
snapsControl.toClosed(true);
}
}, [isOpen, isReady]);
return (React.createElement(BottomSheetBaseContext.Provider, { value: {
rootRef: rootRef,
contentRef: contentRef,
scrollRef: scrollRef,
addBlockRef: addBlockRef,
blocksRefs: blocksRefs,
minSnap: minSnap,
maxSnap: maxSnap,
snaps: snaps,
defaultSnap: defaultSnap !== null && defaultSnap !== void 0 ? defaultSnap : minSnap,
onClose: onClose,
isClosable: isClosable,
canDrag: canDrag,
snapsControl: snapsControl,
findClosestSnap: findClosestSnap,
} }, children));
};