import * as React from 'react' import { Drawer as DrawerPrimitive } from 'vaul' import { randomString } from '@/lib/random' import { cn } from '@/lib/utils' import modalManager from '@/services/modal-manager.service' const Drawer = ({ shouldScaleBackground = true, open, onOpenChange, ...props }: React.ComponentProps) => { const [innerOpen, setInnerOpen] = React.useState(open ?? false) const id = React.useMemo(() => `drawer-${randomString()}`, []) React.useEffect(() => { if (open) { modalManager.register(id, () => { onOpenChange?.(false) }) } else { modalManager.unregister(id) } }, [open]) React.useEffect(() => { if (open !== undefined) { return } if (innerOpen) { modalManager.register(id, () => { setInnerOpen(false) }) } else { modalManager.unregister(id) } }, [innerOpen]) return ( ) } Drawer.displayName = 'Drawer' const DrawerTrigger = DrawerPrimitive.Trigger const DrawerPortal = DrawerPrimitive.Portal const DrawerClose = DrawerPrimitive.Close const DrawerOverlay = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName const DrawerContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { hideOverlay?: boolean } >(({ className, children, hideOverlay = false, ...props }, ref) => ( {!hideOverlay && } e.preventDefault()} {...props} >
{children} )) DrawerContent.displayName = 'DrawerContent' const DrawerHeader = ({ className, ...props }: React.HTMLAttributes) => (
) DrawerHeader.displayName = 'DrawerHeader' const DrawerFooter = ({ className, ...props }: React.HTMLAttributes) => (
) DrawerFooter.displayName = 'DrawerFooter' const DrawerTitle = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) DrawerTitle.displayName = DrawerPrimitive.Title.displayName const DrawerDescription = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) DrawerDescription.displayName = DrawerPrimitive.Description.displayName export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger }