shinkan-jinkendo/frontend/src/context/AuthContext.jsx

76 lines
1.5 KiB
React
Raw Normal View History

import { createContext, useContext, useState, useEffect } from 'react'
const AuthContext = createContext(null)
export function AuthProvider({ children }) {
const [user, setUser] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
checkAuth()
}, [])
const checkAuth = async () => {
const token = localStorage.getItem('authToken')
if (!token) {
setLoading(false)
return
}
try {
const response = await fetch('/api/profiles/me', {
headers: {
'X-Auth-Token': token
}
})
if (response.ok) {
const profile = await response.json()
setUser(profile)
} else {
// Token invalid
localStorage.removeItem('authToken')
}
} catch (err) {
console.error('Auth check failed:', err)
localStorage.removeItem('authToken')
} finally {
setLoading(false)
}
}
const login = (data) => {
setUser(data.profile || data)
}
const logout = () => {
setUser(null)
localStorage.removeItem('authToken')
}
const value = {
user,
isAuthenticated: !!user,
loading,
login,
logout,
checkAuth
}
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
)
}
export function useAuth() {
const context = useContext(AuthContext)
if (!context) {
throw new Error('useAuth must be used within AuthProvider')
}
return context
}
export default AuthContext