@attio/react-native-bottom-sheet-toolbox
Version:
96 lines (94 loc) • 3.94 kB
JavaScript
;
import * as React from "react";
import { StyleSheet, View } from "react-native";
import { runOnJS, useAnimatedReaction } from "react-native-reanimated";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { BottomSheetDragGesture, BottomSheetToolboxDefaultBackdrop, BottomSheetToolboxSheet, BottomSheetToolboxWrapper } from "./components";
import { useBottomSheetToolboxInternalContext } from "./context/bottom-sheet-toolbox-internal-context";
import { useBottomSheetActions, useBottomSheetDevToolsAdapter, useBottomSheetIsReady, useBottomSheetOnCloseDetection, useBottomSheetOnSnapDetection, useBottomSheetOpenWhenReady, useBottomSheetSnapWhenIdle, useKeyboardAvoidingSnapPoints, useNormalizedSnapPoints } from "./hooks";
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
function useSetupSnapPoints(snapPoints, disableSnapPointKeyboardAdjust) {
const {
normalizedSnapPointsSharedValue
} = useBottomSheetToolboxInternalContext();
const normalizedSnapPoints = useNormalizedSnapPoints(snapPoints);
const keyboardAvoidingSnapPointsSharedValue = useKeyboardAvoidingSnapPoints(normalizedSnapPoints);
useAnimatedReaction(() => disableSnapPointKeyboardAdjust ? normalizedSnapPoints.get() : keyboardAvoidingSnapPointsSharedValue.get(), kb => {
normalizedSnapPointsSharedValue.set(kb);
}, [keyboardAvoidingSnapPointsSharedValue, normalizedSnapPoints, disableSnapPointKeyboardAdjust]);
}
function useSetupIsReady({
additionalIsReady = true,
onReadyChange
}) {
const {
isReadySharedValue
} = useBottomSheetToolboxInternalContext();
useBottomSheetIsReady(additionalIsReady);
useAnimatedReaction(() => isReadySharedValue.get(), (ready, lastReady) => {
if (ready === lastReady) return;
if (onReadyChange) runOnJS(onReadyChange)(ready);
}, [isReadySharedValue]);
}
function useInsetTopWithDefault(outerInsetTop) {
const insets = useSafeAreaInsets();
const insetTop = outerInsetTop === undefined ? Math.max(insets.top + 12, 24) : outerInsetTop || 0;
return insetTop;
}
/**
* A general-purpose composer of all our bottom sheet utilities.
*/
export function BottomSheetToolboxComposer({
children,
snapPoints,
initialSnapPointIndex,
insetTop: outerInsetTop,
backdropComponent = /*#__PURE__*/_jsx(BottomSheetToolboxDefaultBackdrop, {}),
overlayComponent,
onSnapChange,
onClose,
sheetStyle,
disableSheetDrag = false,
disableSnapPointKeyboardAdjust = false,
additionalIsReady = true,
onReadyChange,
ref
}) {
useBottomSheetDevToolsAdapter();
useSetupSnapPoints(snapPoints, disableSnapPointKeyboardAdjust);
useSetupIsReady({
additionalIsReady,
...(onReadyChange && {
onReadyChange
})
});
const insetTop = useInsetTopWithDefault(outerInsetTop);
useBottomSheetOpenWhenReady(initialSnapPointIndex);
useBottomSheetSnapWhenIdle();
useBottomSheetOnSnapDetection(onSnapChange);
useBottomSheetOnCloseDetection(onClose);
const actions = useBottomSheetActions("BottomSheetImperativeHandle");
React.useImperativeHandle(ref, () => actions, [actions]);
return /*#__PURE__*/_jsxs(_Fragment, {
children: [backdropComponent && /*#__PURE__*/_jsx(View, {
style: StyleSheet.absoluteFill,
pointerEvents: "box-none",
children: backdropComponent
}), /*#__PURE__*/_jsxs(BottomSheetToolboxWrapper, {
insetTop: insetTop,
children: [/*#__PURE__*/_jsx(BottomSheetDragGesture, {
id: "BottomSheetToolboxComposer:sheet-drag",
disabled: disableSheetDrag,
children: /*#__PURE__*/_jsx(BottomSheetToolboxSheet, {
style: sheetStyle,
children: children
})
}), overlayComponent && /*#__PURE__*/_jsx(View, {
style: StyleSheet.absoluteFill,
pointerEvents: "box-none",
children: overlayComponent
})]
})]
});
}
//# sourceMappingURL=bottom-sheet-toolbox-composer.js.map