/** @jsxImportSource @emotion/react */ import { useSafeArea } from '@/libs/hooks'; import { Interpolation, Theme } from '@emotion/react'; import dynamic from 'next/dynamic'; import React, { ForwardedRef, HTMLAttributes, ReactNode, useEffect, useRef, useState } from 'react'; import SimpleBar from 'simplebar-react'; import 'simplebar-react/dist/simplebar.min.css'; import BlurLayer from './pice/BlurLayer'; import { ModalCancelTab } from './pice/ModalCancelTab'; import { useModalStatic } from './pice/useModalStatic'; interface Props extends Omit, 'color'> { zIndex?: number; children: ReactNode; open: boolean; onClose: () => void; clickOutSideClose?: boolean; windowScreenScroll?: boolean; showCancelTab?: boolean; modalWidth?: number; modalContentMinHeight?: number; modalContentMaxHeight?: number; modalBackgroundColor?: string; headerExtanedComponent?: ReactNode; footerExtanedComponent?: ReactNode; isMobileBottomSheetMode?: boolean; } const screenSize = [1440, 1080, 780, 600, 438]; const MQ = screenSize.map(bp => `@media (max-width: ${bp}px)`); const ModalComponent = React.forwardRef((props: Props, ref: ForwardedRef) => { const { open, onClose, windowScreenScroll = false, clickOutSideClose = true, showCancelTab = true, zIndex = 9999, modalWidth = 600, modalContentMinHeight = 100, modalContentMaxHeight = 450, modalBackgroundColor = '#fff', headerExtanedComponent, footerExtanedComponent, isMobileBottomSheetMode = false, ...rest } = props; const modalRef = useRef(null); const { bottom, left, right } = useSafeArea({ bottom: 0, left: 0, right: 0 }); const [delayedOpen, setDelayedOpen] = useState(false); const handleCancel = () => { setDelayedOpen(false); const timeout = setTimeout(() => onClose(), 100); return () => clearTimeout(timeout); }; useEffect(() => { if (open) { const timeout = setTimeout(() => setDelayedOpen(true), 100); return () => clearTimeout(timeout); } else { setDelayedOpen(false); } }, [open]); useModalStatic({ ref: modalRef, open: delayedOpen, onCancel: handleCancel, clickOutSideClose, windowScreenScroll, }); if (!open) return null; return ( <> {open && delayedOpen && }
{showCancelTab && (
)} {headerExtanedComponent} {props.children} {footerExtanedComponent}
); }); const Modal = dynamic(() => Promise.resolve(ModalComponent), { ssr: false, loading: () => <>, }); export { Modal }; // // const flexT: Interpolation = { position: 'relative', display: 'flex', flexDirection: 'column', alignItems: 'center', width: '100%', height: '100%', transition: '0.2s ease-in-out', };