diff options
Diffstat (limited to 'packages/demobank-ui/src/hooks/access.ts')
-rw-r--r-- | packages/demobank-ui/src/hooks/access.ts | 210 |
1 files changed, 130 insertions, 80 deletions
diff --git a/packages/demobank-ui/src/hooks/access.ts b/packages/demobank-ui/src/hooks/access.ts index 4d4574dac..9c162acfe 100644 --- a/packages/demobank-ui/src/hooks/access.ts +++ b/packages/demobank-ui/src/hooks/access.ts @@ -14,91 +14,113 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import useSWR from "swr"; -import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils.js"; -import { useEffect, useState } from "preact/hooks"; import { - HttpError, HttpResponse, HttpResponseOk, HttpResponsePaginated, + RequestError, } from "@gnu-taler/web-util/lib/index.browser"; -import { useAuthenticatedBackend, useMatchMutate, usePublicBackend } from "./backend.js"; +import { useEffect, useState } from "preact/hooks"; +import useSWR from "swr"; import { useBackendContext } from "../context/backend.js"; +import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils.js"; +import { + useAuthenticatedBackend, + useMatchMutate, + usePublicBackend, +} from "./backend.js"; export function useAccessAPI(): AccessAPI { const mutateAll = useMatchMutate(); const { request } = useAuthenticatedBackend(); - const { state } = useBackendContext() + const { state } = useBackendContext(); if (state.status === "loggedOut") { - throw Error("access-api can't be used when the user is not logged In") + throw Error("access-api can't be used when the user is not logged In"); } - const account = state.username + const account = state.username; const createWithdrawal = async ( data: SandboxBackend.Access.BankAccountCreateWithdrawalRequest, - ): Promise<HttpResponseOk<SandboxBackend.Access.BankAccountCreateWithdrawalResponse>> => { - const res = await request<SandboxBackend.Access.BankAccountCreateWithdrawalResponse>(`access-api/accounts/${account}/withdrawals`, { - method: "POST", - data, - contentType: "json" - }); + ): Promise< + HttpResponseOk<SandboxBackend.Access.BankAccountCreateWithdrawalResponse> + > => { + const res = + await request<SandboxBackend.Access.BankAccountCreateWithdrawalResponse>( + `access-api/accounts/${account}/withdrawals`, + { + method: "POST", + data, + contentType: "json", + }, + ); return res; }; - const abortWithdrawal = async ( - id: string, - ): Promise<HttpResponseOk<void>> => { - const res = await request<void>(`access-api/accounts/${account}/withdrawals/${id}`, { - method: "POST", - contentType: "json" - }); + const abortWithdrawal = async (id: string): Promise<HttpResponseOk<void>> => { + const res = await request<void>( + `access-api/accounts/${account}/withdrawals/${id}`, + { + method: "POST", + contentType: "json", + }, + ); await mutateAll(/.*accounts\/.*\/withdrawals\/.*/); return res; }; const confirmWithdrawal = async ( id: string, ): Promise<HttpResponseOk<void>> => { - const res = await request<void>(`access-api/accounts/${account}/withdrawals/${id}`, { - method: "POST", - contentType: "json" - }); + const res = await request<void>( + `access-api/accounts/${account}/withdrawals/${id}`, + { + method: "POST", + contentType: "json", + }, + ); await mutateAll(/.*accounts\/.*\/withdrawals\/.*/); return res; }; const createTransaction = async ( - data: SandboxBackend.Access.CreateBankAccountTransactionCreate + data: SandboxBackend.Access.CreateBankAccountTransactionCreate, ): Promise<HttpResponseOk<void>> => { - const res = await request<void>(`access-api/accounts/${account}/transactions`, { - method: "POST", - data, - contentType: "json" - }); + const res = await request<void>( + `access-api/accounts/${account}/transactions`, + { + method: "POST", + data, + contentType: "json", + }, + ); await mutateAll(/.*accounts\/.*\/transactions.*/); return res; }; - const deleteAccount = async ( - ): Promise<HttpResponseOk<void>> => { + const deleteAccount = async (): Promise<HttpResponseOk<void>> => { const res = await request<void>(`access-api/accounts/${account}`, { method: "DELETE", - contentType: "json" + contentType: "json", }); await mutateAll(/.*accounts\/.*/); return res; }; - return { abortWithdrawal, confirmWithdrawal, createWithdrawal, createTransaction, deleteAccount }; + return { + abortWithdrawal, + confirmWithdrawal, + createWithdrawal, + createTransaction, + deleteAccount, + }; } export function useTestingAPI(): TestingAPI { const mutateAll = useMatchMutate(); const { request: noAuthRequest } = usePublicBackend(); const register = async ( - data: SandboxBackend.Access.BankRegistrationRequest + data: SandboxBackend.Access.BankRegistrationRequest, ): Promise<HttpResponseOk<void>> => { const res = await noAuthRequest<void>(`access-api/testing/register`, { method: "POST", data, - contentType: "json" + contentType: "json", }); await mutateAll(/.*accounts\/.*/); return res; @@ -107,25 +129,22 @@ export function useTestingAPI(): TestingAPI { return { register }; } - export interface TestingAPI { register: ( - data: SandboxBackend.Access.BankRegistrationRequest + data: SandboxBackend.Access.BankRegistrationRequest, ) => Promise<HttpResponseOk<void>>; } export interface AccessAPI { createWithdrawal: ( data: SandboxBackend.Access.BankAccountCreateWithdrawalRequest, - ) => Promise<HttpResponseOk<SandboxBackend.Access.BankAccountCreateWithdrawalResponse>>; - abortWithdrawal: ( - wid: string, - ) => Promise<HttpResponseOk<void>>; - confirmWithdrawal: ( - wid: string - ) => Promise<HttpResponseOk<void>>; + ) => Promise< + HttpResponseOk<SandboxBackend.Access.BankAccountCreateWithdrawalResponse> + >; + abortWithdrawal: (wid: string) => Promise<HttpResponseOk<void>>; + confirmWithdrawal: (wid: string) => Promise<HttpResponseOk<void>>; createTransaction: ( - data: SandboxBackend.Access.CreateBankAccountTransactionCreate + data: SandboxBackend.Access.CreateBankAccountTransactionCreate, ) => Promise<HttpResponseOk<void>>; deleteAccount: () => Promise<HttpResponseOk<void>>; } @@ -135,13 +154,17 @@ export interface InstanceTemplateFilter { position?: string; } - -export function useAccountDetails(account: string): HttpResponse<SandboxBackend.Access.BankAccountBalanceResponse, SandboxBackend.SandboxError> { +export function useAccountDetails( + account: string, +): HttpResponse< + SandboxBackend.Access.BankAccountBalanceResponse, + SandboxBackend.SandboxError +> { const { fetcher } = useAuthenticatedBackend(); const { data, error } = useSWR< HttpResponseOk<SandboxBackend.Access.BankAccountBalanceResponse>, - HttpError<SandboxBackend.SandboxError> + RequestError<SandboxBackend.SandboxError> >([`access-api/accounts/${account}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -155,17 +178,23 @@ export function useAccountDetails(account: string): HttpResponse<SandboxBackend. }); if (data) return data; - if (error) return error; + if (error) return error.info; return { loading: true }; } // FIXME: should poll -export function useWithdrawalDetails(account: string, wid: string): HttpResponse<SandboxBackend.Access.BankAccountGetWithdrawalResponse, SandboxBackend.SandboxError> { +export function useWithdrawalDetails( + account: string, + wid: string, +): HttpResponse< + SandboxBackend.Access.BankAccountGetWithdrawalResponse, + SandboxBackend.SandboxError +> { const { fetcher } = useAuthenticatedBackend(); const { data, error } = useSWR< HttpResponseOk<SandboxBackend.Access.BankAccountGetWithdrawalResponse>, - HttpError<SandboxBackend.SandboxError> + RequestError<SandboxBackend.SandboxError> >([`access-api/accounts/${account}/withdrawals/${wid}`], fetcher, { refreshInterval: 1000, refreshWhenHidden: false, @@ -176,21 +205,26 @@ export function useWithdrawalDetails(account: string, wid: string): HttpResponse errorRetryInterval: 1, shouldRetryOnError: false, keepPreviousData: true, - }); // if (isValidating) return { loading: true, data: data?.data }; if (data) return data; - if (error) return error; + if (error) return error.info; return { loading: true }; } -export function useTransactionDetails(account: string, tid: string): HttpResponse<SandboxBackend.Access.BankAccountTransactionInfo, SandboxBackend.SandboxError> { +export function useTransactionDetails( + account: string, + tid: string, +): HttpResponse< + SandboxBackend.Access.BankAccountTransactionInfo, + SandboxBackend.SandboxError +> { const { fetcher } = useAuthenticatedBackend(); const { data, error } = useSWR< HttpResponseOk<SandboxBackend.Access.BankAccountTransactionInfo>, - HttpError<SandboxBackend.SandboxError> + RequestError<SandboxBackend.SandboxError> >([`access-api/accounts/${account}/transactions/${tid}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -205,17 +239,20 @@ export function useTransactionDetails(account: string, tid: string): HttpRespons // if (isValidating) return { loading: true, data: data?.data }; if (data) return data; - if (error) return error; + if (error) return error.info; return { loading: true }; } interface PaginationFilter { - page: number, + page: number; } export function usePublicAccounts( args?: PaginationFilter, -): HttpResponsePaginated<SandboxBackend.Access.PublicAccountsResponse, SandboxBackend.SandboxError> { +): HttpResponsePaginated< + SandboxBackend.Access.PublicAccountsResponse, + SandboxBackend.SandboxError +> { const { paginatedFetcher } = usePublicBackend(); const [page, setPage] = useState(1); @@ -226,18 +263,21 @@ export function usePublicAccounts( isValidating: loadingAfter, } = useSWR< HttpResponseOk<SandboxBackend.Access.PublicAccountsResponse>, - HttpError<SandboxBackend.SandboxError> + RequestError<SandboxBackend.SandboxError> >([`public-accounts`, args?.page, PAGE_SIZE], paginatedFetcher); const [lastAfter, setLastAfter] = useState< - HttpResponse<SandboxBackend.Access.PublicAccountsResponse, SandboxBackend.SandboxError> + HttpResponse< + SandboxBackend.Access.PublicAccountsResponse, + SandboxBackend.SandboxError + > >({ loading: true }); useEffect(() => { if (afterData) setLastAfter(afterData); }, [afterData]); - if (afterError) return afterError; + if (afterError) return afterError.info; // if the query returns less that we ask, then we have reach the end or beginning const isReachingEnd = @@ -254,30 +294,33 @@ export function usePublicAccounts( } }, loadMorePrev: () => { - null + null; }, }; - const publicAccounts = !afterData ? [] : (afterData || lastAfter).data.publicAccounts; - if (loadingAfter) - return { loading: true, data: { publicAccounts } }; + const publicAccounts = !afterData + ? [] + : (afterData || lastAfter).data.publicAccounts; + if (loadingAfter) return { loading: true, data: { publicAccounts } }; if (afterData) { return { ok: true, data: { publicAccounts }, ...pagination }; } return { loading: true }; } - /** * FIXME: mutate result when balance change (transaction ) - * @param account - * @param args - * @returns + * @param account + * @param args + * @returns */ export function useTransactions( account: string, args?: PaginationFilter, -): HttpResponsePaginated<SandboxBackend.Access.BankAccountTransactionsResponse, SandboxBackend.SandboxError> { +): HttpResponsePaginated< + SandboxBackend.Access.BankAccountTransactionsResponse, + SandboxBackend.SandboxError +> { const { paginatedFetcher } = useAuthenticatedBackend(); const [page, setPage] = useState(1); @@ -288,18 +331,24 @@ export function useTransactions( isValidating: loadingAfter, } = useSWR< HttpResponseOk<SandboxBackend.Access.BankAccountTransactionsResponse>, - HttpError<SandboxBackend.SandboxError> - >([`access-api/accounts/${account}/transactions`, args?.page, PAGE_SIZE], paginatedFetcher); + RequestError<SandboxBackend.SandboxError> + >( + [`access-api/accounts/${account}/transactions`, args?.page, PAGE_SIZE], + paginatedFetcher, + ); const [lastAfter, setLastAfter] = useState< - HttpResponse<SandboxBackend.Access.BankAccountTransactionsResponse, SandboxBackend.SandboxError> + HttpResponse< + SandboxBackend.Access.BankAccountTransactionsResponse, + SandboxBackend.SandboxError + > >({ loading: true }); useEffect(() => { if (afterData) setLastAfter(afterData); }, [afterData]); - if (afterError) return afterError; + if (afterError) return afterError.info; // if the query returns less that we ask, then we have reach the end or beginning const isReachingEnd = @@ -316,13 +365,14 @@ export function useTransactions( } }, loadMorePrev: () => { - null + null; }, }; - const transactions = !afterData ? [] : (afterData || lastAfter).data.transactions; - if (loadingAfter) - return { loading: true, data: { transactions } }; + const transactions = !afterData + ? [] + : (afterData || lastAfter).data.transactions; + if (loadingAfter) return { loading: true, data: { transactions } }; if (afterData) { return { ok: true, data: { transactions }, ...pagination }; } |