@gluestack-ui/core
Version:
Universal UI components for React Native, Expo, and Next.js
73 lines • 3.1 kB
JSX
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import React, { forwardRef } from 'react';
import { View } from 'react-native';
import { useControllableState, useKeyboardBottomInset, } from '@gluestack-ui/utils/hooks';
import { ModalContext } from './Context';
import { Overlay } from '../../overlay/creator';
const Modal = (StyledModal) => forwardRef((_a, ref) => {
var { children, isOpen, onClose, defaultIsOpen, initialFocusRef, finalFocusRef, avoidKeyboard, closeOnOverlayClick = true, isKeyboardDismissable = true, _experimentalOverlay = false } = _a, props = __rest(_a, ["children", "isOpen", "onClose", "defaultIsOpen", "initialFocusRef", "finalFocusRef", "avoidKeyboard", "closeOnOverlayClick", "isKeyboardDismissable", "_experimentalOverlay"]);
const bottomInset = useKeyboardBottomInset();
const { useRNModal } = props, remainingProps = __rest(props, ["useRNModal"]);
const [visible, setVisible] = useControllableState({
value: defaultIsOpen !== null && defaultIsOpen !== void 0 ? defaultIsOpen : isOpen,
onChange: (val) => {
if (!val)
onClose && onClose();
},
});
const handleClose = React.useCallback(() => {
setVisible(false);
}, [setVisible]);
const avoidKeyboardSpacer = (<View style={{
pointerEvents: 'box-none',
width: '100%',
height: avoidKeyboard ? bottomInset : undefined,
}}/>);
const contextValue = React.useMemo(() => {
return {
handleClose,
initialFocusRef,
finalFocusRef,
closeOnOverlayClick,
visible,
avoidKeyboard,
bottomInset,
};
}, [
handleClose,
initialFocusRef,
closeOnOverlayClick,
finalFocusRef,
avoidKeyboard,
bottomInset,
visible,
]);
if (_experimentalOverlay) {
return (<ModalContext.Provider value={contextValue}>
<StyledModal {...remainingProps} ref={ref}>
{children}
{avoidKeyboard ? avoidKeyboardSpacer : null}
</StyledModal>
</ModalContext.Provider>);
}
return (<Overlay isOpen={visible} onRequestClose={handleClose} isKeyboardDismissable={isKeyboardDismissable} useRNModal={useRNModal}>
<ModalContext.Provider value={contextValue}>
<StyledModal {...remainingProps} ref={ref}>
{children}
{avoidKeyboard ? avoidKeyboardSpacer : null}
</StyledModal>
</ModalContext.Provider>
</Overlay>);
});
export default Modal;
//# sourceMappingURL=Modal.jsx.map