@attio/react-native-bottom-sheet-toolbox-stack
Version:
103 lines (101 loc) • 4.15 kB
JavaScript
;
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