/** * پیکربندی وضعیت نوبت‌ها — رنگ‌ها عیناً از طرح tauri (`clinic-pro-tauri` * `src/components/turns/Timeline.jsx` → `statusConfig`) برداشته شده و به وضعیت‌های * واقعی بک‌اند (Appointment::STATUS_*) نگاشت شده‌اند. لیبل‌ها فارسی مطابق همان طرح. */ export interface TurnStatusConfig { label: string; bgColor: string; borderColor: string; dotColor: string; textColor: string; } /** یک وضعیت = یک توکن؛ خود توکن با تم عوض می‌شود، پس جفت light/dark لازم نیست. */ const of = (fg: string, bg: string): Omit => ({ bgColor: `var(--${bg})`, borderColor: `var(--${fg})`, dotColor: `var(--${fg})`, textColor: `var(--${fg})`, }); // وضعیت‌های بک‌اند → توکن‌های تم (هیوی طرح tauri حفظ شده است). const STATUS: Record = { pending: { label: 'ثبت شده', ...of('info', 'info-bg') }, confirmed: { label: 'قطعی شده', ...of('primary', 'primary-soft') }, following_up: { label: 'در حال پیگیری', ...of('accent', 'accent-bg') }, salon: { label: 'سالن', ...of('violet', 'violet-bg') }, completed: { label: 'ویزیت شده', ...of('success', 'success-bg') }, cancelled_by_doctor: { label: 'لغو شده', ...of('danger', 'danger-bg') }, cancelled_by_user: { label: 'لغو توسط بیمار', ...of('danger', 'danger-bg') }, no_show: { label: 'غیبت', ...of('text-3', 'surface-2') }, expired: { label: 'منقضی', ...of('text-3', 'surface-2') }, }; // اسلات خالی (نوبت جدید) — tauri: empty. export const EMPTY_SLOT_CONFIG: TurnStatusConfig = { label: 'نوبت جدید', ...of('primary', 'primary-soft'), }; export function turnStatusConfig(status: string): TurnStatusConfig { return STATUS[status] ?? EMPTY_SLOT_CONFIG; } /** وضعیت‌هایی که نوبت را «لغوشده» می‌کنند (برای منطق تایم‌لاین/آمار). */ export const CANCELLED_STATUSES = new Set([ 'cancelled_by_doctor', 'cancelled_by_user', 'cancelled_by_admin', 'auto_cancel_unpaid', 'no_show', 'expired', ]);