Files
frontend/app/context/AuthContext.jsx
fullofempt bb833d956e +-good
2025-12-13 19:33:57 +05:00

90 lines
2.4 KiB
JavaScript

"use client";
import React, { createContext, useContext, useState, useEffect } from "react";
import { useRouter } from "next/navigation";
const AuthContext = createContext(null);
// фейковые пользователи (3 логина/пароля)
const USERS = [
{
id: 1,
role: "user", // обычный пользователь
name: "Пользователь",
login: "user@mail.com",
password: "user123",
},
{
id: 2,
role: "volunteer",
name: "Волонтёр",
login: "vol@mail.com",
password: "vol123",
},
{
id: 3,
role: "moderator",
name: "Модератор",
login: "mod@mail.com",
password: "mod123",
},
];
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null); // {id, role, name, login}
const [loading, setLoading] = useState(true);
const router = useRouter();
// Поднимаем пользователя из localStorage, чтобы контекст сохранялся между перезагрузками
useEffect(() => {
const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null;
if (saved) {
setUser(JSON.parse(saved));
}
setLoading(false);
}, []);
const login = async (login, password) => {
// имитация запроса на бэк
const found = USERS.find(
(u) => u.login === login && u.password === password
);
if (!found) {
throw new Error("Неверный логин или пароль");
}
const authUser = {
id: found.id,
role: found.role,
name: found.name,
login: found.login,
};
setUser(authUser);
localStorage.setItem("authUser", JSON.stringify(authUser));
// после логина перенаправляем на стартовую страницу по роли
if (found.role === "user") router.push("/home");
if (found.role === "volunteer") router.push("/mainValounter");
if (found.role === "moderator") router.push("/moderatorMain");
};
const logout = () => {
setUser(null);
localStorage.removeItem("authUser");
router.push("/login");
};
const value = {
user,
loading,
isAuthenticated: !!user,
login,
logout,
};
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};
export const useAuth = () => useContext(AuthContext);