Spaces:
Sleeping
Sleeping
File size: 1,837 Bytes
91d209c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
import { createContext, useContext, useState, useEffect, ReactNode } from 'react';
import { login as apiLogin, verifyAuth, logout as apiLogout, getCurrentUser } from '@/utils/api';
import type { LoginRequest, AuthUser } from '@/types';
interface AuthContextValue {
user: AuthUser | null;
loading: boolean;
login: (credentials: LoginRequest) => Promise<void>;
logout: () => void;
isAuthenticated: boolean;
}
const AuthContext = createContext<AuthContextValue | undefined>(undefined);
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<AuthUser | null>(null);
const [loading, setLoading] = useState(true);
// Check authentication on mount
useEffect(() => {
checkAuth();
}, []);
async function checkAuth() {
try {
const authUser = await verifyAuth();
if (authUser.authenticated) {
setUser(authUser);
} else {
setUser(null);
}
} catch {
setUser(null);
} finally {
setLoading(false);
}
}
async function login(credentials: LoginRequest) {
setLoading(true);
try {
await apiLogin(credentials);
const authUser = await getCurrentUser();
setUser(authUser);
} catch (error) {
setUser(null);
throw error;
} finally {
setLoading(false);
}
}
function logout() {
apiLogout();
setUser(null);
}
return (
<AuthContext.Provider
value={{
user,
loading,
login,
logout,
isAuthenticated: user?.authenticated ?? false,
}}
>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (context === undefined) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
}
|