import React, { forwardRef, memo } from 'react'; import { StyleSheet } from 'react-native'; import Backdrop from '../Backdrop'; import { Slide } from '../Transitions'; import { FocusScope } from '@react-native-aria/focus'; import { useControllableState, usePropsResolution } from '../../../hooks'; import { ModalContext } from './Context'; import Box from '../../primitives/Box'; import type { IModalProps } from './types'; import { Fade } from '../../composites/Transitions'; import { useKeyboardBottomInset } from '../../../utils'; import { Overlay } from '../../primitives/Overlay'; import { useHasResponsiveProps } from '../../../hooks/useHasResponsiveProps'; const Modal = ( { children, isOpen, onClose, defaultIsOpen, initialFocusRef, finalFocusRef, avoidKeyboard, closeOnOverlayClick = true, isKeyboardDismissable = true, overlayVisible = true, backdropVisible = true, animationPreset, ...rest }: IModalProps, ref: any ) => { const bottomInset = useKeyboardBottomInset(); const { contentSize, _backdrop, _backdropFade, _fade, _slide, _overlay, useRNModal, ...resolvedProps } = usePropsResolution('Modal', rest); const [visible, setVisible] = useControllableState({ value: isOpen, defaultValue: defaultIsOpen, onChange: (val) => { if (!val) onClose && onClose(); }, }); const handleClose = React.useCallback(() => setVisible(false), [setVisible]); const child = ( {children} ); const contextValue = React.useMemo(() => { return { handleClose, contentSize, initialFocusRef, finalFocusRef, visible, }; }, [handleClose, contentSize, initialFocusRef, finalFocusRef, visible]); //TODO: refactor for responsive prop if (useHasResponsiveProps(rest)) { return null; } return ( {overlayVisible && backdropVisible && ( { closeOnOverlayClick && handleClose(); }} {..._backdrop} /> )} {animationPreset === 'slide' ? ( {child} ) : ( {child} )} ); }; export default memo(forwardRef(Modal));