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