ajinkya-mhetre-mern
Version:
A MERN starter with frontend and backend folders
88 lines (77 loc) • 2.12 kB
JSX
// src/contexts/AuthContext.jsx
import React, { createContext, useContext, useState, useEffect } from 'react'
import { useNavigate } from 'react-router-dom'
const AuthContext = createContext()
export const useAuth = () => {
const context = useContext(AuthContext)
if (!context) {
throw new Error('useAuth must be used within an AuthProvider')
}
return context
}
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null)
const [token, setToken] = useState(null)
const [loading, setLoading] = useState(true)
const navigate = useNavigate()
useEffect(() => {
// Check for stored auth data on app load
const storedToken = localStorage.getItem('authToken')
const storedUser = localStorage.getItem('user')
if (storedToken && storedUser) {
try {
setToken(storedToken)
setUser(JSON.parse(storedUser))
} catch (error) {
// Clear invalid stored data
localStorage.removeItem('authToken')
localStorage.removeItem('user')
}
}
setLoading(false)
}, [])
const login = (loginResponse) => {
const { token, user } = loginResponse
setToken(token)
setUser(user)
localStorage.setItem('authToken', token)
localStorage.setItem('user', JSON.stringify(user))
// Redirect based on role
switch (user.role) {
case 'admin':
navigate('/home')
break
case 'customer':
navigate('/home')
break
case 'farmer':
navigate('/home')
break
default:
navigate('/home')
}
}
const logout = () => {
setToken(null)
setUser(null)
localStorage.removeItem('authToken')
localStorage.removeItem('user')
navigate('/home')
}
const isAuthenticated = () => {
return !!(user && token)
}
const value = {
user,
token,
login,
logout,
loading,
isAuthenticated
}
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
)
}