fix(app): show loader during protected boot
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { createContext, useContext, useState, useEffect, type ReactNode } from 'react';
|
||||
import { createContext, useContext, useState, useEffect, type Dispatch, type ReactNode, type SetStateAction } from 'react';
|
||||
import { getUserProfile } from '../api/users';
|
||||
|
||||
interface User {
|
||||
@@ -14,6 +14,8 @@ interface User {
|
||||
|
||||
interface AppContextType {
|
||||
user: User | null;
|
||||
isLoadingUser: boolean;
|
||||
setUser: Dispatch<SetStateAction<User | null>>;
|
||||
refreshUser: () => Promise<void>;
|
||||
}
|
||||
|
||||
@@ -21,14 +23,24 @@ const AppContext = createContext<AppContextType | null>(null);
|
||||
|
||||
export const AppProvider = ({ children }: { children: ReactNode }) => {
|
||||
const [user, setUser] = useState<User | null>(null);
|
||||
const [isLoadingUser, setIsLoadingUser] = useState(() => Boolean(localStorage.getItem('accessToken')));
|
||||
|
||||
const refreshUser = async () => {
|
||||
if (!localStorage.getItem('accessToken')) {
|
||||
setUser(null);
|
||||
setIsLoadingUser(false);
|
||||
return;
|
||||
}
|
||||
|
||||
setIsLoadingUser(true);
|
||||
try {
|
||||
const userData = await getUserProfile();
|
||||
setUser(userData);
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch user context data:", error);
|
||||
setUser(null);
|
||||
} finally {
|
||||
setIsLoadingUser(false);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -38,8 +50,19 @@ export const AppProvider = ({ children }: { children: ReactNode }) => {
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const handleProfileUpdated = ((event: CustomEvent<Partial<User>>) => {
|
||||
if (event.detail) {
|
||||
setUser((current) => (current ? { ...current, ...event.detail } : current));
|
||||
}
|
||||
}) as EventListener;
|
||||
|
||||
window.addEventListener("profile_updated", handleProfileUpdated);
|
||||
return () => window.removeEventListener("profile_updated", handleProfileUpdated);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<AppContext.Provider value={{ user, refreshUser }}>
|
||||
<AppContext.Provider value={{ user, isLoadingUser, setUser, refreshUser }}>
|
||||
{children}
|
||||
</AppContext.Provider>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user