"use client"; /** * Based from Credenza * https://github.com/redpangilinan/credenza */ import * as React from "react"; import { useResponsive } from "~/context/responsiveContext"; import useLoading from "~/hooks/useLoading"; import { cn } from "~/lib/utils"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "./dialog"; import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, } from "./drawer"; interface ResponsiveDialogRootProps extends React.PropsWithChildren { open?: boolean; onOpenChange?: (open: boolean) => void; } interface ResponsiveDialogProps extends React.PropsWithChildren { asChild?: true; className?: string; } interface ResponsiveDialogBodyProps extends React.PropsWithChildren, React.HTMLAttributes { asChild?: true; } const ResponsiveDialog = (props: ResponsiveDialogRootProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const Component = React.useMemo(() => (isDesktop ? Dialog : Drawer), [isDesktop]); return ; }; const ResponsiveDialogTrigger = (props: ResponsiveDialogProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const Component = React.useMemo(() => (isDesktop ? DialogTrigger : DrawerTrigger), [isDesktop]); return ; }; const ResponsiveDialogClose = (props: ResponsiveDialogProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const loading = useLoading(); const Component = React.useMemo(() => (isDesktop ? DialogClose : DrawerClose), [isDesktop]); if (loading) return null; return ; }; const ResponsiveDialogContent = (props: ResponsiveDialogBodyProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const Component = React.useMemo(() => (isDesktop ? DialogContent : DrawerContent), [isDesktop]); return ( ); }; const ResponsiveDialogHeader = ( props: ResponsiveDialogProps & { align?: "start" | "center" | "end"; }, ) => { const { align = "start", className, ...rest } = props; const { isDesktop } = useResponsive(); const Component = React.useMemo(() => (isDesktop ? DialogHeader : DrawerHeader), [isDesktop]); return ( ); }; const ResponsiveDialogTitle = (props: ResponsiveDialogProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const Component = React.useMemo(() => (isDesktop ? DialogTitle : DrawerTitle), [isDesktop]); return ; }; const ResponsiveDialogDescription = (props: ResponsiveDialogProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const loading = useLoading(); const Component = React.useMemo(() => (isDesktop ? DialogDescription : DrawerDescription), [isDesktop]); if (loading) return null; return ; }; const ResponsiveDialogBody = (props: ResponsiveDialogBodyProps) => { const { className, ...rest } = props; return (
); }; const ResponsiveDialogFooter = (props: ResponsiveDialogProps) => { const { ...rest } = props; const { isDesktop } = useResponsive(); const loading = useLoading(); const Component = React.useMemo(() => (isDesktop ? DialogFooter : DrawerFooter), [isDesktop]); if (loading) return null; return ; }; export { ResponsiveDialog, ResponsiveDialogBody, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogFooter, ResponsiveDialogHeader, ResponsiveDialogTitle, ResponsiveDialogTrigger, };