Files
Kanban-Front/src/Profile.js
Vladiysss d6bbcb2c94 Init
2026-02-01 16:05:41 +03:00

314 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';
import Header from './Header';
const Profile = () => {
const [user, setUser] = useState(null);
const [userName, setUserName] = useState(null);
const [error, setError] = useState('');
const [showConfirm, setShowConfirm] = useState(false); // Состояние для поп-апа
const [ShowConfirmUserName, setShowConfirmUserName] = useState(false);
const [new_username, setnew_username] = useState('');
const [ShowConfirmName, setShowConfirmName] = useState(false);
//const [display_name, setdisplay_name] = useState('');
const [new_display_name, setnew_display_name] = useState('');
const navigate = useNavigate();
const [showChangePassword, setShowChangePassword] = useState(false);
const [old_password, setold_password] = useState('');
const [new_password, setnew_password] = useState('');
const [new_password_confirm, setnew_password_confirm] = useState('');
const [passwordError, setPasswordError] = useState('');
useEffect(() => {
const checkSession = async () => {
try {
const response = await axios.get('/api/users/me');
setUser(response.data.display_name);
setUserName(response.data.username)
} catch (err) {
// Если нет сессии - редирект на логин
setError('Вы не авторизованы');
setTimeout(() => {
window.location.href = '/login';
}, 1500);
}
};
checkSession();
}, []);
const handleLogout = async () => {
try {
await axios.post('/api/users/logout');
setUser(null);
window.location.href = '/login'; // Редирект после выхода
} catch (err) {
setError('Ошибка');
}
};
const NewDisplayName = async (e) => {
e.preventDefault();
setError('');
try {
await axios.put('api/users/change_display_name', {new_display_name},
{
withCredentials: true
/*headers: {
'Content-Type': 'application/json'
}*/
}
);
setShowConfirmName(false);
try {
const response = await axios.get('/api/users/me');
setUser(response.data.display_name);
setUserName(response.data.username);
} catch (err) {
// Если нет сессии - редирект на логин
setError('Вы не авторизованы');
setTimeout(() => {
window.location.href = '/login';
}, 1500);
}
} catch (err) {
setError(err.response.data.detail || 'Ошибка входа');
}
};
const NewUserName = async (e) => {
e.preventDefault();
setError('');
try {
await axios.put('api/users/change_username', {new_username},
{
withCredentials: true
/*headers: {
'Content-Type': 'application/json'
}*/
}
);
setShowConfirmUserName(false);
try {
const response = await axios.get('/api/users/me');
setUserName(response.data.username);
setUser(response.data.display_name);
} catch (err) {
// Если нет сессии - редирект на логин
setError('Вы не авторизованы');
}
} catch (err) {
setError(err.response.data.detail || 'Ошибка входа');
}
};
const changePassword = async (e) => {
e.preventDefault();
setPasswordError('');
try {
const NewPassword = {old_password, new_password, new_password_confirm}
await axios.put('/api/users/change_password',
NewPassword
, {
withCredentials: true
});
alert('Пароль успешно изменён!');
setShowChangePassword(false);
setold_password('');
setnew_password('');
setnew_password_confirm('');
} catch (err) {
setPasswordError(
err.response?.data?.detail || 'Ошибка при смене пароля'
);
}
};
const OpenWindowDelete = () => {
setShowConfirm(true); // Показываем окно подтверждения
};
const closeWindowDelete = () => {
setShowConfirm(false);
};
const OpenWindowName = () => {
setShowConfirmName(true); // Показываем окно подтверждения
};
const closeWindowName = () => {
setShowConfirmName(false);
};
const OpenWindowUserName = () => {
setShowConfirmUserName(true); // Показываем окно подтверждения
};
const closeWindowUserName = () => {
setShowConfirmUserName(false); // Показываем окно подтверждения
};
const deleteAccount = async () => {
try {
await axios.delete('/api/users/me', {
withCredentials: true
});
setUser(null);
window.location.href = '/login';
setShowConfirm(false); // Закрываем окно после удаления
} catch (err) {
setError('Ошибка удаления');
setShowConfirm(false); // Закрываем окно при ошибке
}
};
return (
<><Header />
<div className="profile-page">
{
error && <div className="error">{error}</div>
}
{user && (
<div className="user-info">
<p><strong>Привет, {user}! Добро пожаловать в личный кабинет.</strong></p>
<div className="text-block">Здесь ты сможешь управлять данными своей учётной записи.</div>
<p>Информация об учётной записи</p>
<div className="com">Отображаемое имя</div>
<div className="buttonName">
<div className="frame"><p>{user}</p></div>
<button onClick={OpenWindowName}></button>
</div>
<div className="com">Логин</div>
<div className="buttonName">
<div className="frame"><p>{userName}</p></div>
<button onClick={OpenWindowUserName}></button>
</div>
<p>Изменить пароль</p>
<div className="com">В целях безопасности мы рекомендуем выбрать пароль, который ещё не использовался вами в других учётных записях.</div>
<button onClick={() => setShowChangePassword(true)}
className="button-small">Изменить пароль</button>
<button onClick={handleLogout}>Выйти из аккаунта</button>
<button onClick={OpenWindowDelete}>Удалить аккаунт</button>
</div>
)}
{ShowConfirmUserName && (
<div className="confirm-modal">
<div className="modal-content">
<div><h3>Обновите логин</h3></div>
<div><p>Текущий логин: {userName}</p></div>
<div className="com">Новый логин</div>
<form onSubmit={NewUserName}>
<div>
<input
type="text"
value={new_username}
onChange={(e) => setnew_username(e.target.value)}
required
/>
</div>
<button type="submit">Подтвердить</button>
</form>
<button onClick={closeWindowUserName}>Отменить</button>
</div>
</div>
)}
{ShowConfirmName && (
<div className="confirm-modal">
<div className="modal-content">
<div><h3>Обновите отображаемое имя</h3></div>
<div><p>Текущее отображаемое имя: {user}</p></div>
<div className="com">Новое отображаемое имя</div>
<form onSubmit={NewDisplayName}>
<div>
<input
type="text"
value={new_display_name}
onChange={(e) => setnew_display_name(e.target.value)}
required
/>
</div>
<button type="submit">Подтвердить</button>
</form>
<button onClick={closeWindowName}>Отменить</button>
</div>
</div>
)}
{showChangePassword && (
<div className="confirm-modal">
<div className="modal-content">
<h3>Изменить пароль</h3>
{passwordError && (
<div className="error" style={{ color: 'red' }}>
{passwordError}
</div>
)}
<form onSubmit={changePassword}>
<div className="form-group">
<label>Текущий пароль:</label>
<input
type="password"
value={old_password}
onChange={(e) => setold_password(e.target.value)}
required
/>
</div>
<div className="form-group">
<label>Новый пароль:</label>
<input
type="password"
value={new_password}
onChange={(e) => setnew_password(e.target.value)}
required
/>
</div>
<div className="form-group">
<label>Повторите новый пароль:</label>
<input
type="password"
value={new_password_confirm}
onChange={(e) => setnew_password_confirm(e.target.value)}
required
/>
</div>
<div className="modal-buttons">
<button type="submit">Изменить пароль</button>
<button
type="button"
onClick={() => setShowChangePassword(false)}
>
Отменить
</button>
</div>
</form>
</div>
</div>
)}
{/* Всплывающее окно подтверждения */}
{showConfirm && (
<div className="confirm-modal">
<div className="modal-content">
<p><strong>Вы действительно хотите удалить аккаунта?</strong></p>
<div className="modal-buttons">
<button onClick={deleteAccount}>Подтвердить</button>
<button onClick={closeWindowDelete}>Отменить</button>
</div>
</div>
</div>
)}
</div></>
);
};
export default Profile;