UNPKG

@ozen-ui/kit

Version:

React component library

79 lines (78 loc) 3.21 kB
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)); };