MinervaFrontend/src/pages/AdminPanel.jsx
kuwsh1n 0e1dc49f59
Some checks failed
publish-main / release-image (push) Has been cancelled
ticket 16, 4, 18, 19, 20, 21, 22
2024-07-03 16:26:24 +03:00

265 lines
12 KiB
JavaScript

import React, { useState, useEffect, useContext } from "react";
import { useCookies } from "react-cookie";
import { useNavigate } from "react-router-dom";
import classes from "../assets/styles/adminPanel.module.scss";
import { UserData } from "../context";
import { getListUserApi, editUserApi, addUserApi, removeUserApi, editUserPass } from "../hooks/api/profileApi.js";
import { verifyUser } from "../hooks/services/profile.js";
import DefaultModal from "../components/DefaultModal.jsx";
import EditUserAdminPanel from "../components/bodyModal/EditUserAdminPanel.jsx";
import MyButton from "../components/MyButton.jsx";
import CheckModal from "../components/CheckModal.jsx";
const AdminPanel = () => {
const navigate = useNavigate();
const [cookies, setCookies] = useCookies(["user"]);
const {user, setUser, userRef} = useContext(UserData);
const [listUser, setListUser] = useState([]);
const [email, setEmail] = useState("");
const [firstName, setFirstName] = useState("");
const [id, setId] = useState(false);
const [isAdmin, setIsAdmin] = useState(false);
const [isTeacher, setIsTeacher] = useState(false);
const [lastName, setLastName] = useState("");
const [login, setLogin] = useState("");
const [phone, setPhone] = useState("");
const [pass, setPass] = useState("");
useEffect(() => {
async function getListUser() {
const responseListUser = await getListUserApi(cookies.token);
if (
responseListUser.status === 200
) {
setListUser(responseListUser.data)
}
else if (
responseListUser.status === 401
) {
// navigate("/enter")
setUser(false)
}
else {
console.log(responseListUser)
}
}
getListUser()
}, []);
function clearState() {
setEmail("")
setFirstName("")
setId("")
setIsAdmin("")
setIsTeacher("")
setLastName("")
setLogin("")
setPhone("")
setPass("")
};
async function addUser() {
const currentState = {
email: email,
first_name: firstName,
id: id,
is_admin: isAdmin,
is_teacher: isTeacher,
last_name: lastName,
login: login,
phone: phone
}
const response = await addUserApi(cookies.token, currentState)
if (response.status === 200) {
setListUser([...listUser, currentState])
if (pass) {
await editUserPass(cookies.token, login, pass);
}
}
else if (
response.status === 401
) {
// navigate("/enter")
setUser(false)
}
else {
console.log(response)
}
clearState()
};
async function editUser() {
const currentState = {
email: email,
first_name: firstName,
id: id,
is_admin: isAdmin,
is_teacher: isTeacher,
last_name: lastName,
login: login,
phone: phone
};
const response = await editUserApi(cookies.token, currentState);
if (response.status === 200) {
setListUser(listUser.map(item => item.id === id ? currentState : item));
if (pass) {
await editUserPass(cookies.token, login, pass);
};
}
else if (
response.status === 401
) {
// navigate("/enter")
setUser(false)
}
else {
console.log(response)
}
clearState();
};
function openUser(user) {
setEmail(user.email)
setFirstName(user.first_name)
setId(user.id)
setIsAdmin(user.is_admin)
setIsTeacher(user.is_teacher)
setLastName(user.last_name)
setLogin(user.login)
setPhone(user.phone)
}
async function removeUser(login) {
const response = await removeUserApi(cookies.token, login)
if (response.status === 200) {
setListUser(listUser.filter(item => item.login !== login))
}
else if (
response.status === 401
) {
// navigate("/enter")
setUser(false)
}
else {
console.log(response)
}
}
return (
<div className={classes.main}>
<div className={classes.wrapper}>
<div className={classes.admin}>
{/* <div className={classes.admin__linkProfile}>
<span onClick={() => navigate("/profile")}>Профиль</span>
</div> */}
<div className={classes.admin__wrapper}>
<div className={classes.admin__wrapper__header}>
<h3>Пользователи</h3>
<MyButton
text={"Создать пользователя"}
class={"main__green"}
toggle={"modal"}
target={"#adminModal"}
/>
</div>
<div className={classes.admin__wrapper__body}>
<div className={classes.admin__wrapper__body__columns}>
<div className={classes.admin__wrapper__body__columns__wrapper}>
<div className={classes.admin__wrapper__body__columns__item}>Логин</div>
<div className={classes.admin__wrapper__body__columns__item}>Фамилия</div>
<div className={classes.admin__wrapper__body__columns__item}>Email</div>
<div className={classes.admin__wrapper__body__columns__item}>Учитель</div>
<div className={classes.admin__wrapper__body__columns__item}>Администратор</div>
</div>
</div>
<div className={classes.admin__wrapper__body__users}>
{listUser.map(item =>
<div className={classes.admin__wrapper__body__users__item} key={item.id}>
<div className={classes.admin__wrapper__body__users__item__wrapper}>
<div
className={classes.admin__wrapper__body__users__item__link}
data-bs-toggle="modal" data-bs-target={`#adminModal`}
onClick={() => openUser(item)}
>
{item.login}
</div>
<div className={classes.admin__wrapper__body__users__item__info}>
{item.last_name ? item.last_name : '-'}
</div>
<div className={classes.admin__wrapper__body__users__item__info}>
{item.email ? item.email : '-'}
</div>
<div className={classes.admin__wrapper__body__users__item__info}>
{
item.is_teacher ?
<i class="fa-solid fa-circle-check" style={{color: "rgb(150, 209, 158)"}}></i> :
<i class="fa-solid fa-circle-xmark" style={{color: "rgb(235, 130, 130)"}}></i>
}
</div>
<div className={classes.admin__wrapper__body__users__item__info}>
{
item.is_admin ?
<i class="fa-solid fa-circle-check" style={{color: "rgb(150, 209, 158)"}}></i> :
<i class="fa-solid fa-circle-xmark" style={{color: "rgb(235, 130, 130)"}}></i>}
</div>
<div className={classes.admin__wrapper__body__users__item__remove}>
<i class="fa-solid fa-trash" data-bs-toggle="modal" data-bs-target={`#checkModal${item.id}`}></i>
</div>
<CheckModal
postfix={item.id}
message={`Вы хотетите удалить пользователя <${item.login}>?`}
action={{
execute: () => removeUser(item.login),
cancel: () => {}
}}
/>
</div>
</div>
)}
<DefaultModal
name={"adminModal"}
BodyModal={
<EditUserAdminPanel
id={id}
email={email}
firstName={firstName}
isAdmin={isAdmin}
isTeacher={isTeacher}
lastName={lastName}
login={login}
phone={phone}
setEmail={setEmail}
setFirstName={setFirstName}
setIsAdmin={setIsAdmin}
setIsTeacher={setIsTeacher}
setLastName={setLastName}
setLogin={setLogin}
setPhone={setPhone}
pass={pass}
setPass={setPass}
/>
}
btn={[
{text: id ? "Изменить" : "Сохранить", dismiss: "modal", class: "main__green", action: id ? () => editUser() : () => addUser()},
{text: "Отмена", dismiss: "modal", class: "main__white", action: () => clearState()}
]}
/>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
export default AdminPanel;