UIKit/lib/hooks/useUserAccountFetcher.ts

56 lines
1.9 KiB
TypeScript
Raw Normal View History

2023-08-28 14:29:26 +00:00
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";
2024-08-21 08:12:29 +00:00
export function useUserAccountFetcher<T = UserAccount>({ onError, onNewUserAccount, versionOfCustomer="v1.0.0", url, userId }: {
2023-08-28 14:29:26 +00:00
url: string;
userId: string | null;
2024-07-24 17:16:03 +00:00
versionOfCustomer?: string;
2024-08-21 08:12:29 +00:00
onNewUserAccount: (response: T) => void;
2023-08-28 14:29:26 +00:00
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();
2024-08-21 08:12:29 +00:00
makeRequest<never, T>({
2023-08-28 14:29:26 +00:00
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) {
2024-07-24 17:16:03 +00:00
createUserAccount(controller.signal, url, versionOfCustomer).then(result => {
2023-08-28 14:29:26 +00:00
devlog("Created user account", result);
2024-08-21 08:12:29 +00:00
onNewUserAccountRef.current(result as T);
2023-08-28 14:29:26 +00:00
}).catch(error => {
devlog("Error creating user account", error);
onErrorRef.current?.(error);
});
} else {
onErrorRef.current?.(error);
}
});
return () => controller.abort();
}, [url, userId]);
}