'use client'; import { useEffect, useState, useRef } from 'react'; import { useParams } from 'next/navigation'; import { useRouter } from '@/i18n/navigation'; import { useTranslations } from 'next-intl'; import { XCircle, Loader2, CheckCircle } from 'lucide-react'; export default function CarrierRejectPage() { 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 rejectBooking = 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/reject/${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('reject.errorFallback'); if (errorMessage.includes('status REJECTED')) { errorMessage = t('common.bookingAlreadyRejected'); } else if (errorMessage.includes('status ACCEPTED')) { errorMessage = t('common.bookingAlreadyAccepted'); } 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 rejecting booking:', err); setError(err instanceof Error ? err.message : t('reject.errorGeneric')); setLoading(false); } }; rejectBooking(); }, [token, router, t]); if (loading) { return (

{t('reject.loadingTitle')}

{t('reject.loadingMessage')}

); } if (error) { return (

{t('common.errorTitle')}

{error}

); } return (

{t('reject.thanksTitle')}

{t('reject.successHeadline')}

{t('reject.successBody')}

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

); }