import React from 'react'; import { Modal as RNModal, TouchableOpacity } from 'react-native'; import styled from 'styled-components/native'; import { border, color, flexbox, layout, space } from 'styled-system'; import { customBorder, customBackground, customOutline, customLayout, customExtra, customShadow, } from '../../../utils/customProps'; import type { IModalProps, IModalSemiProps } from './props'; import { Box, View, IBoxProps } from '../../primitives'; import { CloseButton, ICloseButtonProps } from '../../composites'; import { usePropsConfig } from '../../../theme'; const StyledModal = styled(RNModal)( color, space, layout, flexbox, border, customBorder, customBackground, customOutline, customShadow, customExtra, customLayout ); const ModalContext = React.createContext({ visible: false, toggleVisible: (_bool: boolean) => {}, toggleOnClose: (_bool: boolean) => {}, newProps: { _width: '60%', size: 'md', modalOverlayStyle: {}, closeOnOverlayClick: true, modalCloseButtonStyle: {}, modalCloseButtonProps: {}, modalFooterProps: {}, modalBodyProps: {}, modalContentProps: {}, modalHeaderProps: {}, modalOverlayProps: {}, }, }); const Modal = ( { children, isOpen, onClose, isCentered, initialFocusRef, finalFocusRef, justifyContent, alignItems, id, motionPreset, ...props }: IModalProps, ref: any ) => { const [isVisible, setIsVisible] = React.useState(true); React.useEffect(() => { setIsVisible(isOpen); }, [isOpen]); const newProps = usePropsConfig('Modal', props); const value: any = { visible: isVisible, toggleVisible: setIsVisible, toggleOnClose: onClose, newProps: newProps, }; return ( { initialFocusRef?.current?.focus(); }} onDismiss={() => { finalFocusRef?.current?.focus(); }} animationType={motionPreset || 'slide'} transparent {...props} ref={ref} > {children} ); }; export const ModalHeader = (props: IBoxProps) => { const { newProps } = React.useContext(ModalContext); return ; }; export const ModalContent = (props: IBoxProps) => { const { newProps } = React.useContext(ModalContext); return ( ); }; export const ModalBody = (props: IBoxProps) => { const { newProps } = React.useContext(ModalContext); return ; }; export const ModalFooter = (props: IBoxProps) => { const { newProps } = React.useContext(ModalContext); return ; }; export const ModalCloseButton = (props: ICloseButtonProps) => { const { toggleVisible, toggleOnClose, newProps } = React.useContext( ModalContext ); return ( { toggleVisible(false); toggleOnClose(false); }} /> ); }; export const ModalOverlay = ({ children, ...props }: any) => { const { toggleVisible, toggleOnClose, newProps } = React.useContext( ModalContext ); return ( {} : () => { toggleVisible(false); toggleOnClose(false); } } /> {children} ); }; export default React.forwardRef(Modal); export type { IModalProps };