| import React, { createContext, useContext, useState, useEffect } from 'react'; |
|
|
| |
|
|
| 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; |
| }; |
|
|