DEV Community

Ampire
Ampire

Posted on Edited on

Ampire

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;
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)