UNPKG

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

Version:
103 lines (101 loc) 4.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BottomSheetToolboxStackProvider = BottomSheetToolboxStackProvider; exports.useBottomSheetToolboxStackContext = useBottomSheetToolboxStackContext; exports.useIsBottomSheetToolboxStackContext = useIsBottomSheetToolboxStackContext; var React = _interopRequireWildcard(require("react")); var _reactNativeBottomSheetToolbox = require("@attio/react-native-bottom-sheet-toolbox"); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } const BottomSheetToolboxStackContext = /*#__PURE__*/React.createContext(undefined); function useIsBottomSheetToolboxStackContext() { const context = React.useContext(BottomSheetToolboxStackContext); return context !== undefined; } function useBottomSheetToolboxStackContext() { const context = React.useContext(BottomSheetToolboxStackContext); if (!context) { throw new Error("BottomSheetToolboxStackProvider not found."); } return context; } function BottomSheetToolboxStackProvider({ children, initialSheetName, onClose, ref }) { const [sheetStack, setSheetStack] = React.useState(() => initialSheetName !== null ? [initialSheetName] : []); const activeSheet = sheetStack.at(-1) ?? null; const sheetRefsRef = React.useRef({}); const nextNotifyClosedBehaviorRef = React.useRef("POP"); const push = React.useCallback(sheetName => { setSheetStack(s => [...s, sheetName]); }, []); const pop = React.useCallback(() => { if (!activeSheet) return; const sheetRefs = sheetRefsRef.current; const topSheet = sheetRefs[activeSheet]; topSheet?.close(); }, [activeSheet]); const canPopToTop = sheetStack.length > 1; const popToTop = React.useCallback(() => { if (!canPopToTop) return; nextNotifyClosedBehaviorRef.current = "POP_TO_TOP"; pop(); }, [canPopToTop, pop]); const closeAll = React.useCallback(() => { nextNotifyClosedBehaviorRef.current = "CLOSE_ALL"; pop(); }, [pop]); const notifyClosed = React.useCallback(name => { switch (nextNotifyClosedBehaviorRef.current) { case "POP": setSheetStack(s => { const currentActiveSheet = s.at(-1) ?? null; return name === currentActiveSheet ? s.slice(0, -1) : s; }); break; case "POP_TO_TOP": setSheetStack(s => s.slice(0, 1)); break; case "CLOSE_ALL": setSheetStack([]); break; } nextNotifyClosedBehaviorRef.current = "POP"; }, []); // When the last sheet is removed, consider the stack to be closed. const hadContentRef = React.useRef(sheetStack.length > 0); React.useEffect(() => { const hasContent = sheetStack.length > 0; const hadContent = hadContentRef.current; if (hadContent && !hasContent) { onClose?.(); } hadContentRef.current = hasContent; }, [onClose, sheetStack]); const contextValue = React.useMemo(() => ({ sheetStack, push, popToTop, pop, notifyClosed, activeSheet, closeAll, sheetRefsRef }), [sheetStack, push, notifyClosed, activeSheet, popToTop, pop, closeAll]); React.useImperativeHandle(ref, () => ({ close: closeAll }), [closeAll]); return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeBottomSheetToolbox.BottomSheetToolboxBackdropProvider, { reset: true, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BottomSheetToolboxStackContext.Provider, { value: contextValue, children: children }) }); } //# sourceMappingURL=bottom-sheet-toolbox-stack-context.js.map