"use client"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { XIcon } from "lucide-react"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; 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; // biome-ignore lint/style/noNonNullAssertion: controlled ensures it's defined 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 (
{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, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogFooter, ResponsiveDialogHeader, ResponsiveDialogTitle, ResponsiveDialogTrigger, };