diff --git a/src/pages/AuthForms.css b/src/pages/AuthForms.css index 6879d59..b5ae10e 100644 --- a/src/pages/AuthForms.css +++ b/src/pages/AuthForms.css @@ -1,64 +1,63 @@ .auth-page { - display: flex; - justify-content: center; - align-items: center; - min-height: calc(100vh - 160px); - padding: 40px 0; - } - - .auth-container { - background: white; - padding: 40px; - border-radius: 10px; - box-shadow: 0 2px 10px rgba(0,0,0,0.1); - width: 400px; - max-width: 90%; - } - - .auth-container h2 { - margin-top: 0; - color: #2c3e50; - text-align: center; - } - - .form-group { - margin-bottom: 20px; - } - - .form-group label { - display: block; - margin-bottom: 8px; - font-weight: 500; - } - - .form-group input { - width: 100%; - padding: 12px; - border: 1px solid #ddd; - border-radius: 5px; - font-size: 16px; - } - - .auth-btn { - width: 100%; - padding: 14px; - background: #6C63FF; - color: white; - border: none; - border-radius: 5px; - cursor: pointer; - font-size: 16px; - margin-top: 20px; - } - - .auth-switch { - margin-top: 25px; - text-align: center; - color: #7f8c8d; - } - - .auth-switch a { - color: #6C63FF; - text-decoration: none; - } - \ No newline at end of file + display: flex; + justify-content: center; + align-items: center; + min-height: calc(100vh - 160px); + padding: 40px 0; +} + +.auth-container { + background: white; + padding: 40px; + border-radius: 10px; + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + width: 400px; + max-width: 90%; +} + +.auth-container h2 { + margin-top: 0; + color: #2c3e50; + text-align: center; +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; +} + +.form-group input { + width: 100%; + padding: 5px; + border: 1px solid #ddd; + border-radius: 5px; + font-size: 16px; +} + +.auth-btn { + width: 100%; + padding: 14px; + background: #6C63FF; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 16px; + margin-top: 20px; +} + +.auth-switch { + margin-top: 25px; + text-align: center; + color: #7f8c8d; +} + +.auth-switch a { + color: #6C63FF; + text-decoration: none; +} diff --git a/src/pages/Login.js b/src/pages/Login.js index b037b3b..9541088 100644 --- a/src/pages/Login.js +++ b/src/pages/Login.js @@ -1,78 +1,85 @@ -import React, { useState } from 'react'; // Хук состояния -import { useNavigate } from 'react-router-dom'; -import './AuthForms.css'; +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { mockFetch } from './mockFetch'; +import './AuthForms.css'; -function Login() { - // Состояние для хранения данных формы - const [formData, setFormData] = useState({ - email: '', - password: '' - }); - - // Хук для программной навигации +export default function Login() { + const [formData, setFormData] = useState({ login: '', password: '' }); // Состояние для хранения данных формы + const [error, setError] = useState(null);// для хранения сообщения об ошибке const navigate = useNavigate(); - // Обработчик изменений в полях ввода - const handleChange = (e) => { - const { name, value } = e.target; - setFormData(prev => ({ - ...prev, // Сохранение предыдущих значений - [name]: value // Динамическое обновление поля - })); + // Функция, которая вызывается при изменении любого поля формы, обновляет соответствующее поле в formData и сбрасывает ошибку + const handleChange = e => { + setFormData(prev => ({ ...prev, [e.target.name]: e.target.value })); + setError(null); }; - // Обработчик отправки формы - const handleSubmit = (e) => { - e.preventDefault(); // Отмена стандартного поведения - console.log('Вход:', formData); // Логирование данных (в реальном приложении - запрос к API) - navigate('/'); // Перенаправление на главную страницу + // Функция, которая вызывается при отправке формы + const handleSubmit = async e => { + e.preventDefault(); // Отменяем стандартное поведение формы (перезагрузку страницы) + + // Отправляем данные формы через mockFetch на "адрес" /api/login методом POST + const response = await mockFetch('/api/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, // Указываем, что отправляем JSON + body: JSON.stringify(formData), // Преобразуем объект с логином и паролем в JSON-строку + }); + + + const data = await response.json(); // Получаем ответ в формате JSON + + if (response.ok) { + // Если ответ успешный, сохраняем токен в localStorage + localStorage.setItem('token', data.token); + alert('Вход успешен!'); + navigate('/'); + } else { + + setError(data.message); + } }; return ( - // Основной контейнер страницы -
{error}
} + {/* Форма с обработчиком отправки */} - - {/* Ссылка для перехода к регистрации */} +