import { useId, type PropsWithChildren } from "react"; import type { BaseProps, HTMLProps } from "../../shared/types"; import { cn } from "../../shared/utils/cn"; import { Icon } from "../icon/Icon"; import { FloatingOverlay, FloatingPortal, useDismiss, useFloating, useInteractions, useRole, useTransitionStyles, useFocus, } from "@floating-ui/react"; import { FocusTrap } from "focus-trap-react"; export type DialogProps = HTMLProps<"div"> & { open: boolean; onOpenChange(value: boolean): void; } & BaseProps; export const Dialog = ({ open, onOpenChange, className, children, testId, }: PropsWithChildren) => { const id = useId(); const { refs, context } = useFloating({ open, onOpenChange, }); const dismiss = useDismiss(context); const role = useRole(context); const focusTrap = useFocus(context, {}); const { getFloatingProps } = useInteractions([dismiss, role, focusTrap]); const { isMounted, styles } = useTransitionStyles(context, { duration: { open: 200, close: 200, }, initial: { opacity: 0, }, open: { opacity: 1, }, close: { opacity: 0, }, }); if (!isMounted) { return null; } return (
{children}
); };