Spaces:
Running
Running
File size: 3,797 Bytes
b89a86e 1684141 b89a86e 1684141 b89a86e 1684141 b89a86e 1684141 b89a86e 1684141 b89a86e 1684141 b89a86e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import { createContext, useContext, useState, useEffect, ReactNode } from "react";
import { AuthUser, AuthSeller } from "@/types";
interface AuthContextType {
user: AuthUser | null;
seller: AuthSeller | null;
token: string | null;
userType: 'user' | 'seller' | 'admin' | null;
login: (token: string, userData: AuthUser) => void;
sellerLogin: (token: string, sellerData: AuthSeller) => void;
adminLogin: () => void;
logout: () => void;
isAuthenticated: boolean;
isLoading: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<AuthUser | null>(null);
const [seller, setSeller] = useState<AuthSeller | null>(null);
const [token, setToken] = useState<string | null>(null);
const [userType, setUserType] = useState<'user' | 'seller' | 'admin' | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(true);
useEffect(() => {
const verifyToken = async () => {
const savedToken = localStorage.getItem('token');
if (savedToken) {
try {
// Verify token with backend
const response = await fetch('/api/auth/verify', {
headers: {
'Authorization': `Bearer ${savedToken}`,
},
});
if (response.ok) {
const data = await response.json();
setToken(savedToken);
setUserType(data.userType);
if (data.user) {
setUser(data.user);
localStorage.setItem('user', JSON.stringify(data.user));
} else if (data.seller) {
setSeller(data.seller);
localStorage.setItem('seller', JSON.stringify(data.seller));
}
localStorage.setItem('userType', data.userType);
} else {
// Token is invalid or expired, clear everything
logout();
}
} catch (error) {
// Network error or other issues, clear auth state
console.error('Token verification failed:', error);
logout();
}
}
// Set loading to false after token verification completes
setIsLoading(false);
};
verifyToken();
}, []);
const login = (token: string, userData: AuthUser) => {
setToken(token);
setUser(userData);
setUserType('user');
localStorage.setItem('token', token);
localStorage.setItem('user', JSON.stringify(userData));
localStorage.setItem('userType', 'user');
};
const sellerLogin = (token: string, sellerData: AuthSeller) => {
setToken(token);
setSeller(sellerData);
setUserType('seller');
localStorage.setItem('token', token);
localStorage.setItem('seller', JSON.stringify(sellerData));
localStorage.setItem('userType', 'seller');
};
const adminLogin = () => {
setUserType('admin');
localStorage.setItem('userType', 'admin');
};
const logout = () => {
setToken(null);
setUser(null);
setSeller(null);
setUserType(null);
localStorage.removeItem('token');
localStorage.removeItem('user');
localStorage.removeItem('seller');
localStorage.removeItem('userType');
};
const isAuthenticated = Boolean(token || userType === 'admin');
return (
<AuthContext.Provider value={{
user,
seller,
token,
userType,
login,
sellerLogin,
adminLogin,
logout,
isAuthenticated,
isLoading,
}}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (context === undefined) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
}
|