UNPKG

@attio/react-native-bottom-sheet-toolbox-stack

Version:
110 lines (107 loc) 3.65 kB
"use strict"; import { nanoid } from "nanoid"; import * as React from "react"; import { useMergeRefs } from "react-merge-refs"; import { BottomSheetToolboxStackSheet } from "./bottom-sheet-toolbox-stack-sheet"; import { BottomSheetToolboxStackProvider, useBottomSheetToolboxStackContext, useIsBottomSheetToolboxStackContext } from "./context/bottom-sheet-toolbox-stack-context"; import { useBottomSheetToolboxStackSheet } from "./use-bottom-sheet-toolbox-stack-sheet"; import { jsx as _jsx } from "react/jsx-runtime"; function BottomSheetToolboxStackSheetAutoProviderDynamicSheet({ ref, onClose, children, openSheetOnMount }) { const [sheetId] = React.useState(() => nanoid()); const { wrapperProps, sheetProps } = useBottomSheetToolboxStackSheet(sheetId); const mergedRefs = useMergeRefs([ref, sheetProps.ref]); const innerSheetProps = React.useMemo(() => { const { ref: _ref, onClose: sheetPropsOnClose, ...rest } = sheetProps; return { ...rest, sheetRef: mergedRefs, onClose: () => { sheetPropsOnClose(); } }; }, [sheetProps, mergedRefs]); const stack = useBottomSheetToolboxStackContext(); const onMountFn = () => { if (openSheetOnMount) { stack.push(sheetId); } }; const onMountRef = React.useRef(onMountFn); onMountRef.current = onMountFn; const unmountFn = () => { stack.notifyClosed(sheetId); }; const onUnmountRef = React.useRef(unmountFn); onUnmountRef.current = unmountFn; React.useLayoutEffect(() => { onMountRef.current(); return () => onUnmountRef.current(); }, []); const isInStack = stack.sheetStack.some(sheet => sheet === sheetId); const wasInStackRef = React.useRef(false); React.useEffect(() => { wasInStackRef.current = isInStack; }, [isInStack]); const wasInStack = wasInStackRef.current; const stableOnCloseRef = React.useRef(onClose); React.useEffect(() => { stableOnCloseRef.current = onClose; }, [onClose]); React.useEffect(() => { if (!isInStack && wasInStack) { stableOnCloseRef.current?.(); } }, [isInStack, wasInStack]); return /*#__PURE__*/_jsx(BottomSheetToolboxStackSheet, { ...wrapperProps, children: children(innerSheetProps) }); } function BottomSheetToolboxStackSheetAutoProviderInjectProvider({ onClose, ...rest }) { const ref = React.useRef(null); const innerOnClose = React.useCallback(() => { ref.current?.close(); }, []); return /*#__PURE__*/_jsx(BottomSheetToolboxStackProvider, { ref: ref, initialSheetName: null, ...(onClose && { onClose }), children: /*#__PURE__*/_jsx(BottomSheetToolboxStackSheetAutoProviderDynamicSheet, { ...rest, onClose: innerOnClose }) }); } /** * A higher-order component that provides automatic stack context handling for bottom sheets. * If rendered within an existing BottomSheetToolboxStack context, it will integrate with that stack. * If no stack context exists, it will create a new BottomSheetToolboxStack context to manage the sheet. * This allows bottom sheets to work seamlessly both standalone and as part of a larger sheet stack, allowing for * more composable components. */ export function BottomSheetToolboxStackSheetAutoProvider(props) { const isStackContext = useIsBottomSheetToolboxStackContext(); return isStackContext ? /*#__PURE__*/_jsx(BottomSheetToolboxStackSheetAutoProviderDynamicSheet, { ...props }) : /*#__PURE__*/_jsx(BottomSheetToolboxStackSheetAutoProviderInjectProvider, { ...props }); } //# sourceMappingURL=bottom-sheet-toolbox-stack-sheet-auto-provider.component.js.map