import { Alert, Button, Modal, PasswordInput, Stack, Text, } from "@mantine/core"; import { useQueryClient } from "@tanstack/react-query"; import type { FC } from "react"; import { useEffect, useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { apiErrorCode, apiQueryClient } from "@/shared/api"; import { commitTbankConnectionBoundary, type TbankConnectionStatus, } from "../../model/connection-boundary"; type TbankConnectionSectionLoadedProps = { status: TbankConnectionStatus; refreshing: boolean; refreshError: boolean; retry: () => void; }; const TbankConnectionSectionLoaded: FC = ( props, ) => { const { status } = props; const { t } = useTranslation(); const queryClient = useQueryClient(); const [deleteOpened, setDeleteOpened] = useState(false); const deleteButton = useRef(null); const [requestError, setRequestError] = useState(null); const { register, handleSubmit, reset, formState: { errors }, } = useForm<{ token: string }>(); const update = apiQueryClient.useMutation("put", "/api/v1/tbank-connection", { onSuccess: (data) => { commitTbankConnectionBoundary(queryClient, data); reset(); }, onError: (error) => setRequestError(apiErrorCode(error) ?? "REQUEST_ERROR"), }); const remove = apiQueryClient.useMutation( "delete", "/api/v1/tbank-connection", { onSuccess: () => { commitTbankConnectionBoundary(queryClient, { connected: false, connectedAt: null, }); setDeleteOpened(false); }, }, ); const pending = update.isPending || remove.isPending; const connected = status.connected; useEffect(() => { if (deleteOpened && remove.isError) deleteButton.current?.focus(); }, [deleteOpened, remove.isError]); return ( {t("tbank.title")} {connected ? t("tbank.connected", { date: new Date(status.connectedAt ?? "").toLocaleDateString( "ru-RU", ), }) : t("tbank.disconnected")} {t("tbank.hint")} {props.refreshing && ( {t("tbank.refreshing")} )} {props.refreshError && ( {t("tbank.refreshError")} )}
{ setRequestError(null); update.mutate({ body: { token } }); })} >
{requestError && ( {t( requestError === "INVALID_TBANK_TOKEN" ? "tbank.invalidToken" : requestError === "TBANK_UNAVAILABLE" ? "tbank.unavailable" : "tbank.requestError", )} )} {connected && ( )}
!pending && setDeleteOpened(false)} title={t("tbank.deleteTitle")} closeOnClickOutside={!pending} closeOnEscape={!pending} closeButtonProps={{ "aria-label": t("tbank.close"), disabled: pending }} > {t("tbank.deleteText")} {remove.isError && ( {t("tbank.requestError")} )}
); }; export { TbankConnectionSectionLoaded };