'use client'; import React, { createContext, useContext, useState, useEffect, useCallback } from 'react'; import api from '@/lib/api'; import { User } from '@/types'; interface AuthContextType { user: User | null; token: string | null; isLoading: boolean; isAuthenticated: boolean; login: (username: string, password: string, trustDevice?: boolean) => Promise; register: (username: string, password: string) => Promise; logout: () => void; refreshUser: () => Promise; } const AuthContext = createContext(undefined); export function AuthProvider({ children }: { children: React.ReactNode }) { const [user, setUser] = useState(null); const [token, setToken] = useState(null); const [isLoading, setIsLoading] = useState(true); const refreshUser = useCallback(async () => { const storedToken = api.auth.getToken(); if (!storedToken) { setIsLoading(false); return; } setToken(storedToken); try { const tokenParts = storedToken.split('.'); if (tokenParts.length === 3) { const payload = JSON.parse(atob(tokenParts[1])); const userId = payload.sub; if (userId) { const userData = await api.user.get(userId); setUser(userData); } } } catch (error) { console.error('Failed to refresh user:', error); api.auth.logout(); setToken(null); setUser(null); } finally { setIsLoading(false); } }, []); useEffect(() => { refreshUser(); }, [refreshUser]); const login = async (username: string, password: string, trustDevice = false) => { const result = await api.auth.login(username, password, trustDevice); const storedToken = api.auth.getToken(); setToken(storedToken); const tokenParts = storedToken!.split('.'); const payload = JSON.parse(atob(tokenParts[1])); const userId = payload.sub; if (userId) { const userData = await api.user.get(userId); setUser(userData); } }; const register = async (username: string, password: string) => { await api.auth.register(username, password); }; const logout = () => { api.auth.logout(); setToken(null); setUser(null); }; return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }