UI/api: add api client provider

This allows to switch out the used api backend for testing purposes.
Or for different plattforms
This commit is contained in:
Johannes Kirschbauer
2025-08-07 12:44:43 +02:00
parent a814a44bc6
commit dc7291c62b
2 changed files with 38 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
import { createContext, JSX, useContext } from "solid-js";
import { ApiCall, OperationArgs, OperationNames } from "./api";
export interface ApiClient {
fetch: Fetcher;
}
export type Fetcher = <K extends OperationNames>(
method: K,
args: OperationArgs<K>,
) => ApiCall<K>;
const ApiClientContext = createContext<ApiClient>();
interface ApiClientProviderProps {
client: ApiClient;
children: JSX.Element;
}
export const ApiClientProvider = (props: ApiClientProviderProps) => {
return (
<ApiClientContext.Provider value={props.client}>
{props.children}
</ApiClientContext.Provider>
);
};
export const useApiClient = () => {
const client = useContext(ApiClientContext);
if (!client) {
throw new Error("useApiClient must be used within an ApiClientProvider");
}
return client;
};

View File

@@ -49,6 +49,11 @@ export interface ApiCall<K extends OperationNames> {
cancel: () => Promise<void>;
}
/**
* Do not use this function directly, use `useApiClient` function instead.
* This allows mocking the result in tests.
* Or switch to different client implementations.
*/
export const callApi = <K extends OperationNames>(
method: K,
args: OperationArgs<K>,