import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; import * as React from "react"; import { type DefaultValues, FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useFetcher } from "react-router"; import type { z } from "zod"; import { logger } from "~/utils/logger"; import type { ActionError } from "~/utils/remix.server"; import { LinkButton } from "../elements/Button"; import { SubmitButton } from "../SubmitButton"; export function SendouForm({ schema, defaultValues, heading, children, cancelLink, submitButtonTestId, }: { schema: T; defaultValues?: DefaultValues>; heading?: string; children: React.ReactNode; cancelLink?: string; submitButtonTestId?: string; }) { const { t } = useTranslation(["common"]); const fetcher = useFetcher(); const methods = useForm({ resolver: standardSchemaResolver(schema as any), defaultValues, }); if (methods.formState.isSubmitted && methods.formState.errors) { logger.error(methods.formState.errors); } React.useEffect(() => { if (!fetcher.data?.isError) return; const error = fetcher.data as ActionError; methods.setError(error.field as any, { message: error.msg, }); }, [fetcher.data, methods.setError]); const onSubmit = React.useCallback( methods.handleSubmit((values) => fetcher.submit(values as Parameters[0], { method: "post", encType: "application/json", }), ), [], ); return ( {heading ?

{heading}

: null} {children}
{t("common:actions.submit")} {cancelLink ? ( {t("common:actions.cancel")} ) : null}
); }