UNPKG

ajinkya-mhetre-mern

Version:

A MERN starter with frontend and backend folders

88 lines (77 loc) 2.12 kB
// 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> ) }