Ich habe soweit automatisiert the Emails sortieren aber ich muss noch schauen was es fur bugs es gibt wenn die app online ist deswegen wurde ich mit diesen Commit die website veroffentlichen obwohjl es sein konnte das es noch nicht fertig ist und verkaufs bereit
132 lines
4.8 KiB
TypeScript
132 lines
4.8 KiB
TypeScript
import { useState } from 'react'
|
|
import { Link } from 'react-router-dom'
|
|
import { Button } from '@/components/ui/button'
|
|
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'
|
|
import { Input } from '@/components/ui/input'
|
|
import { Label } from '@/components/ui/label'
|
|
import { auth } from '@/lib/appwrite'
|
|
import { Mail, ArrowLeft, Loader2, CheckCircle } from 'lucide-react'
|
|
|
|
export function ForgotPassword() {
|
|
const [email, setEmail] = useState('')
|
|
const [loading, setLoading] = useState(false)
|
|
const [sent, setSent] = useState(false)
|
|
const [error, setError] = useState('')
|
|
|
|
const handleSubmit = async (e: React.FormEvent) => {
|
|
e.preventDefault()
|
|
setError('')
|
|
setLoading(true)
|
|
|
|
try {
|
|
await auth.forgotPassword(email)
|
|
setSent(true)
|
|
} catch (err: any) {
|
|
setError(err.message || 'Fehler beim Senden der E-Mail')
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div className="min-h-screen bg-gradient-to-br from-slate-50 to-slate-100 flex items-center justify-center p-4">
|
|
<div className="w-full max-w-md">
|
|
{/* Logo */}
|
|
<Link to="/" className="flex items-center justify-center gap-2 mb-8">
|
|
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-primary-500 to-primary-700 flex items-center justify-center">
|
|
<Mail className="w-5 h-5 text-white" />
|
|
</div>
|
|
<span className="text-xl font-bold text-slate-900">
|
|
Email<span className="text-primary-600">Sorter</span>
|
|
</span>
|
|
</Link>
|
|
|
|
<Card className="shadow-xl border-0">
|
|
<CardHeader className="text-center pb-2">
|
|
<CardTitle className="text-2xl">Passwort vergessen?</CardTitle>
|
|
<CardDescription>
|
|
{sent
|
|
? 'Prüfe dein E-Mail-Postfach'
|
|
: 'Gib deine E-Mail-Adresse ein und wir senden dir einen Link zum Zurücksetzen.'
|
|
}
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
{sent ? (
|
|
<div className="text-center py-8">
|
|
<div className="w-16 h-16 mx-auto mb-4 rounded-full bg-green-100 flex items-center justify-center">
|
|
<CheckCircle className="w-8 h-8 text-green-600" />
|
|
</div>
|
|
<h3 className="font-semibold text-slate-900 mb-2">E-Mail gesendet!</h3>
|
|
<p className="text-slate-600 mb-6">
|
|
Wir haben dir eine E-Mail mit einem Link zum Zurücksetzen deines Passworts an <strong>{email}</strong> gesendet.
|
|
</p>
|
|
<p className="text-sm text-slate-500 mb-6">
|
|
Keine E-Mail erhalten? Prüfe deinen Spam-Ordner oder versuche es erneut.
|
|
</p>
|
|
<div className="space-y-3">
|
|
<Button
|
|
variant="outline"
|
|
className="w-full"
|
|
onClick={() => setSent(false)}
|
|
>
|
|
Erneut senden
|
|
</Button>
|
|
<Link to="/login">
|
|
<Button variant="ghost" className="w-full">
|
|
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
Zurück zum Login
|
|
</Button>
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
) : (
|
|
<form onSubmit={handleSubmit} className="space-y-6">
|
|
{error && (
|
|
<div className="p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm">
|
|
{error}
|
|
</div>
|
|
)}
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="email">E-Mail-Adresse</Label>
|
|
<Input
|
|
id="email"
|
|
type="email"
|
|
placeholder="name@beispiel.de"
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
required
|
|
autoFocus
|
|
/>
|
|
</div>
|
|
|
|
<Button type="submit" className="w-full" disabled={loading}>
|
|
{loading ? (
|
|
<>
|
|
<Loader2 className="w-4 h-4 mr-2 animate-spin" />
|
|
Wird gesendet...
|
|
</>
|
|
) : (
|
|
'Link senden'
|
|
)}
|
|
</Button>
|
|
|
|
<div className="text-center">
|
|
<Link
|
|
to="/login"
|
|
className="text-sm text-primary-600 hover:text-primary-700"
|
|
>
|
|
<ArrowLeft className="w-4 h-4 inline mr-1" />
|
|
Zurück zum Login
|
|
</Link>
|
|
</div>
|
|
</form>
|
|
)}
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|