graph-rag / frontend-react /src /context /AuthContext.tsx
GitHub Action
Automated sync to Hugging Face
674fb4e
import React, { createContext, useContext, useState, useEffect } from 'react';
// This acts as our authentication context for the React application
interface User {
username: string;
email?: string;
full_name?: string;
scopes: string[];
}
interface AuthContextType {
token: string | null;
user: User | null;
login: (token: string, user: User) => void;
logout: () => void;
isAuthenticated: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [token, setToken] = useState<string | null>(localStorage.getItem('token'));
const [user, setUser] = useState<User | null>(null);
useEffect(() => {
const storedUser = localStorage.getItem('user');
if (storedUser) {
try {
setUser(JSON.parse(storedUser));
} catch (e) {
console.error('Failed to parse stored user', e);
}
}
}, []);
const login = (newToken: string, newUser: User) => {
localStorage.setItem('token', newToken);
localStorage.setItem('user', JSON.stringify(newUser));
setToken(newToken);
setUser(newUser);
};
const logout = () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
setToken(null);
setUser(null);
};
return (
<AuthContext.Provider value={{ token, user, login, logout, isAuthenticated: !!token }}>
{children}
</AuthContext.Provider>
);
};
export const useAuth = () => {
const context = useContext(AuthContext);
if (context === undefined) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};