"use client"; import { Dispatch, SetStateAction } from "react"; // import { useRouter } from "next/router"; import { Drawer } from "vaul"; import { cn } from "@/lib/utils"; import { useMediaQuery } from "@/hooks/use-media-query"; import { Dialog, DialogContent } from "@/components/ui/dialog"; interface ModalProps { children: React.ReactNode; className?: string; showModal?: boolean; setShowModal?: Dispatch>; onClose?: () => void; desktopOnly?: boolean; preventDefaultClose?: boolean; maxHeight?: string; // 自定义最大高度 contentClassName?: string; // 内容区域的额外样式 } export function Modal({ children, className, showModal, setShowModal, onClose, desktopOnly, preventDefaultClose, maxHeight = "90vh", contentClassName, }: ModalProps) { // const router = useRouter(); const closeModal = ({ dragged }: { dragged?: boolean } = {}) => { if (preventDefaultClose && !dragged) { return; } // fire onClose event if provided onClose && onClose(); // if setShowModal is defined, use it to close modal if (setShowModal) { setShowModal(false); } // else, this is intercepting route @modal // else { // router.back(); // } }; const { isMobile } = useMediaQuery(); if (isMobile && !desktopOnly) { return ( { if (!open) { closeModal({ dragged: true }); } }} > {/* 拖拽手柄 - 固定在顶部 */}
{/* 可滚动内容区域 */}
{children}
); } return ( { if (!open) { closeModal(); } }} > e.preventDefault()} onCloseAutoFocus={(e) => e.preventDefault()} className={cn( "flex max-h-[90vh] flex-col overflow-hidden p-0 md:max-w-md md:rounded-2xl md:border", className, )} style={{ maxHeight }} >
{children}
); }