aboutsummaryrefslogtreecommitdiff
path: root/packages/bank-ui
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2024-04-03 09:52:53 -0300
committerSebastian <sebasjm@gmail.com>2024-04-03 14:56:29 -0300
commit56da180423029a1b53d2be343eed4f073e96dc89 (patch)
treee8fd31dcc4c7bc6866b139de097c8f2c01f93597 /packages/bank-ui
parentc53c6b8b3c0a66f3862883ec1314c6d4bf68af32 (diff)
downloadwallet-core-56da180423029a1b53d2be343eed4f073e96dc89.tar.xz
wip #8655: updating paginated queries
Diffstat (limited to 'packages/bank-ui')
-rw-r--r--packages/bank-ui/src/components/Transactions/state.ts22
-rw-r--r--packages/bank-ui/src/hooks/account.ts77
-rw-r--r--packages/bank-ui/src/hooks/regional.ts29
-rw-r--r--packages/bank-ui/src/pages/PublicHistoriesPage.tsx10
-rw-r--r--packages/bank-ui/src/pages/admin/AccountList.tsx8
-rw-r--r--packages/bank-ui/src/pages/admin/AdminHome.tsx5
6 files changed, 64 insertions, 87 deletions
diff --git a/packages/bank-ui/src/components/Transactions/state.ts b/packages/bank-ui/src/components/Transactions/state.ts
index 4e4552a82..ce6338e57 100644
--- a/packages/bank-ui/src/components/Transactions/state.ts
+++ b/packages/bank-ui/src/components/Transactions/state.ts
@@ -17,7 +17,9 @@
import {
AbsoluteTime,
Amounts,
+ HttpStatusCode,
TalerError,
+ assertUnreachable,
parsePaytoUri,
} from "@gnu-taler/taler-util";
import { useTransactions } from "../../hooks/account.js";
@@ -27,21 +29,27 @@ export function useComponentState({
account,
routeCreateWireTransfer,
}: Props): State {
- const txResult = useTransactions(account);
- if (!txResult) {
+ const result = useTransactions(account);
+ if (!result) {
return {
status: "loading",
error: undefined,
};
}
- if (txResult instanceof TalerError) {
+ if (result instanceof TalerError) {
return {
status: "loading-error",
- error: txResult,
+ error: result,
+ };
+ }
+ if (result.type === "fail") {
+ return {
+ status: "loading",
+ error: undefined,
};
}
- const transactions = txResult.result
+ const transactions = result.body
.map((tx) => {
const negative = tx.direction === "debit";
const cp = parsePaytoUri(
@@ -76,7 +84,7 @@ export function useComponentState({
error: undefined,
routeCreateWireTransfer,
transactions,
- onGoNext: txResult.isLastPage ? undefined : txResult.loadNext,
- onGoStart: txResult.isFirstPage ? undefined : txResult.loadFirst,
+ onGoNext: result.isLastPage ? undefined : result.loadNext,
+ onGoStart: result.isFirstPage ? undefined : result.loadFirst,
};
}
diff --git a/packages/bank-ui/src/hooks/account.ts b/packages/bank-ui/src/hooks/account.ts
index 24309183f..543c49aed 100644
--- a/packages/bank-ui/src/hooks/account.ts
+++ b/packages/bank-ui/src/hooks/account.ts
@@ -16,6 +16,7 @@
import {
AccessToken,
+ OperationOk,
TalerCoreBankResultByMethod,
TalerHttpError,
WithdrawalOperationStatus,
@@ -197,36 +198,44 @@ export function usePublicAccounts(
keepPreviousData: true,
});
- const isLastPage =
- data && data.type === "ok" && data.body.public_accounts.length <= PAGE_SIZE;
- const isFirstPage = !offset;
+ if (error) return error;
+ if (data === undefined) return undefined;
+ // if (data.type !== "ok") return data;
+
+ //TODO: row_id should not be optional
+ return buildPaginatedResult(data.body.public_accounts, offset, setOffset, (d) => d.row_id ?? 0)
+}
+
- const result =
- data && data.type == "ok" ? structuredClone(data.body.public_accounts) : [];
+type PaginatedResult<T> = OperationOk<T> & {
+ isLastPage: boolean;
+ isFirstPage: boolean;
+ loadNext(): void;
+ loadFirst(): void;
+}
+//TODO: consider sending this to web-util
+export function buildPaginatedResult<DataType, OffsetId>(data: DataType[], offset: OffsetId | undefined, setOffset: (o: OffsetId | undefined) => void, getId: (r: DataType) => OffsetId): PaginatedResult<DataType[]> {
+ const isLastPage = data.length <= PAGE_SIZE;
+ const isFirstPage = offset === undefined;
+
+ const result = structuredClone(data);
if (result.length == PAGE_SIZE + 1) {
result.pop();
}
- const pagination = {
- result,
+ return {
+ type: "ok",
+ body: result,
isLastPage,
isFirstPage,
loadNext: () => {
if (!result.length) return;
- setOffset(result[result.length - 1].row_id);
+ const id = getId(result[result.length - 1])
+ setOffset(id);
},
loadFirst: () => {
- setOffset(0);
+ setOffset(undefined);
},
};
-
- // const public_accountslist = data?.type !== "ok" ? [] : data.body.public_accounts;
- if (data) {
- return { ok: true, data: data.body, ...pagination };
- }
- if (error) {
- return error;
- }
- return undefined;
}
export function revalidateTransactions() {
@@ -271,34 +280,10 @@ export function useTransactions(account: string, initial?: number) {
revalidateOnFocus: false,
revalidateOnReconnect: false,
});
+ if (error) return error;
+ if (data === undefined) return undefined;
+ if (data.type !== "ok") return data;
- const isLastPage =
- data && data.type === "ok" && data.body.transactions.length <= PAGE_SIZE;
- const isFirstPage = !offset;
-
- const result =
- data && data.type == "ok" ? structuredClone(data.body.transactions) : [];
- if (result.length == PAGE_SIZE + 1) {
- result.pop();
- }
- const pagination = {
- result,
- isLastPage,
- isFirstPage,
- loadNext: () => {
- if (!result.length) return;
- setOffset(result[result.length - 1].row_id);
- },
- loadFirst: () => {
- setOffset(0);
- },
- };
+ return buildPaginatedResult(data.body.transactions, offset, setOffset, (d) => d.row_id)
- if (data) {
- return { ok: true, data, ...pagination };
- }
- if (error) {
- return error;
- }
- return undefined;
}
diff --git a/packages/bank-ui/src/hooks/regional.ts b/packages/bank-ui/src/hooks/regional.ts
index 274638f74..3e832a944 100644
--- a/packages/bank-ui/src/hooks/regional.ts
+++ b/packages/bank-ui/src/hooks/regional.ts
@@ -34,6 +34,7 @@ import {
import { useState } from "preact/hooks";
import _useSWR, { SWRHook, mutate } from "swr";
import { useBankCoreApiContext } from "@gnu-taler/web-util/browser";
+import { buildPaginatedResult } from "./account.js";
// FIX default import https://github.com/microsoft/TypeScript/issues/49189
const useSWR = _useSWR as unknown as SWRHook;
@@ -249,31 +250,13 @@ export function useBusinessAccounts() {
keepPreviousData: true,
});
- const isLastPage =
- data && data.type === "ok" && data.body.accounts.length <= PAGE_SIZE;
- const isFirstPage = !offset;
+ if (error) return error;
+ if (data === undefined) return undefined;
+ if (data.type !== "ok") return data;
- const result =
- data && data.type == "ok" ? structuredClone(data.body.accounts) : [];
- if (result.length == PAGE_SIZE + 1) {
- result.pop();
- }
- const pagination = {
- result,
- isLastPage,
- isFirstPage,
- loadNext: () => {
- if (!result.length) return;
- setOffset(result[result.length - 1].row_id);
- },
- loadFirst: () => {
- setOffset(0);
- },
- };
+ //TODO: row_id should not be optional
+ return buildPaginatedResult(data.body.accounts, offset, setOffset, (d) => d.row_id ?? 0)
- if (data) return { ok: true, data, ...pagination };
- if (error) return error;
- return undefined;
}
type CashoutWithId = TalerCorebankApi.CashoutStatusResponse & { id: number };
diff --git a/packages/bank-ui/src/pages/PublicHistoriesPage.tsx b/packages/bank-ui/src/pages/PublicHistoriesPage.tsx
index 554da0c3f..1810bd5dd 100644
--- a/packages/bank-ui/src/pages/PublicHistoriesPage.tsx
+++ b/packages/bank-ui/src/pages/PublicHistoriesPage.tsx
@@ -31,9 +31,9 @@ export function PublicHistoriesPage(): VNode {
const result = usePublicAccounts(undefined);
const firstAccount =
result &&
- !(result instanceof TalerError) &&
- result.data.public_accounts.length > 0
- ? result.data.public_accounts[0].username
+ !(result instanceof TalerError) &&
+ result.body.length > 0
+ ? result.body[0].username
: undefined;
const [showAccount, setShowAccount] = useState(firstAccount);
@@ -45,13 +45,13 @@ export function PublicHistoriesPage(): VNode {
return <Loading />;
}
- const { data } = result;
+ const { body: accountList } = result;
const txs: Record<string, h.JSX.Element> = {};
const accountsBar = [];
// Ask story of all the public accounts.
- for (const account of data.public_accounts) {
+ for (const account of accountList) {
const isSelected = account.username == showAccount;
accountsBar.push(
<li
diff --git a/packages/bank-ui/src/pages/admin/AccountList.tsx b/packages/bank-ui/src/pages/admin/AccountList.tsx
index c4e529f9f..6402c2bcd 100644
--- a/packages/bank-ui/src/pages/admin/AccountList.tsx
+++ b/packages/bank-ui/src/pages/admin/AccountList.tsx
@@ -51,19 +51,19 @@ export function AccountList({
if (result instanceof TalerError) {
return <ErrorLoadingWithDebug error={result} />;
}
- if (result.data.type === "fail") {
- switch (result.data.case) {
+ if (result.type === "fail") {
+ switch (result.case) {
case HttpStatusCode.Unauthorized:
return <Fragment />;
default:
- assertUnreachable(result.data.case);
+ assertUnreachable(result.case);
}
}
const onGoStart = result.isFirstPage ? undefined : result.loadFirst;
const onGoNext = result.isLastPage ? undefined : result.loadNext;
- const accounts = result.result;
+ const accounts = result.body;
return (
<Fragment>
<div class="px-4 sm:px-6 lg:px-8 mt-8">
diff --git a/packages/bank-ui/src/pages/admin/AdminHome.tsx b/packages/bank-ui/src/pages/admin/AdminHome.tsx
index 94b88dc89..4784fc73a 100644
--- a/packages/bank-ui/src/pages/admin/AdminHome.tsx
+++ b/packages/bank-ui/src/pages/admin/AdminHome.tsx
@@ -26,6 +26,7 @@ import { Attention, useTranslationContext } from "@gnu-taler/web-util/browser";
import {
format,
getDate,
+ getDaysInMonth,
getHours,
getMonth,
getYear,
@@ -127,8 +128,8 @@ export function getTimeframesForDate(
};
case TalerCorebankApi.MonitorTimeframeParam.day:
return {
- current: getDate(sub(time, { days: 1 })),
- previous: getDate(sub(time, { days: 2 })),
+ current: getDaysInMonth(sub(time, { days: 1 })),
+ previous: getDaysInMonth(sub(time, { days: 2 })),
};
case TalerCorebankApi.MonitorTimeframeParam.month:
return {