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:
33
pkgs/clan-app/ui/src/hooks/ApiClient.tsx
Normal file
33
pkgs/clan-app/ui/src/hooks/ApiClient.tsx
Normal 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;
|
||||||
|
};
|
||||||
@@ -49,6 +49,11 @@ export interface ApiCall<K extends OperationNames> {
|
|||||||
cancel: () => Promise<void>;
|
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>(
|
export const callApi = <K extends OperationNames>(
|
||||||
method: K,
|
method: K,
|
||||||
args: OperationArgs<K>,
|
args: OperationArgs<K>,
|
||||||
|
|||||||
Reference in New Issue
Block a user