Spaces:
Running
Running
| import React, { useState } from 'react'; | |
| import { useNavigate } from 'react-router-dom'; | |
| import './Login.scss'; | |
| import { useAuth } from '@/context/AuthContext'; | |
| const LoginPage: React.FC = () => { | |
| const [username, setUsername] = useState(''); | |
| const [password, setPassword] = useState(''); | |
| const { login, isLoading, error } = useAuth(); | |
| const navigate = useNavigate(); | |
| const handleSubmit = async (e: React.FormEvent) => { | |
| e.preventDefault(); | |
| try { | |
| await login({ username, password }); | |
| navigate('/logs', { replace: true }); | |
| } catch { | |
| // Ошибка уже логируется в хуке | |
| } | |
| }; | |
| return ( | |
| <div className="login-page"> | |
| <h2>Вход в админку</h2> | |
| <form onSubmit={handleSubmit}> | |
| <div> | |
| <label>Логин:</label> | |
| <input | |
| type="text" | |
| value={username} | |
| onChange={(e) => setUsername(e.target.value)} | |
| /> | |
| </div> | |
| <div> | |
| <label>Пароль:</label> | |
| <input | |
| type="password" | |
| value={password} | |
| onChange={(e) => setPassword(e.target.value)} | |
| /> | |
| </div> | |
| {error && <p className="error">Неверный логин или пароль</p>} | |
| <button type="submit" disabled={isLoading}> | |
| {isLoading ? 'Вход...' : 'Войти'} | |
| </button> | |
| </form> | |
| </div> | |
| ); | |
| }; | |
| export default LoginPage; |