aboutsummaryrefslogtreecommitdiff
path: root/packages/demobank-ui/src/hooks/circuit.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/demobank-ui/src/hooks/circuit.ts')
-rw-r--r--packages/demobank-ui/src/hooks/circuit.ts151
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)