import React, { createContext, useContext, useState, useCallback } from "react";
import apiClient from "../api/axiosClient";
const AuthContext = createContext(null);
export function AuthProvider({ children }) {
const [user, setUser] = useState(() => {
const stored = localStorage.getItem("arshadproject_user");
return stored ? JSON.parse(stored) : null;
});
const [token, setToken] = useState(() =>
localStorage.getItem("arshadproject_token")
);
const persistSession = useCallback((newToken, newUser) => {
localStorage.setItem("arshadproject_token", newToken);
localStorage.setItem("arshadproject_user", JSON.stringify(newUser));
setToken(newToken);
setUser(newUser);
}, []);
const login = useCallback(
async (username, password) => {
const res = await apiClient.post("/auth/login", { username, password });
if (!res.data.success) {
throw new Error(res.data.message || "Login failed");
}
persistSession(res.data.data.token, res.data.data.user);
return res.data.data.user;
},
[persistSession]
);
const register = useCallback(
async (username, email, password, fullName) => {
const res = await apiClient.post("/auth/register", {
username,
email,
password,
fullName,
});
if (!res.data.success) {
throw new Error(res.data.message || "Registration failed");
}
persistSession(res.data.data.token, res.data.data.user);
return res.data.data.user;
},
[persistSession]
);
const updateUser = useCallback((updatedUser) => {
localStorage.setItem("arshadproject_user", JSON.stringify(updatedUser));
setUser(updatedUser);
}, []);
const logout = useCallback(() => {
localStorage.removeItem("arshadproject_token");
localStorage.removeItem("arshadproject_user");
setToken(null);
setUser(null);
}, []);
const value = {
user,
token,
isAuthenticated: !!token,
login,
register,
logout,
updateUser,
};
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
}
export function useAuth() {
const ctx = useContext(AuthContext);
if (!ctx) {
throw new Error("useAuth must be used within an AuthProvider");
}
return ctx;
}
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)