import { Prompt } from "@medusajs/ui" import { PropsWithChildren } from "react" import { FieldValues, UseFormReturn } from "react-hook-form" import { useTranslation } from "react-i18next" import { useBlocker } from "react-router-dom" import { Form } from "../../common/form" type RouteModalFormProps = PropsWithChildren<{ form: UseFormReturn blockSearchParams?: boolean onClose?: (isSubmitSuccessful: boolean) => void }> export const RouteModalForm = ({ form, blockSearchParams: blockSearch = false, children, onClose, }: RouteModalFormProps) => { const { t } = useTranslation() const { formState: { isDirty }, } = form const blocker = useBlocker(({ currentLocation, nextLocation }) => { // Check both nextLocation and currentLocation state for successful submission // This handles browser history navigation (-1) where we set state on current location const { isSubmitSuccessful: nextIsSuccessful } = nextLocation.state || {} const { isSubmitSuccessful: currentIsSuccessful } = currentLocation.state || {} const isSubmitSuccessful = nextIsSuccessful || currentIsSuccessful if (isSubmitSuccessful) { onClose?.(true) return false } const isPathChanged = currentLocation.pathname !== nextLocation.pathname const isSearchChanged = currentLocation.search !== nextLocation.search if (blockSearch) { const shouldBlock = isDirty && (isPathChanged || isSearchChanged) if (isPathChanged) { onClose?.(isSubmitSuccessful) } return shouldBlock } const shouldBlock = isDirty && isPathChanged if (isPathChanged) { onClose?.(isSubmitSuccessful) } return shouldBlock }) const handleCancel = () => { blocker?.reset?.() } const handleContinue = () => { blocker?.proceed?.() onClose?.(false) } return (
{children} {t("general.unsavedChangesTitle")} {t("general.unsavedChangesDescription")} {t("actions.cancel")} {t("actions.continue")}
) }