Spaces:
Running
Running
import React, { createContext, useState, useEffect } from 'react'; | |
import type { ReactNode } from 'react'; | |
interface AdminContextType { | |
isAuthenticated: boolean; | |
isLoading: boolean; | |
login: (password: string) => Promise<boolean>; | |
logout: () => void; | |
verifyToken: () => Promise<void>; | |
} | |
export const AdminContext = createContext<AdminContextType | undefined>(undefined); | |
interface AdminProviderProps { | |
children: ReactNode; | |
} | |
export const AdminProvider: React.FC<AdminProviderProps> = ({ 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<boolean> => { | |
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 ( | |
<AdminContext.Provider value={value}> | |
{children} | |
</AdminContext.Provider> | |
); | |
}; | |