feat(email-validation): implement email verification checks for booking creation and resend functionality

This commit is contained in:
Jose Selesan
2026-06-02 15:47:36 -03:00
parent 88ea7e70da
commit 0e69759549
6 changed files with 173 additions and 71 deletions

View File

@@ -1,5 +1,8 @@
import { useIsMobile } from '@/hooks/use-mobile';
import { authClient } from '@/lib/api-client';
import { useAuth } from '@/lib/auth';
import type { ComplexWithRole } from '@repo/api-contract';
import { useState } from 'react';
import { BookingProvider } from './booking-provider';
import { BookingCreateDialog } from './components/booking-create-dialog';
import { BookingDaySummary, BookingQuickActions } from './components/booking-day-summary';
@@ -15,9 +18,44 @@ interface BookingProps {
export function Booking({ complex }: BookingProps) {
const isMobile = useIsMobile();
const { user } = useAuth();
const [sending, setSending] = useState(false);
const [emailSent, setEmailSent] = useState(false);
const emailNotVerified = user && !user.emailVerified;
const handleResendVerification = async () => {
if (!user?.email || sending) return;
setSending(true);
try {
await authClient.sendVerificationEmail({ email: user.email });
setEmailSent(true);
setTimeout(() => setEmailSent(false), 6000);
} catch {
// Silently fail — the banner already shows the email to contact
} finally {
setSending(false);
}
};
return (
<BookingProvider complex={complex}>
{emailNotVerified && (
<div className="mb-6 flex items-center justify-between gap-4 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800 dark:border-amber-800/30 dark:bg-amber-950/30 dark:text-amber-200">
<span>
No verificaste tu email. Para crear reservas necesitás verificar tu dirección de correo
electrónico.
</span>
<button
type="button"
onClick={handleResendVerification}
disabled={sending}
className="shrink-0 rounded-lg bg-amber-200 px-3 py-1.5 text-xs font-medium text-amber-900 transition-colors hover:bg-amber-300 disabled:opacity-50 dark:bg-amber-800 dark:text-amber-50 dark:hover:bg-amber-700"
>
{sending ? 'Enviando...' : emailSent ? '¡Email enviado!' : 'Reenviar email'}
</button>
</div>
)}
{isMobile ? (
<BookingMobile />
) : (