90 lines
2.4 KiB
JavaScript
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);
|