diff options
Diffstat (limited to 'packages/bank-ui/src/hooks/regional.ts')
-rw-r--r-- | packages/bank-ui/src/hooks/regional.ts | 97 |
1 files changed, 52 insertions, 45 deletions
diff --git a/packages/bank-ui/src/hooks/regional.ts b/packages/bank-ui/src/hooks/regional.ts index 274638f74..e0c861a0f 100644 --- a/packages/bank-ui/src/hooks/regional.ts +++ b/packages/bank-ui/src/hooks/regional.ts @@ -14,10 +14,10 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { PAGE_SIZE } from "../utils.js"; import { useSessionState } from "./session.js"; import { + AbsoluteTime, AccessToken, AmountJson, Amounts, @@ -31,19 +31,21 @@ import { TalerHttpError, opFixedSuccess, } from "@gnu-taler/taler-util"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useState } from "preact/hooks"; import _useSWR, { SWRHook, mutate } from "swr"; -import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; +import { buildPaginatedResult } from "./account.js"; +import { PAGINATED_LIST_REQUEST } from "../utils.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 const useSWR = _useSWR as unknown as SWRHook; export type TransferCalculation = | { - debit: AmountJson; - credit: AmountJson; - beforeFee: AmountJson; - } + debit: AmountJson; + credit: AmountJson; + beforeFee: AmountJson; + } | "amount-is-too-small"; type EstimatorFunction = ( amount: AmountJson, @@ -62,7 +64,10 @@ export function revalidateConversionInfo() { ); } export function useConversionInfo() { - const { lib: { conversion }, config } = useBankCoreApiContext(); + const { + lib: { conversion }, + config, + } = useBankCoreApiContext(); async function fetcher() { return await conversion.getConfig(); @@ -88,7 +93,9 @@ export function useConversionInfo() { } export function useCashinEstimator(): ConversionEstimators { - const { lib: { conversion } } = useBankCoreApiContext(); + const { + lib: { conversion }, + } = useBankCoreApiContext(); return { estimateByCredit: async (fiatAmount, fee) => { const resp = await conversion.getCashinRate({ @@ -144,7 +151,9 @@ export function useCashinEstimator(): ConversionEstimators { } export function useCashoutEstimator(): ConversionEstimators { - const { lib: { conversion } } = useBankCoreApiContext(); + const { + lib: { conversion }, + } = useBankCoreApiContext(); return { estimateByCredit: async (fiatAmount, fee) => { const resp = await conversion.getCashoutRate({ @@ -217,18 +226,20 @@ export function useBusinessAccounts() { const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api }, + } = useBankCoreApiContext(); const [offset, setOffset] = useState<number | undefined>(); - function fetcher([token, offset]: [AccessToken, number]) { + function fetcher([token, aid]: [AccessToken, number]) { // FIXME: add account name filter return api.getAccounts( token, {}, { - limit: PAGE_SIZE + 1, - offset: String(offset), + limit: PAGINATED_LIST_REQUEST, + offset: aid ? String(aid) : undefined, order: "asc", }, ); @@ -249,31 +260,17 @@ export function useBusinessAccounts() { keepPreviousData: true, }); - const isLastPage = - data && data.type === "ok" && data.body.accounts.length <= PAGE_SIZE; - const isFirstPage = !offset; - - 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); - }, - }; - - if (data) return { ok: true, data, ...pagination }; if (error) return error; - return undefined; + if (data === undefined) return undefined; + if (data.type !== "ok") return data; + + //TODO: row_id should not be optional + return buildPaginatedResult( + data.body.accounts, + offset, + setOffset, + (d) => d.row_id ?? 0, + ); } type CashoutWithId = TalerCorebankApi.CashoutStatusResponse & { id: number }; @@ -290,7 +287,10 @@ export function revalidateOnePendingCashouts() { } export function useOnePendingCashouts(account: string) { const { state: credentials } = useSessionState(); - const { lib: { bank: api }, config } = useBankCoreApiContext(); + const { + lib: { bank: api }, + config, + } = useBankCoreApiContext(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; @@ -350,7 +350,10 @@ export function revalidateCashouts() { } export function useCashouts(account: string) { const { state: credentials } = useSessionState(); - const { lib: { bank: api }, config } = useBankCoreApiContext(); + const { + lib: { bank: api }, + config, + } = useBankCoreApiContext(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; @@ -406,7 +409,9 @@ export function revalidateCashoutDetails() { export function useCashoutDetails(cashoutId: number | undefined) { const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? undefined : credentials; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api }, + } = useBankCoreApiContext(); async function fetcher([username, token, id]: [string, AccessToken, number]) { return api.getCashoutById({ username, token }, id); @@ -455,11 +460,13 @@ export function revalidateLastMonitorInfo() { ); } export function useLastMonitorInfo( - currentMoment: number, - previousMoment: number, + currentMoment: AbsoluteTime, + previousMoment: AbsoluteTime, timeframe: TalerCorebankApi.MonitorTimeframeParam, ) { - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api }, + } = useBankCoreApiContext(); const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; @@ -469,8 +476,8 @@ export function useLastMonitorInfo( TalerCorebankApi.MonitorTimeframeParam, ]) { const [current, previous] = await Promise.all([ - api.getMonitor(token, { timeframe, which: currentMoment }), - api.getMonitor(token, { timeframe, which: previousMoment }), + api.getMonitor(token, { timeframe, date: currentMoment }), + api.getMonitor(token, { timeframe, date: previousMoment }), ]); return { current, |