import { ActionIcon, Anchor, Button, Group, Pagination, Select, Skeleton, Stack, Text, Title, } from "@mantine/core"; import { type FC, useLayoutEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; import { BankCardFace, BankFeedback, BankOperationIcon, BankPeriodPicker, BankSummaryView, } from "@/entities/bank-card"; import { EntryCard, LoadingSkeleton, StateView } from "@/shared/ui"; import classes from "./CardPage.module.css"; import type { CardPageVm } from "./CardPage.vm"; type CardPageViewProps = { vm: CardPageVm }; const CardPageView: FC = (props) => { const { vm } = props; const { t } = useTranslation(); const card = vm.card.data; const paginationRef = useRef(null); const pendingPage = useRef<{ scope: string; page: number; top: number; } | null>(null); const scope = `${card?.id}-${vm.period.from}-${vm.period.to}-${vm.pageSize}`; useLayoutEffect(() => { const pending = pendingPage.current; if (!pending) return; if (pending.scope !== scope || vm.history.isError) { pendingPage.current = null; return; } if (vm.history.isPlaceholderData || vm.history.data?.page !== pending.page) return; const pagination = paginationRef.current; if (pagination) { const delta = pagination.getBoundingClientRect().top - pending.top; if (delta) window.scrollBy({ top: delta, behavior: "instant" }); } pendingPage.current = null; }, [ scope, vm.history.data, vm.history.isPlaceholderData, vm.history.isError, ]); if (!card) { if (vm.card.isLoading) return ( ); return ( {!vm.notFound && ( )} } /> ); } return ( {card.name}
vm.setEditingCard(true)} > void vm.toggleArchive()} >
{vm.archiveError ? ( void vm.card.refetch()} /> ) : null} {card.archivedAt && {t("bank.archiveHint")}}
{vm.card.isError && ( {t("bank.refreshError")} )} {vm.card.isFetching && {t("bank.refreshing")}} {vm.cards.isError && ( void vm.cards.refetch()} /> )} void vm.summary.refetch()} /> {t("bank.operations")} vm.setOperation("new")} >