"use client"; import type { DialogContentProps } from "@radix-ui/react-dialog"; import { createContext, type ReactNode, type RefAttributes, useContext } from "react"; import type { Drawer as DrawerPrimitive } from "vaul"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "~/components/ui/dialog"; import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, //DrawerNested, DrawerTitle, DrawerTrigger, } from "~/components/ui/drawer"; import { useMediaQuery } from "~/hooks/use-media-query"; import { cn } from "~/lib/utils"; interface BaseProps { children: ReactNode; } interface RootCredenzaProps extends BaseProps { open?: boolean; onOpenChange?: (open: boolean) => void; drawerProps?: React.ComponentProps; } interface CredenzaProps extends BaseProps { className?: string; asChild?: true; } const CredenzaContext = createContext<{ isDesktop: boolean }>({ isDesktop: false, }); const useCredenzaContext = () => { const context = useContext(CredenzaContext); if (!context) { throw new Error( "Credenza components cannot be rendered outside the Credenza Context", ); } return context; }; /** * Drawer-Dialog component * @example * import { * Credenza, * CredenzaTrigger, * CredenzaContent, * CredenzaHeader, * CredenzaTitle, * CredenzaDescription, * CredenzaBody, * CredenzaFooter, * CredenzaClose, * } from "~/components/custom_ui/credenza"; * * * * * * * * Credenza * * Description of the component. * * * * This component body. * * * * * * * * */ const Credenza = ({ children, drawerProps, ...props }: RootCredenzaProps) => { const isDesktop = useMediaQuery("(min-width: 768px)"); const Credenza = isDesktop ? Dialog : Drawer; return ( {children} ); }; /*const CredenzaNested = ({ children, drawerProps, ...props }: RootCredenzaProps) => { const isDesktop = useMediaQuery("(min-width: 768px)"); const Credenza = isDesktop ? Dialog : DrawerNested; return ( {children} ); };*/ const CredenzaTrigger = ({ className, children, ...props }: CredenzaProps) => { const { isDesktop } = useCredenzaContext(); const CredenzaTrigger = isDesktop ? DialogTrigger : DrawerTrigger; return ( {children} ); }; const CredenzaClose = ({ className, children, ...props }: CredenzaProps) => { const { isDesktop } = useCredenzaContext(); const CredenzaClose = isDesktop ? DialogClose : DrawerClose; return ( {children} ); }; const CredenzaContent = ({ className, children, ...props }: DialogContentProps & RefAttributes ) => { const { isDesktop } = useCredenzaContext(); const CredenzaContent = isDesktop ? DialogContent : DrawerContent; return ( {children} ); }; const CredenzaDescription = ({ className, children, ...props }: CredenzaProps) => { const { isDesktop } = useCredenzaContext(); const CredenzaDescription = isDesktop ? DialogDescription : DrawerDescription; return ( {children} ); }; const CredenzaHeader = ({ className, children, ...props }: CredenzaProps) => { const { isDesktop } = useCredenzaContext(); const CredenzaHeader = isDesktop ? DialogHeader : DrawerHeader; return ( {children} ); }; const CredenzaTitle = ({ className, children, ...props }: CredenzaProps) => { const { isDesktop } = useCredenzaContext(); const CredenzaTitle = isDesktop ? DialogTitle : DrawerTitle; return ( {children} ); }; const CredenzaBody = ({ className, children, ...props }: CredenzaProps) => { return (
{children}
); }; const CredenzaFooter = ({ className, children, ...props }: CredenzaProps) => { const { isDesktop } = useCredenzaContext(); const CredenzaFooter = isDesktop ? DialogFooter : DrawerFooter; return ( {children} ); }; export { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle, //CredenzaNested, CredenzaTrigger, };