<img width="1512" alt="image" src="https://github.com/user-attachments/assets/973df4a5-a12c-438c-87a8-3218e63d9998" />
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import { useCallback } from 'react';
|
|
import { useRecoilValue, useSetRecoilState } from 'recoil';
|
|
import { ClientConfig } from '~/generated/graphql';
|
|
import { clientConfigApiStatusState } from '../states/clientConfigApiStatusState';
|
|
import { getClientConfig } from '../utils/getClientConfig';
|
|
|
|
type UseClientConfigResult = {
|
|
data: { clientConfig: ClientConfig } | undefined;
|
|
loading: boolean;
|
|
error: Error | undefined;
|
|
fetchClientConfig: () => Promise<void>;
|
|
refetch: () => Promise<void>;
|
|
};
|
|
|
|
export const useClientConfig = (): UseClientConfigResult => {
|
|
const clientConfigApiStatus = useRecoilValue(clientConfigApiStatusState);
|
|
const setClientConfigApiStatus = useSetRecoilState(
|
|
clientConfigApiStatusState,
|
|
);
|
|
|
|
const fetchClientConfig = useCallback(async () => {
|
|
setClientConfigApiStatus((prev) => ({
|
|
...prev,
|
|
isLoading: true,
|
|
}));
|
|
|
|
try {
|
|
const clientConfig = await getClientConfig();
|
|
setClientConfigApiStatus((prev) => ({
|
|
...prev,
|
|
isLoading: false,
|
|
isLoadedOnce: true,
|
|
isErrored: false,
|
|
error: undefined,
|
|
data: { clientConfig },
|
|
}));
|
|
} catch (err) {
|
|
const error =
|
|
err instanceof Error ? err : new Error('Failed to fetch client config');
|
|
setClientConfigApiStatus((prev) => ({
|
|
...prev,
|
|
isLoading: false,
|
|
isErrored: true,
|
|
error,
|
|
}));
|
|
}
|
|
}, [setClientConfigApiStatus]);
|
|
|
|
return {
|
|
data: clientConfigApiStatus.data,
|
|
loading: clientConfigApiStatus.isLoading || false,
|
|
error: clientConfigApiStatus.error,
|
|
fetchClientConfig,
|
|
refetch: fetchClientConfig,
|
|
};
|
|
};
|