import React, { useEffect, useState } from 'react'; interface Props { expiresAt: number; onExpired: () => void; } /** * شمارش معکوس مهلت رزرو موقت. * * بدون این، اپراتور نمی‌داند چقدر وقت دارد و رزرو در سکوت منقضی می‌شود — بعد کلیک * «ثبت» یک ۴۰۹ می‌گیرد که هیچ‌جا توضیحش را ندیده. * * مبنا `expires_at` سرور است، نه شمارنده‌ای که از لحظهٔ رندر شروع شود: ساعت مرورگر و * تأخیر شبکه هر دو می‌توانند چند ثانیه اختلاف بسازند و آن چند ثانیه دقیقاً همان‌جایی * است که رزرو از دست می‌رود. */ export default function HoldCountdown({ expiresAt, onExpired }: Props) { const [remaining, setRemaining] = useState(() => expiresAt - Math.floor(Date.now() / 1000)); useEffect(() => { const tick = () => { const left = expiresAt - Math.floor(Date.now() / 1000); setRemaining(left); if (left <= 0) onExpired(); }; tick(); const timer = setInterval(tick, 1000); return () => clearInterval(timer); }, [expiresAt, onExpired]); if (remaining <= 0) { return ( مهلت تمام شد ); } const minutes = Math.floor(remaining / 60); const seconds = remaining % 60; // زیر یک دقیقه هشدار می‌گیرد؛ همان لحظه‌ای که اپراتور باید تصمیمش را بگیرد. const urgent = remaining < 60; return ( مهلت ثبت: {minutes}:{String(seconds).padStart(2, '0')} ); }