Skip to content

Commit fe80aed

Browse files
Adds Progressive Rendering for Transaction DataTable
- it fixes UI freezing when trying to change page, allows to interupt DataTable loading There is still issue when DataTable loaded (after preloader starts to fade), if user tries to change page in this time he will encounter UI freezing up to 100-150ms D: Fix for that is Chunk Rendering or Virtualization, but it is a overkill?
1 parent ccbf8b3 commit fe80aed

1 file changed

Lines changed: 18 additions & 3 deletions

File tree

  • src/pages/trading_analytics/Tabs/Transaction

src/pages/trading_analytics/Tabs/Transaction/index.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Box, Grid, Group, NumberFormatter, Paper, Table, Text, Title } from "@mantine/core";
22
import { useLocalStorage } from "@mantine/hooks";
3-
import { useEffect, useState } from "react";
3+
import { useEffect, useState, useTransition } from "react";
44
import { TauriTypes } from "$types";
55
import { useQueries } from "./queries";
66
import { useTauriEvent } from "@hooks/useTauriEvent.hook";
@@ -58,6 +58,10 @@ export const TransactionPanel = ({ isActive }: TransactionPanelProps = {}) => {
5858
const [filterOpened, setFilterOpened] = useState<boolean>(false);
5959
const [canExport, setCanExport] = useState<boolean>(false);
6060

61+
// Progressive rendering === allows navigation during table render (without it ui freezes until table loads)
62+
const [isPending, startTransition] = useTransition();
63+
const [displayedRecords, setDisplayedRecords] = useState<TauriTypes.TransactionDto[]>([]);
64+
6165
// Check permissions for export on mount
6266
useEffect(() => {
6367
HasPermission(TauriTypes.PermissionsFlags.EXPORT_DATA).then((res) => setCanExport(res));
@@ -94,6 +98,17 @@ export const TransactionPanel = ({ isActive }: TransactionPanelProps = {}) => {
9498
// Use the custom hook for Tauri events
9599
useTauriEvent(TauriTypes.Events.RefreshTransactions, handleRefresh, []);
96100

101+
// Progressive rendering
102+
useEffect(() => {
103+
if (paginationQuery.isFetching) {
104+
setDisplayedRecords([]);
105+
} else if (paginationQuery.data?.results) {
106+
startTransition(() => {
107+
setDisplayedRecords(paginationQuery.data?.results || []);
108+
});
109+
}
110+
}, [paginationQuery.isFetching, paginationQuery.data?.results]);
111+
97112
return (
98113
<Box p={"md"}>
99114
{" "}
@@ -200,8 +215,8 @@ export const TransactionPanel = ({ isActive }: TransactionPanelProps = {}) => {
200215
className={`${classes.databaseTransactions} ${useHasAlert() ? classes.alert : ""} ${filterOpened ? classes.filterOpened : ""}`}
201216
mt={"md"}
202217
striped
203-
fetching={paginationQuery.isFetching || calculateTaxMutation.isPending}
204-
records={paginationQuery.isFetching ? [] : (paginationQuery.data?.results || [])}
218+
fetching={paginationQuery.isFetching || isPending || calculateTaxMutation.isPending}
219+
records={displayedRecords}
205220
page={getSafePage(queryData.page, paginationQuery.data?.total_pages)}
206221
onPageChange={(page) => setQueryData((prev) => ({ ...prev, page }))}
207222
totalRecords={paginationQuery.data?.total || 0}

0 commit comments

Comments
 (0)