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 { AlertDialogContext } from './Context'; import Box from '../../primitives/Box'; import type { IAlertDialogProps } from './types'; import { Fade } from '../Transitions'; import { useKeyboardBottomInset } from '../../../utils'; import { Overlay } from '../../primitives/Overlay'; import { useHasResponsiveProps } from '../../../hooks/useHasResponsiveProps'; const AlertDialog = ( { children, isOpen, onClose, defaultIsOpen, initialFocusRef, finalFocusRef, avoidKeyboard, closeOnOverlayClick = false, isKeyboardDismissable = true, overlayVisible = true, backdropVisible = true, animationPreset, ...rest }: IAlertDialogProps, ref: any ) => { const bottomInset = useKeyboardBottomInset(); const { contentSize, _backdrop, _backdropFade, _fade, _slide, _overlay, useRNModal, ...restThemeProps } = usePropsResolution('AlertDialog', rest); const [visible, setVisible] = useControllableState({ value: isOpen, defaultValue: defaultIsOpen, onChange: (val) => { if (!val) onClose && onClose(); }, }); const handleClose = () => setVisible(false); const child = ( {children} ); //TODO: refactor for responsive prop if (useHasResponsiveProps(rest)) { return null; } return ( {overlayVisible && backdropVisible && ( { closeOnOverlayClick && handleClose(); }} {..._backdrop} /> )} {animationPreset === 'slide' ? ( {child} ) : ( {child} )} ); }; export default memo(forwardRef(AlertDialog));