"use client"; import { useState, type ReactNode, type Dispatch, type SetStateAction, } from "react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogTitle, DialogContent, DialogDescription, DialogHeader, DialogTrigger, DialogFooter, } from "@/components/ui/dialog"; import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, } from "@/components/ui/drawer"; import { useMediaQuery } from "@/lib/hooks/use-media-query"; import { cn } from "@/lib/utils"; type StatefulContent = ({ open, setOpen, }: { open: boolean; setOpen: Dispatch>; }) => ReactNode | ReactNode[]; export const ResponsiveDialog = (props: { trigger: ReactNode; title?: ReactNode; description?: ReactNode; children: ReactNode | ReactNode[] | StatefulContent; footer?: ReactNode; contentClassName?: string; }) => { const [open, setOpen] = useState(false); const isDesktop = useMediaQuery("(min-width: 640px)"); return isDesktop ? ( {props.trigger} {props.title} {props.description} {isFunctionType(props.children) ? props.children({ open, setOpen }) : props.children} {props.footer ? {props.footer} : null} ) : ( {props.trigger} {props.title} {props.description}
{isFunctionType(props.children) ? props.children({ open, setOpen }) : props.children}
{props.footer ? ( props.footer ) : ( )}
); }; const isFunctionType = ( prop: ReactNode | ReactNode[] | StatefulContent, ): prop is ({ open, setOpen, }: { open: boolean; setOpen: Dispatch>; }) => ReactNode | ReactNode[] => { return typeof prop === "function"; };