| import { useState } from 'react' |
| import { Link, useNavigate } from 'react-router-dom' |
| import { useAuthStore } from '@/store/authStore' |
| import { Button } from '@/components/ui/button' |
| import { Input } from '@/components/ui/input' |
| import { Label } from '@/components/ui/label' |
| import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' |
| import { Alert, AlertDescription } from '@/components/ui/alert' |
| import LoadingSpinner from '@/components/LoadingSpinner' |
| import { MessageCircle } from 'lucide-react' |
|
|
| export default function LoginPage() { |
| const [email, setEmail] = useState('') |
| const [password, setPassword] = useState('') |
| const { login, loading, error, clearError } = useAuthStore() |
| const navigate = useNavigate() |
|
|
| const handleSubmit = async (e: React.FormEvent) => { |
| e.preventDefault() |
| clearError() |
| |
| try { |
| await login(email, password) |
| navigate('/chat') |
| } catch (error) { |
| |
| } |
| } |
|
|
| return ( |
| <div className="min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 p-4"> |
| <Card className="w-full max-w-md"> |
| <CardHeader className="text-center"> |
| <div className="flex justify-center mb-4"> |
| <div className="p-3 bg-blue-600 rounded-full"> |
| <MessageCircle className="w-8 h-8 text-white" /> |
| </div> |
| </div> |
| <CardTitle className="text-2xl font-bold">Welcome Back</CardTitle> |
| <CardDescription> |
| Sign in to your ChatApp account |
| </CardDescription> |
| </CardHeader> |
| <CardContent> |
| <form onSubmit={handleSubmit} className="space-y-4"> |
| {error && ( |
| <Alert variant="destructive"> |
| <AlertDescription>{error}</AlertDescription> |
| </Alert> |
| )} |
| |
| <div className="space-y-2"> |
| <Label htmlFor="email">Email</Label> |
| <Input |
| id="email" |
| type="email" |
| placeholder="Enter your email" |
| value={email} |
| onChange={(e) => setEmail(e.target.value)} |
| required |
| disabled={loading} |
| /> |
| </div> |
| |
| <div className="space-y-2"> |
| <Label htmlFor="password">Password</Label> |
| <Input |
| id="password" |
| type="password" |
| placeholder="Enter your password" |
| value={password} |
| onChange={(e) => setPassword(e.target.value)} |
| required |
| disabled={loading} |
| /> |
| </div> |
| |
| <Button |
| type="submit" |
| className="w-full" |
| disabled={loading} |
| > |
| {loading ? ( |
| <> |
| <LoadingSpinner size="sm" className="mr-2" /> |
| Signing in... |
| </> |
| ) : ( |
| 'Sign In' |
| )} |
| </Button> |
| </form> |
| |
| <div className="mt-6 text-center"> |
| <p className="text-sm text-gray-600"> |
| Don't have an account?{' '} |
| <Link |
| to="/register" |
| className="text-blue-600 hover:text-blue-500 font-medium" |
| > |
| Sign up |
| </Link> |
| </p> |
| </div> |
| </CardContent> |
| </Card> |
| </div> |
| ) |
| } |
|
|