import { FocusModal, clx } from "@medusajs/ui" import { PropsWithChildren, useEffect, useState } from "react" import { Path, useNavigate } from "react-router-dom" import { useStateAwareTo } from "../hooks/use-state-aware-to" import { RouteModalForm } from "../route-modal-form" import { useRouteModal } from "../route-modal-provider" import { RouteModalProvider } from "../route-modal-provider/route-provider" import { StackedModalProvider } from "../stacked-modal-provider" type RouteFocusModalProps = PropsWithChildren<{ prev?: string | Partial | number }> const Root = ({ prev = "..", children }: RouteFocusModalProps) => { const navigate = useNavigate() const [open, setOpen] = useState(false) const [stackedModalOpen, onStackedModalOpen] = useState(false) const to: string | Partial | number = // eslint-disable-next-line react-hooks/rules-of-hooks typeof prev === "number" ? prev : useStateAwareTo(prev) /** * Open the modal when the component mounts. This * ensures that the entry animation is played. */ useEffect(() => { setOpen(true) return () => { setOpen(false) onStackedModalOpen(false) } }, []) const handleOpenChange = (open: boolean) => { if (!open) { document.body.style.pointerEvents = "auto" if (typeof to === "number") { navigate(to) } else { navigate(to, { replace: true }) } return } setOpen(open) } return ( {children} ) } type ContentProps = PropsWithChildren<{ stackedModalOpen: boolean }> const Content = ({ stackedModalOpen, children }: ContentProps) => { const { __internal } = useRouteModal() const shouldPreventClose = !__internal.closeOnEscape return ( { e.preventDefault() } : undefined } className={clx({ "!bg-ui-bg-disabled !inset-x-5 !inset-y-3": stackedModalOpen, })} > {children} ) } const Header = FocusModal.Header const Title = FocusModal.Title const Description = FocusModal.Description const Footer = FocusModal.Footer const Body = FocusModal.Body const Close = FocusModal.Close const Form = RouteModalForm /** * FocusModal that is used to render a form on a separate route. * * Typically used for forms creating a resource or forms that require * a lot of space. */ export const RouteFocusModal = Object.assign(Root, { Header, Title, Body, Description, Footer, Close, Form, })