'use client'; import { useEffect, useState, useRef } from 'react'; import { useParams } from 'next/navigation'; import { useRouter } from '@/i18n/navigation'; import { useTranslations } from 'next-intl'; import { CheckCircle, Loader2, XCircle } from 'lucide-react'; export default function CarrierAcceptPage() { const params = useParams(); const router = useRouter(); const token = params.token as string; const t = useTranslations('carrierPortal'); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [countdown, setCountdown] = useState(5); // Prevent double API calls (React 18 StrictMode issue) const hasCalledApi = useRef(false); useEffect(() => { const acceptBooking = async () => { if (hasCalledApi.current) { return; } hasCalledApi.current = true; if (!token) { setError(t('common.tokenMissing')); setLoading(false); return; } try { const apiUrl = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; const response = await fetch(`${apiUrl}/api/v1/csv-booking-actions/accept/${token}`, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); if (!response.ok) { let errorData; try { errorData = await response.json(); } catch (e) { errorData = { message: `HTTP ${response.status}` }; } let errorMessage = errorData.message || t('accept.errorFallback'); if (errorMessage.includes('status ACCEPTED') || errorMessage.includes('ACCEPTED')) { errorMessage = t('common.bookingAlreadyAccepted'); } else if (errorMessage.includes('status REJECTED')) { errorMessage = t('common.bookingAlreadyRejected'); } else if ( errorMessage.includes('not found') || errorMessage.includes('Booking not found') ) { errorMessage = t('common.bookingNotFound'); } throw new Error(errorMessage); } setLoading(false); const timer = setInterval(() => { setCountdown(prev => { if (prev <= 1) { clearInterval(timer); router.push('/'); return 0; } return prev - 1; }); }, 1000); return () => clearInterval(timer); } catch (err) { console.error('Error accepting booking:', err); setError(err instanceof Error ? err.message : t('accept.errorGeneric')); setLoading(false); } }; acceptBooking(); }, [token, router, t]); if (loading) { return (

{t('accept.loadingTitle')}

{t('accept.loadingMessage')}

); } if (error) { return (

{t('common.errorTitle')}

{error}

); } return (

{t('accept.thanksTitle')}

{t('accept.successHeadline')}

{t('accept.successBody')}

{t('common.redirecting', { countdown })}

); }