mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-20 12:19:06 +00:00
* fix: unattended component reload due to session changes When the session is updated, status goes back to loading then authenticated or unauthenticated. session.accessTokenExpires may also be updated. This triggered various component refresh at unattented times, and brake the user experience. By splitting to only what's needed with memoization, it will prevent unattented refresh. * review * review: change syntax
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import { useSession, signOut } from "next-auth/react";
|
|
import { useContext, useEffect, useState } from "react";
|
|
import { DomainContext, featureEnabled } from "../domainContext";
|
|
import { OpenApi, DefaultService } from "../api";
|
|
import { CustomSession } from "./types";
|
|
import useSessionStatus from "./useSessionStatus";
|
|
import useSessionAccessToken from "./useSessionAccessToken";
|
|
|
|
export default function useApi(): DefaultService | null {
|
|
const api_url = useContext(DomainContext).api_url;
|
|
const [api, setApi] = useState<OpenApi | null>(null);
|
|
const { isLoading, isAuthenticated } = useSessionStatus();
|
|
const { accessToken, error } = useSessionAccessToken();
|
|
|
|
if (!api_url) throw new Error("no API URL");
|
|
|
|
useEffect(() => {
|
|
if (error === "RefreshAccessTokenError") {
|
|
signOut();
|
|
}
|
|
}, [error]);
|
|
|
|
useEffect(() => {
|
|
if (isLoading || (isAuthenticated && !accessToken)) {
|
|
return;
|
|
}
|
|
|
|
const openApi = new OpenApi({
|
|
BASE: api_url,
|
|
TOKEN: accessToken || undefined,
|
|
});
|
|
|
|
setApi(openApi);
|
|
}, [isLoading, isAuthenticated, accessToken]);
|
|
|
|
return api?.default ?? null;
|
|
}
|