56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
import { isAxiosError } from "axios";
|
|
import { useEffect, useLayoutEffect, useRef } from "react";
|
|
import { UserAccount } from "../model/account";
|
|
import { makeRequest } from "../api/makeRequest";
|
|
import { devlog } from "../utils/devlog";
|
|
import { createUserAccount } from "../api/account";
|
|
|
|
|
|
export function useUserAccountFetcher<T = UserAccount>({ onError, onNewUserAccount, versionOfCustomer="v1.0.0", url, userId }: {
|
|
url: string;
|
|
userId: string | null;
|
|
versionOfCustomer?: string;
|
|
onNewUserAccount: (response: T) => void;
|
|
onError?: (error: any) => void;
|
|
}) {
|
|
const onNewUserAccountRef = useRef(onNewUserAccount);
|
|
const onErrorRef = useRef(onError);
|
|
|
|
useLayoutEffect(() => {
|
|
onNewUserAccountRef.current = onNewUserAccount;
|
|
onErrorRef.current = onError;
|
|
}, [onError, onNewUserAccount]);
|
|
|
|
useEffect(() => {
|
|
if (!userId) return;
|
|
|
|
const controller = new AbortController();
|
|
makeRequest<never, T>({
|
|
url,
|
|
contentType: true,
|
|
method: "GET",
|
|
useToken: true,
|
|
withCredentials: false,
|
|
signal: controller.signal,
|
|
}).then(result => {
|
|
devlog("User account", result);
|
|
onNewUserAccountRef.current(result);
|
|
}).catch(error => {
|
|
devlog("Error fetching user account", error);
|
|
if (isAxiosError(error) && error.response?.status === 404) {
|
|
createUserAccount(controller.signal, url, versionOfCustomer).then(result => {
|
|
devlog("Created user account", result);
|
|
onNewUserAccountRef.current(result as T);
|
|
}).catch(error => {
|
|
devlog("Error creating user account", error);
|
|
onErrorRef.current?.(error);
|
|
});
|
|
} else {
|
|
onErrorRef.current?.(error);
|
|
}
|
|
});
|
|
|
|
return () => controller.abort();
|
|
}, [url, userId]);
|
|
}
|