import { zodResolver } from "@hookform/resolvers/zod"; import { Button, Group, Modal, Stack, Text } from "@mantine/core"; import { type FC, useState } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { formatDate } from "@/shared/lib"; import { useBankMutations } from "../../api/mutations"; import { type BankCard, useBankCard } from "../../api/queries"; import { type BankCardValues, bankCardSchema, bankMoneyValue, bankToday, } from "../../model/form-validation"; import { BankFeedback } from "../BankFeedback"; import classes from "../BankForms.module.css"; import { useBankFormFocus } from "../useBankFormFocus"; import { BankCardFields } from "./BankCardForm.view"; type BankCardFormProps = { card?: BankCard; onClose: () => void }; const BankCardForm: FC = (props) => { useBankFormFocus(); const [opened, setOpened] = useState(true); const { t } = useTranslation(); const [intent] = useState(() => crypto.randomUUID()); const [version, setVersion] = useState(props.card?.version ?? 1); const [error, setError] = useState(); const [latest, setLatest] = useState(); const fresh = useBankCard(props.card?.id); const mutation = useBankMutations(); const methods = useForm({ resolver: zodResolver(bankCardSchema), defaultValues: { name: props.card?.name ?? "", bankName: props.card?.bankName ?? "", lastFour: props.card?.lastFour ?? "", paymentSystem: props.card?.paymentSystem ?? "", openingBalance: props.card?.openingBalance.value ?? "0", openingDate: props.card?.openingDate ?? bankToday(), }, }); const pending = !opened || methods.formState.isSubmitting || (fresh.isFetching && Boolean(error)); return ( !pending && setOpened(false)} title={t(props.card ? "bank.editCard" : "bank.addCard")} closeButtonProps={{ "aria-label": t("bank.close"), disabled: pending }} closeOnClickOutside={!pending} closeOnEscape={!pending} >
{ setError(undefined); try { const metadata = { name: values.name, bankName: values.bankName || null, lastFour: values.lastFour || null, paymentSystem: values.paymentSystem || null, }; const financial = { openingBalance: { currency: "RUB" as const, value: bankMoneyValue(values.openingBalance), }, openingDate: values.openingDate, }; if (props.card) await mutation.updateCard.mutateAsync({ id: props.card.id, body: { ...metadata, ...(!props.card.archivedAt ? financial : {}), version, }, }); else await mutation.createCard.mutateAsync({ id: intent, ...metadata, ...financial, }); setOpened(false); } catch (failure) { setError(failure); } })} >
{error ? ( <> {props.card && ( )} ) : null} {latest && ( <> {t("bank.versionHint", { details: `${latest.name} · ${latest.openingBalance.value} RUB · ${formatDate(latest.openingDate)}`, })} )}
); }; export { BankCardForm };