Spaces:
Running
Running
| import { useState } from 'react'; | |
| import { useNavigate } from 'react-router-dom'; | |
| import { useAuth } from '../context/AuthContext'; | |
| import { toast } from 'react-toastify'; | |
| export default function Login() { | |
| const [formData, setFormData] = useState({ | |
| email: '', | |
| password: '' | |
| }); | |
| const [loading, setLoading] = useState(false); | |
| const { login } = useAuth(); | |
| const navigate = useNavigate(); | |
| const handleChange = (e) => { | |
| setFormData({ | |
| ...formData, | |
| [e.target.name]: e.target.value | |
| }); | |
| }; | |
| const handleSubmit = async (e) => { | |
| e.preventDefault(); | |
| setLoading(true); | |
| try { | |
| await login(formData); | |
| toast.success('ورود با موفقیت انجام شد'); | |
| navigate('/dashboard'); | |
| } catch (err) { | |
| toast.error(err.message || 'خطا در ورود'); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| return ( | |
| <div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8"> | |
| <div className="max-w-md w-full space-y-8 bg-white p-8 rounded-lg shadow-md"> | |
| <div className="text-center"> | |
| <h2 className="mt-6 text-3xl font-extrabold text-gray-900">ورود به حساب کاربری</h2> | |
| </div> | |
| <form className="mt-8 space-y-6" onSubmit={handleSubmit}> | |
| <div className="rounded-md shadow-sm space-y-4"> | |
| <div> | |
| <label htmlFor="email" className="block text-sm font-medium text-gray-700 mb-1"> | |
| آدرس ایمیل | |
| </label> | |
| <input | |
| id="email" | |
| name="email" | |
| type="email" | |
| autoComplete="email" | |
| required | |
| className="appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary focus:border-primary focus:z-10 sm:text-sm" | |
| placeholder="example@domain.com" | |
| value={formData.email} | |
| onChange={handleChange} | |
| /> | |
| </div> | |
| <div> | |
| <label htmlFor="password" className="block text-sm font-medium text-gray-700 mb-1"> | |
| رمز عبور | |
| </label> | |
| <input | |
| id="password" | |
| name="password" | |
| type="password" | |
| autoComplete="current-password" | |
| required | |
| className="appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary focus:border-primary focus:z-10 sm:text-sm" | |
| placeholder="••••••••" | |
| value={formData.password} | |
| onChange={handleChange} | |
| /> | |
| </div> | |
| </div> | |
| <div className="flex items-center justify-between"> | |
| <div className="flex items-center"> | |
| <input | |
| id="remember-me" | |
| name="remember-me" | |
| type="checkbox" | |
| className="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded" | |
| /> | |
| <label htmlFor="remember-me" className="mr-2 block text-sm text-gray-900"> | |
| مرا به خاطر بسپار | |
| </label> | |
| </div> | |
| <div className="text-sm"> | |
| <a href="/forgot-password" className="font-medium text-primary hover:text-primary-600"> | |
| فراموشی رمز عبور؟ | |
| </a> | |
| </div> | |
| </div> | |
| <div> | |
| <button | |
| type="submit" | |
| disabled={loading} | |
| className={`group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-primary hover:bg-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary ${loading ? 'opacity-70 cursor-not-allowed' : ''}`} | |
| > | |
| {loading ? 'در حال ورود...' : 'ورود'} | |
| </button> | |
| </div> | |
| </form> | |
| <div className="text-center text-sm"> | |
| <p className="text-gray-600"> | |
| حساب کاربری ندارید؟{' '} | |
| <a href="/register" className="font-medium text-primary hover:text-primary-600"> | |
| ثبتنام کنید | |
| </a> | |
| </p> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } |