@attio/react-native-bottom-sheet-toolbox
Version:
73 lines (70 loc) • 2.32 kB
JavaScript
;
import { nanoid } from "nanoid/non-secure";
import * as React from "react";
import { useDerivedValue, useSharedValue } from "react-native-reanimated";
import { jsx as _jsx } from "react/jsx-runtime";
const InternalKeyboardContext = /*#__PURE__*/React.createContext(null);
function useInternalKeyboardContext() {
const context = React.useContext(InternalKeyboardContext);
if (!context) {
throw new Error("InternalKeyboardProvider not found.");
}
return context;
}
/**
* The internal provider which maintains the additional keyboard height state.
*/
export function InternalKeyboardProvider({
children
}) {
const [additionalKeyboardHeights, setAdditionalKeyboardHeights] = React.useState({});
const value = React.useMemo(() => ({
additionalKeyboardHeights,
setAdditionalKeyboardHeights
}), [additionalKeyboardHeights]);
return /*#__PURE__*/_jsx(InternalKeyboardContext.Provider, {
value: value,
children: children
});
}
/**
* Returns a shared value representing the total of all additional keyboard
* heights.
*/
export function useAdditionalKeyboardHeightTotal() {
const {
additionalKeyboardHeights
} = useInternalKeyboardContext();
return useDerivedValue(() => Object.values(additionalKeyboardHeights).reduce((accumulator, value) => accumulator + value.get(), 0), [additionalKeyboardHeights]);
}
/**
* Returns a shared value enabling you to attach an artificial offset to the
* internal keyboard height.
*
* This is useful when implementing features such as keyboard toolbars.
*/
export function useAdditionalKeyboardHeight(id = nanoid()) {
const {
additionalKeyboardHeights,
setAdditionalKeyboardHeights
} = useInternalKeyboardContext();
const newHeightSharedValue = useSharedValue(0);
const heightSharedValue = additionalKeyboardHeights[id] ?? newHeightSharedValue;
React.useEffect(() => {
setAdditionalKeyboardHeights(previous => ({
...previous,
[id]: heightSharedValue
}));
return () => {
setAdditionalKeyboardHeights(previous => {
const next = {
...previous
};
delete next[id];
return next;
});
};
}, [heightSharedValue, id, setAdditionalKeyboardHeights]);
return heightSharedValue;
}
//# sourceMappingURL=internal-keyboard-context.js.map