"use client"; import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; import { cn } from "@/lib/utils"; import { useDialogPortalContainer } from "@/contexts/DialogPortalContext"; const Dialog = DialogPrimitive.Root; const DialogTrigger = DialogPrimitive.Trigger; const DialogPortal = DialogPrimitive.Portal; const DialogClose = DialogPrimitive.Close; const DialogOverlay = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, style, ...props }, ref) => ( )); DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; /** * 사이드바/탭바 영역 클릭인지 확인 * 사이드바/탭바 클릭은 Dialog의 "외부 상호작용"으로 간주하지 않음 */ function isNavigationAreaClick(e: { target: EventTarget | null }): boolean { const target = e.target as HTMLElement | null; if (!target?.closest) return false; return !!(target.closest("[data-sidebar]") || target.closest("[data-tabbar]")); } const DialogContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, onInteractOutside, onPointerDownOutside, style, ...props }, ref) => { const portalContainer = useDialogPortalContainer(); const handleInteractOutside = React.useCallback( (e: Event & { preventDefault: () => void }) => { if (isNavigationAreaClick(e)) { e.preventDefault(); return; } onInteractOutside?.(e as never); }, [onInteractOutside], ); const handlePointerDownOutside = React.useCallback( (e: Event & { preventDefault: () => void }) => { if (isNavigationAreaClick(e)) { e.preventDefault(); return; } onPointerDownOutside?.(e as never); }, [onPointerDownOutside], ); return ( {children} Close ); }); DialogContent.displayName = DialogPrimitive.Content.displayName; const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => (
); DialogHeader.displayName = "DialogHeader"; const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => (
); DialogFooter.displayName = "DialogFooter"; const DialogTitle = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); DialogTitle.displayName = DialogPrimitive.Title.displayName; const DialogDescription = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); DialogDescription.displayName = DialogPrimitive.Description.displayName; export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };