diff options
Diffstat (limited to 'packages/demobank-ui/src/hooks/circuit.ts')
-rw-r--r-- | packages/demobank-ui/src/hooks/circuit.ts | 151 |
1 files changed, 89 insertions, 62 deletions
diff --git a/packages/demobank-ui/src/hooks/circuit.ts b/packages/demobank-ui/src/hooks/circuit.ts index 6e9ada601..91922a6ba 100644 --- a/packages/demobank-ui/src/hooks/circuit.ts +++ b/packages/demobank-ui/src/hooks/circuit.ts @@ -15,23 +15,24 @@ */ import { - HttpError, HttpResponse, HttpResponseOk, HttpResponsePaginated, - RequestError + RequestError, + useApiContext, } from "@gnu-taler/web-util/lib/index.browser"; import { useEffect, useMemo, 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 } from "./backend.js"; +import { useAuthenticatedBackend, useMatchMutate } from "./backend.js"; export function useAdminAccountAPI(): AdminAccountAPI { const { request } = useAuthenticatedBackend(); - const { state } = useBackendContext() + const mutateAll = useMatchMutate(); + 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 createAccount = async ( @@ -40,8 +41,9 @@ export function useAdminAccountAPI(): AdminAccountAPI { const res = await request<void>(`circuit-api/accounts`, { method: "POST", data, - contentType: "json" + contentType: "json", }); + await mutateAll(/.*circuit-api\/accounts.*/); return res; }; @@ -52,8 +54,9 @@ export function useAdminAccountAPI(): AdminAccountAPI { const res = await request<void>(`circuit-api/accounts/${account}`, { method: "PATCH", data, - contentType: "json" + contentType: "json", }); + await mutateAll(/.*circuit-api\/accounts.*/); return res; }; const deleteAccount = async ( @@ -61,8 +64,9 @@ export function useAdminAccountAPI(): AdminAccountAPI { ): Promise<HttpResponseOk<void>> => { const res = await request<void>(`circuit-api/accounts/${account}`, { method: "DELETE", - contentType: "json" + contentType: "json", }); + await mutateAll(/.*circuit-api\/accounts.*/); return res; }; const changePassword = async ( @@ -72,7 +76,7 @@ export function useAdminAccountAPI(): AdminAccountAPI { const res = await request<void>(`circuit-api/accounts/${account}/auth`, { method: "PATCH", data, - contentType: "json" + contentType: "json", }); return res; }; @@ -82,9 +86,10 @@ export function useAdminAccountAPI(): AdminAccountAPI { export function useCircuitAccountAPI(): CircuitAccountAPI { const { request } = useAuthenticatedBackend(); - const { state } = useBackendContext() + const mutateAll = useMatchMutate(); + 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; @@ -94,8 +99,9 @@ export function useCircuitAccountAPI(): CircuitAccountAPI { const res = await request<void>(`circuit-api/accounts/${account}`, { method: "PATCH", data, - contentType: "json" + contentType: "json", }); + await mutateAll(/.*circuit-api\/accounts.*/); return res; }; const changePassword = async ( @@ -104,7 +110,7 @@ export function useCircuitAccountAPI(): CircuitAccountAPI { const res = await request<void>(`circuit-api/accounts/${account}/auth`, { method: "PATCH", data, - contentType: "json" + contentType: "json", }); return res; }; @@ -120,57 +126,72 @@ export interface AdminAccountAPI { updateAccount: ( account: string, - data: SandboxBackend.Circuit.CircuitAccountReconfiguration + data: SandboxBackend.Circuit.CircuitAccountReconfiguration, ) => Promise<HttpResponseOk<void>>; changePassword: ( account: string, - data: SandboxBackend.Circuit.AccountPasswordChange + data: SandboxBackend.Circuit.AccountPasswordChange, ) => Promise<HttpResponseOk<void>>; } export interface CircuitAccountAPI { updateAccount: ( - data: SandboxBackend.Circuit.CircuitAccountReconfiguration + data: SandboxBackend.Circuit.CircuitAccountReconfiguration, ) => Promise<HttpResponseOk<void>>; changePassword: ( - data: SandboxBackend.Circuit.AccountPasswordChange + data: SandboxBackend.Circuit.AccountPasswordChange, ) => Promise<HttpResponseOk<void>>; } - export interface InstanceTemplateFilter { //FIXME: add filter to the template list position?: string; } - -export function useMyAccountDetails(): HttpResponse<SandboxBackend.Circuit.CircuitAccountData, SandboxBackend.SandboxError> { - const { fetcher } = useAuthenticatedBackend(); - const { state } = useBackendContext() - if (state.status === "loggedOut") { - throw Error("can't access my-account-details when logged out") +async function getBusinessStatus( + request: ReturnType<typeof useApiContext>["request"], + url: string, + basicAuth: { username: string; password: string }, +): Promise<boolean> { + try { + const result = await request< + HttpResponseOk<SandboxBackend.Circuit.CircuitAccountData> + >(url, `circuit-api/accounts/${basicAuth.username}`, { basicAuth }); + return result.ok; + } catch (error) { + return false; } - const { data, error } = useSWR< - HttpResponseOk<SandboxBackend.Circuit.CircuitAccountData>, - HttpError<SandboxBackend.SandboxError> - >([`accounts/${state.username}`], fetcher, { - refreshInterval: 0, - refreshWhenHidden: false, - revalidateOnFocus: false, - revalidateOnReconnect: false, - refreshWhenOffline: false, - errorRetryCount: 0, - errorRetryInterval: 1, - shouldRetryOnError: false, - keepPreviousData: true, +} + +export function useBusinessAccountFlag(): boolean | undefined { + const [isBusiness, setIsBusiness] = useState<boolean | undefined>(); + const { state } = useBackendContext(); + const { request } = useApiContext(); + const creds = + state.status === "loggedOut" + ? undefined + : { username: state.username, password: state.password }; + + useEffect(() => { + if (!creds) return; + getBusinessStatus(request, state.url, creds) + .then((result) => { + setIsBusiness(result); + }) + .catch((error) => { + setIsBusiness(false); + }); }); - if (data) return data; - if (error) return error; - return { loading: true }; + return isBusiness; } -export function useAccountDetails(account: string): HttpResponse<SandboxBackend.Circuit.CircuitAccountData, SandboxBackend.SandboxError> { +export function useBusinessAccountDetails( + account: string, +): HttpResponse< + SandboxBackend.Circuit.CircuitAccountData, + SandboxBackend.SandboxError +> { const { fetcher } = useAuthenticatedBackend(); const { data, error } = useSWR< @@ -188,20 +209,22 @@ export function useAccountDetails(account: string): HttpResponse<SandboxBackend. keepPreviousData: true, }); - // if (isValidating) return { loading: true, data: data?.data }; if (data) return data; if (error) return error.info; return { loading: true }; } interface PaginationFilter { - account?: string, - page?: number, + account?: string; + page?: number; } -export function useAccounts( +export function useBusinessAccounts( args?: PaginationFilter, -): HttpResponsePaginated<SandboxBackend.Circuit.CircuitAccounts, SandboxBackend.SandboxError> { +): HttpResponsePaginated< + SandboxBackend.Circuit.CircuitAccounts, + SandboxBackend.SandboxError +> { const { sandboxAccountsFetcher } = useAuthenticatedBackend(); const [page, setPage] = useState(0); @@ -212,17 +235,21 @@ export function useAccounts( } = useSWR< HttpResponseOk<SandboxBackend.Circuit.CircuitAccounts>, RequestError<SandboxBackend.SandboxError> - >([`circuit-api/accounts`, args?.page, PAGE_SIZE, args?.account], sandboxAccountsFetcher, { - refreshInterval: 0, - refreshWhenHidden: false, - revalidateOnFocus: false, - revalidateOnReconnect: false, - refreshWhenOffline: false, - errorRetryCount: 0, - errorRetryInterval: 1, - shouldRetryOnError: false, - keepPreviousData: true, - }); + >( + [`circuit-api/accounts`, args?.page, PAGE_SIZE, args?.account], + sandboxAccountsFetcher, + { + refreshInterval: 0, + refreshWhenHidden: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + refreshWhenOffline: false, + errorRetryCount: 0, + errorRetryInterval: 1, + shouldRetryOnError: false, + keepPreviousData: true, + }, + ); // const [lastAfter, setLastAfter] = useState< // HttpResponse<SandboxBackend.Circuit.CircuitAccounts, SandboxBackend.SandboxError> @@ -247,18 +274,18 @@ export function useAccounts( } }, loadMorePrev: () => { - null + null; }, }; const result = useMemo(() => { - const customers = !afterData ? [] : (afterData)?.data?.customers ?? []; - return { ok: true as const, data: { customers }, ...pagination } - }, [afterData?.data]) + const customers = !afterData ? [] : afterData?.data?.customers ?? []; + return { ok: true as const, data: { customers }, ...pagination }; + }, [afterData?.data]); if (afterError) return afterError.info; if (afterData) { - return result + return result; } // if (loadingAfter) |