import React, { createContext, useState, useEffect } from 'react'; import type { ReactNode } from 'react'; interface AdminContextType { isAuthenticated: boolean; isLoading: boolean; login: (password: string) => Promise; logout: () => void; verifyToken: () => Promise; } export const AdminContext = createContext(undefined); interface AdminProviderProps { children: ReactNode; } export const AdminProvider: React.FC = ({ children }) => { const [isAuthenticated, setIsAuthenticated] = useState(false); const [isLoading, setIsLoading] = useState(true); const verifyToken = async () => { const adminToken = localStorage.getItem('adminToken'); if (!adminToken) { setIsAuthenticated(false); setIsLoading(false); return; } try { const response = await fetch('/api/admin/verify', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${adminToken}` } }); if (response.ok) { setIsAuthenticated(true); } else { // Token is invalid, remove it localStorage.removeItem('adminToken'); setIsAuthenticated(false); } } catch (error) { console.error('Error verifying admin token:', error); localStorage.removeItem('adminToken'); setIsAuthenticated(false); } finally { setIsLoading(false); } }; const login = async (password: string): Promise => { try { const response = await fetch('/api/admin/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ password }) }); if (response.ok) { const data = await response.json(); localStorage.setItem('adminToken', data.access_token); setIsAuthenticated(true); return true; } else { return false; } } catch (error) { console.error('Login error:', error); return false; } }; const logout = () => { localStorage.removeItem('adminToken'); setIsAuthenticated(false); }; // Check authentication status on mount useEffect(() => { verifyToken(); }, []); const value: AdminContextType = { isAuthenticated, isLoading, login, logout, verifyToken }; return ( {children} ); };