"use client" import * as React from "react" import * as DialogPrimitive from "@radix-ui/react-dialog" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { XIcon } from "lucide-react" const MEDIA_QUERY = "(min-width: 640px)" function useMediaQuery(query: string) { const [matches, setMatches] = React.useState(() => { if (typeof window === "undefined") return true return window.matchMedia(query).matches }) React.useEffect(() => { const mql = window.matchMedia(query) const handler = (e: MediaQueryListEvent) => setMatches(e.matches) mql.addEventListener("change", handler) return () => mql.removeEventListener("change", handler) }, [query]) return matches } interface ResponsiveDialogContextValue { open: boolean onOpenChange: (open: boolean) => void isDesktop: boolean } const ResponsiveDialogContext = React.createContext(null) function useResponsiveDialog() { const ctx = React.useContext(ResponsiveDialogContext) if (!ctx) throw new Error("ResponsiveDialog components must be used within ResponsiveDialog") return ctx } function ResponsiveDialog({ open, onOpenChange, children, }: { open?: boolean onOpenChange?: (open: boolean) => void children: React.ReactNode }) { const [internalOpen, setInternalOpen] = React.useState(false) const isDesktop = useMediaQuery(MEDIA_QUERY) const controlled = open !== undefined const currentOpen = controlled ? open : internalOpen const setCurrentOpen = controlled ? onOpenChange! : setInternalOpen return ( {isDesktop ? ( {children} ) : ( {children} )} ) } function ResponsiveDialogTrigger({ children, asChild, ...props }: React.ComponentProps) { return ( {children} ) } function ResponsiveDialogContent({ className, children, ...props }: React.ComponentProps) { const { isDesktop, open, onOpenChange } = useResponsiveDialog() if (isDesktop) { return ( {children} ) } if (!open) return null return (
onOpenChange(false)} />
{children}
) } function ResponsiveDialogHeader({ className, ...props }: React.ComponentProps<"div">) { return (
) } function ResponsiveDialogFooter({ className, ...props }: React.ComponentProps<"div">) { return (
) } function ResponsiveDialogTitle({ className, ...props }: React.ComponentProps) { return ( ) } function ResponsiveDialogDescription({ className, ...props }: React.ComponentProps) { return ( ) } function ResponsiveDialogClose({ ...props }: React.ComponentProps) { return } export { ResponsiveDialog, ResponsiveDialogTrigger, ResponsiveDialogContent, ResponsiveDialogHeader, ResponsiveDialogFooter, ResponsiveDialogTitle, ResponsiveDialogDescription, ResponsiveDialogClose, }