inventario/frontend/src/components/LoginForm.tsx
StefanoPutelli 04267b3886 init
2025-06-28 16:01:31 +02:00

160 lines
5.5 KiB
TypeScript

import { useState } from 'react';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { useAuth } from '@/hooks/useAuth';
import { useToast } from '@/hooks/use-toast';
export const LoginForm = () => {
const [isLoading, setIsLoading] = useState(false);
const { login, register } = useAuth();
const { toast } = useToast();
const handleLogin = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsLoading(true);
const formData = new FormData(e.currentTarget);
const email = formData.get('email') as string;
const password = formData.get('password') as string;
try {
await login(email, password);
toast({
title: "Login effettuato",
description: "Benvenuto nell'inventario Hackinpovo!",
});
} catch (error) {
toast({
title: "Errore di login",
description: "Controlla le tue credenziali.",
variant: "destructive",
});
} finally {
setIsLoading(false);
}
};
const handleRegister = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsLoading(true);
const formData = new FormData(e.currentTarget);
const email = formData.get('email') as string;
const password = formData.get('password') as string;
const name = formData.get('name') as string;
try {
await register(email, password, name);
toast({
title: "Account creato",
description: "Benvenuto nell'inventario Hackinpovo!",
});
} catch (error) {
toast({
title: "Errore di registrazione",
description: "Si è verificato un errore durante la registrazione.",
variant: "destructive",
});
} finally {
setIsLoading(false);
}
};
return (
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-blue-900 to-slate-800 flex items-center justify-center p-4">
<Card className="w-full max-w-md shadow-2xl border-0 bg-white/95 backdrop-blur">
<CardHeader className="text-center pb-2">
<div className="w-16 h-16 bg-gradient-to-br from-blue-600 to-green-500 rounded-2xl mx-auto mb-4 flex items-center justify-center">
<span className="text-white font-bold text-xl">HS</span>
</div>
<CardTitle className="text-2xl bg-gradient-to-r from-blue-600 to-green-500 bg-clip-text text-transparent">
Inventario Hackinpovo
</CardTitle>
<CardDescription>
Gestisci l'inventario di Hackinpovo
</CardDescription>
</CardHeader>
<CardContent>
<Tabs defaultValue="login" className="w-full">
<TabsList className="grid w-full grid-cols-2">
<TabsTrigger value="login">Login</TabsTrigger>
<TabsTrigger value="register">Registrati</TabsTrigger>
</TabsList>
<TabsContent value="login" className="space-y-4">
<form onSubmit={handleLogin} className="space-y-4">
<div className="space-y-2">
<Input
name="email"
type="email"
placeholder="Email"
required
className="h-11"
/>
</div>
<div className="space-y-2">
<Input
name="password"
type="password"
placeholder="Password"
required
className="h-11"
/>
</div>
<Button
type="submit"
className="w-full h-11 bg-gradient-to-r from-blue-600 to-green-500 hover:from-blue-700 hover:to-green-600"
disabled={isLoading}
>
{isLoading ? "Accesso in corso..." : "Accedi"}
</Button>
</form>
</TabsContent>
<TabsContent value="register" className="space-y-4">
<form onSubmit={handleRegister} className="space-y-4">
<div className="space-y-2">
<Input
name="name"
type="text"
placeholder="Nome completo"
required
className="h-11"
/>
</div>
<div className="space-y-2">
<Input
name="email"
type="email"
placeholder="Email"
required
className="h-11"
/>
</div>
<div className="space-y-2">
<Input
name="password"
type="password"
placeholder="Password"
required
className="h-11"
/>
</div>
<Button
type="submit"
className="w-full h-11 bg-gradient-to-r from-blue-600 to-green-500 hover:from-blue-700 hover:to-green-600"
disabled={isLoading}
>
{isLoading ? "Registrazione..." : "Registrati"}
</Button>
</form>
</TabsContent>
</Tabs>
</CardContent>
</Card>
</div>
);
};