import { FocusModal, clx } from "@medusajs/ui" import { ComponentPropsWithoutRef, ForwardRefExoticComponent, PropsWithChildren, PropsWithoutRef, RefAttributes, forwardRef, useEffect, } from "react" import { useStackedModal } from "../stacked-modal-provider" type StackedFocusModalProps = PropsWithChildren<{ /** * A unique identifier for the modal. This is used to differentiate stacked modals, * when multiple stacked modals are registered to the same parent modal. */ id: string /** * An optional callback that is called when the modal is opened or closed. */ onOpenChangeCallback?: (open: boolean) => void }> /** * A stacked modal that can be rendered above a parent modal. */ export const Root = ({ id, onOpenChangeCallback, children, }: StackedFocusModalProps) => { const { register, unregister, getIsOpen, setIsOpen } = useStackedModal() useEffect(() => { register(id) return () => unregister(id) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const handleOpenChange = (open: boolean) => { setIsOpen(id, open) onOpenChangeCallback?.(open) } return ( {children} ) } const Close = FocusModal.Close Close.displayName = "StackedFocusModal.Close" const Header = FocusModal.Header Header.displayName = "StackedFocusModal.Header" const Body = FocusModal.Body Body.displayName = "StackedFocusModal.Body" const Trigger = FocusModal.Trigger Trigger.displayName = "StackedFocusModal.Trigger" const Footer = FocusModal.Footer Footer.displayName = "StackedFocusModal.Footer" const Title = FocusModal.Title Title.displayName = "StackedFocusModal.Title" const Description = FocusModal.Description Description.displayName = "StackedFocusModal.Description" export type StackedFocusModalContentProps = ComponentPropsWithoutRef< typeof FocusModal.Content > const Content: ForwardRefExoticComponent< PropsWithoutRef & RefAttributes > = forwardRef( ({ className, ...props }, ref) => { return ( ) } ) Content.displayName = "StackedFocusModal.Content" type StackedFocusModalComponent = typeof Root & { Close: typeof FocusModal.Close Header: typeof FocusModal.Header Body: typeof FocusModal.Body Content: typeof Content Trigger: typeof FocusModal.Trigger Footer: typeof FocusModal.Footer Description: typeof FocusModal.Description Title: typeof FocusModal.Title } export const StackedFocusModal: StackedFocusModalComponent = Object.assign( Root, { Close, Header, Body, Content, Trigger, Footer, Description, Title, } )