'use client'; import { createContext, useContext, useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { authApi, setGlobalAuthFailureHandler, setCurrentLibraryId } from '../lib/api'; import { preloadSanitizationConfig } from '../lib/sanitization'; interface AuthContextType { isAuthenticated: boolean; login: (password: string) => Promise; logout: () => void; loading: boolean; } const AuthContext = createContext(undefined); export function AuthProvider({ children }: { children: React.ReactNode }) { const [isAuthenticated, setIsAuthenticated] = useState(false); const [loading, setLoading] = useState(true); const router = useRouter(); // Handle authentication failures from API calls const handleAuthFailure = () => { console.log('Authentication token expired, logging out user'); setIsAuthenticated(false); router.push('/login'); }; useEffect(() => { // Register the auth failure handler for API interceptor setGlobalAuthFailureHandler(handleAuthFailure); // Check if user is already authenticated on app load const checkAuth = async () => { try { const authenticated = authApi.isAuthenticated(); setIsAuthenticated(authenticated); // If authenticated, also load current library for image URLs if (authenticated) { try { const response = await fetch('/api/libraries/current'); if (response.ok) { const library = await response.json(); setCurrentLibraryId(library.id); } } catch (error) { console.error('Failed to load current library:', error); } } } catch (error) { console.error('Auth check failed:', error); setIsAuthenticated(false); } finally { setLoading(false); } }; // Preload sanitization config for content formatting const loadSanitizationConfig = async () => { try { await preloadSanitizationConfig(); } catch (error) { console.error('Failed to preload sanitization config:', error); } }; checkAuth(); loadSanitizationConfig(); }, [router]); const login = async (password: string) => { try { await authApi.login(password); setIsAuthenticated(true); // Load current library after successful login try { const response = await fetch('/api/libraries/current'); if (response.ok) { const library = await response.json(); setCurrentLibraryId(library.id); } } catch (error) { console.error('Failed to load current library after login:', error); } } catch (error) { console.error('Login failed:', error); throw error; } }; const logout = () => { authApi.logout(); setIsAuthenticated(false); router.push('/login'); }; return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }