fix(app): show loader during protected boot
Some checks failed
Frontend CI/CD / build (push) Has been cancelled
Frontend CI/CD / deploy (push) Has been cancelled

This commit is contained in:
2026-06-20 19:55:11 +03:30
parent f7238d1767
commit 1aa45beba4
4 changed files with 80 additions and 70 deletions

View File

@@ -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>
);