diff options
author | Sebastian <sebasjm@gmail.com> | 2024-04-03 09:52:53 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2024-04-03 14:56:29 -0300 |
commit | 56da180423029a1b53d2be343eed4f073e96dc89 (patch) | |
tree | e8fd31dcc4c7bc6866b139de097c8f2c01f93597 /packages/bank-ui | |
parent | c53c6b8b3c0a66f3862883ec1314c6d4bf68af32 (diff) | |
download | wallet-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.ts | 22 | ||||
-rw-r--r-- | packages/bank-ui/src/hooks/account.ts | 77 | ||||
-rw-r--r-- | packages/bank-ui/src/hooks/regional.ts | 29 | ||||
-rw-r--r-- | packages/bank-ui/src/pages/PublicHistoriesPage.tsx | 10 | ||||
-rw-r--r-- | packages/bank-ui/src/pages/admin/AccountList.tsx | 8 | ||||
-rw-r--r-- | packages/bank-ui/src/pages/admin/AdminHome.tsx | 5 |
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 { |