);
}
/**
* چرا این روز اسلاتی ندارد — از `empty_reason` پاسخ appointment-slots.
* خالیبودن لزوماً تعطیلی نیست.
*/
const EMPTY_REASON_TEXT: Record = {
no_schedule: { title: 'برنامهٔ نوبتدهی ثبت نشده', hint: 'برای این محل هنوز برنامهٔ کاری تعریف نشده است' },
holiday: { title: 'این روز تعطیل است', hint: 'در تقویم تعطیلات، این روز برای پزشک تعطیل ثبت شده' },
day_off: { title: 'این روز شیفت کاری ندارد', hint: 'در برنامهٔ هفتگی، برای این روز شیفتی تعریف نشده است' },
outside_window: { title: 'خارج از بازهٔ نوبتدهی', hint: 'این تاریخ از بازهٔ مجاز رزرو گذشته یا نوبتدهی آنلاین خاموش است' },
// دلایلِ تقویمِ منبع — `resource/{uuid}/day-slots`.
no_shift: { title: 'این روز شیفت کاری ندارد', hint: 'در تقویم این منبع، برای این روز شیفتی تعریف نشده است' },
national_holiday: { title: 'تعطیل رسمی', hint: 'این روز در تقویم رسمی تعطیل است' },
tenant_holiday: { title: 'این روز تعطیل است', hint: 'در تقویم تعطیلات مجموعه، این روز تعطیل ثبت شده' },
exception: { title: 'استثنای تقویم', hint: 'کل ساعت کاری این روز با استثنای منبع پوشیده شده است' },
resource_inactive: { title: 'این منبع غیرفعال است', hint: 'برای نوبتدهی، منبع را از صفحهٔ «منابع» فعال کنید' },
};
export default function TurnsTimeline({
slots, loading, queryKey, onView, onBook, emptyReason, errorMessage,
}: {
slots: TimelineSlot[];
emptyReason?: string | null;
errorMessage?: string | null;
loading: boolean;
queryKey: unknown[];
onView: (a: Appointment) => void;
onBook: (s: TimelineSlot) => void;
}) {
const activeRef = useRef(null);
const now = Math.floor(Date.now() / 1000);
const activeIndex = slots.findIndex(s => s.appointment && s.end >= now);
useEffect(() => {
if (!activeRef.current) return;
const el = activeRef.current;
const top = el.getBoundingClientRect().top + window.scrollY - window.innerHeight * 0.4;
window.scrollTo({ top: Math.max(0, top), behavior: 'smooth' });
}, [activeIndex]);
if (loading) return
در حال بارگذاری...
;
if (errorMessage) {
return (
خطا در دریافت برنامهٔ این روز
{errorMessage}
);
}
if (!slots.length) {
// «شیفت کاری ندارد» فقط وقتی که backend صریحاً day_off گفته باشد؛
// دلیل ناشناخته/غایب نباید به تعطیلی تفسیر شود.
const reason = EMPTY_REASON_TEXT[emptyReason ?? '']
?? { title: 'برنامهٔ این روز در دسترس نیست', hint: 'اطلاعات برنامهٔ کاری برای این روز دریافت نشد' };
return (