budget-view-finance/src/pages/AuthReset.tsx
gpt-engineer-app[bot] 9a179d136e Fix: Redirect to dashboard after login
- Redirect to dashboard after successful login.
- Created `/auth/reset` page for password reset functionality.
2025-07-02 18:29:30 +00:00

140 lines
4.2 KiB
TypeScript

import { useState, useEffect } from 'react';
import { useNavigate, useSearchParams } from 'react-router-dom';
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 { Lock } from "lucide-react";
import { supabase } from '@/integrations/supabase/client';
import { toast } from "sonner";
const AuthReset = () => {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const [novaSenha, setNovaSenha] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState('');
const [tokenValido, setTokenValido] = useState(true);
useEffect(() => {
const accessToken = searchParams.get('access_token');
if (!accessToken) {
setTokenValido(false);
setError('Token de redefinição inválido ou ausente.');
}
}, [searchParams]);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setIsLoading(true);
setError('');
if (!novaSenha) {
setError('Por favor, digite uma nova senha.');
setIsLoading(false);
return;
}
if (novaSenha.length < 6) {
setError('A senha deve ter pelo menos 6 caracteres.');
setIsLoading(false);
return;
}
try {
const { error } = await supabase.auth.updateUser({
password: novaSenha
});
if (error) {
setError('Erro ao redefinir a senha: ' + error.message);
} else {
toast.success('Senha redefinida com sucesso!');
navigate('/auth');
}
} catch (error) {
setError('Erro inesperado. Tente novamente.');
} finally {
setIsLoading(false);
}
};
if (!tokenValido) {
return (
<div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">
<Card className="w-full max-w-md">
<CardHeader className="space-y-1 text-center">
<CardTitle className="text-2xl text-red-600">Erro</CardTitle>
<CardDescription className="text-red-500">
Token de redefinição inválido ou ausente.
</CardDescription>
</CardHeader>
<CardContent>
<Button
onClick={() => navigate('/auth')}
variant="outline"
className="w-full"
>
Voltar ao login
</Button>
</CardContent>
</Card>
</div>
);
}
return (
<div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">
<Card className="w-full max-w-md">
<CardHeader className="space-y-1 text-center">
<div className="flex justify-center mb-4">
<Lock className="h-12 w-12 text-blue-500" />
</div>
<CardTitle className="text-2xl">Redefinição de senha</CardTitle>
<CardDescription>
Digite sua nova senha
</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit} className="space-y-4">
<div className="space-y-2">
<Label htmlFor="nova-senha">Nova senha</Label>
<Input
id="nova-senha"
type="password"
placeholder="Digite sua nova senha"
value={novaSenha}
onChange={(e) => setNovaSenha(e.target.value)}
required
disabled={isLoading}
minLength={6}
className="rounded-lg border border-gray-300"
/>
</div>
{error && (
<Alert variant="destructive">
<AlertDescription>{error}</AlertDescription>
</Alert>
)}
<Button
id="botao-confirmar"
type="submit"
className="w-full bg-blue-600 hover:bg-blue-700 rounded-lg"
disabled={isLoading}
>
{isLoading ? "Atualizando..." : "Atualizar senha"}
</Button>
</form>
</CardContent>
</Card>
</div>
);
};
export default AuthReset;