Show sidebar labels on tablet, improve theme-safe UI, and keep Jalali dates on tracking. Co-authored-by: Cursor <cursoragent@cursor.com>
129 lines
4.6 KiB
TypeScript
129 lines
4.6 KiB
TypeScript
import type { Order, OrderStatus } from '@/types'
|
|
import { ORDER_TRACKING_STEPS } from '@/utils/constants'
|
|
|
|
export type StatusHeroVariant = 'waiting' | 'success' | 'info' | 'none'
|
|
|
|
export interface StatusHeroConfig {
|
|
variant: StatusHeroVariant
|
|
title: string
|
|
description?: string
|
|
}
|
|
|
|
const STATUS_STEP_INDEX: Partial<Record<OrderStatus, number>> = {
|
|
submitted: 0,
|
|
awaiting_review: 1,
|
|
pricing: 2,
|
|
check_in_progress: 3,
|
|
awaiting_check_review: 4,
|
|
check_needs_fix: 4,
|
|
check_rejected: 4,
|
|
checks_approved: 5,
|
|
final_approved: 6,
|
|
cash_confirmed: 6,
|
|
preparing: 7,
|
|
ready_to_ship: 8,
|
|
shipped: 9,
|
|
delivered: 10,
|
|
}
|
|
|
|
const STATUS_HERO: Partial<Record<OrderStatus, StatusHeroConfig>> = {
|
|
submitted: {
|
|
variant: 'waiting',
|
|
title: 'پیشسفارش ثبت شد',
|
|
description:
|
|
'سفارش شما برای بررسی و قیمتگذاری به مدیریت ارسال شد. پس از صدور فاکتور میتوانید روش تسویه (نقد یا چک) را انتخاب کنید.',
|
|
},
|
|
awaiting_review: {
|
|
variant: 'waiting',
|
|
title: 'در انتظار بررسی مدیریت',
|
|
description:
|
|
'پیشسفارش شما در صف بررسی است. پس از قیمتگذاری و صدور فاکتور، از طریق همین صفحه برای انتخاب تسویه مطلع میشوید.',
|
|
},
|
|
pricing: {
|
|
variant: 'waiting',
|
|
title: 'در حال قیمتگذاری',
|
|
description:
|
|
'مدیریت در حال تعیین مبلغ نهایی فاکتور است. تا قبل از صدور فاکتور امکان ثبت چک یا پرداخت وجود ندارد.',
|
|
},
|
|
awaiting_settlement: {
|
|
variant: 'info',
|
|
title: 'فاکتور آماده است',
|
|
description: 'مبلغ فاکتور مشخص شده. لطفاً روش تسویه را انتخاب کنید و مسیر پرداخت را ادامه دهید.',
|
|
},
|
|
awaiting_settlement_fix: {
|
|
variant: 'info',
|
|
title: 'نیاز به اصلاح تسویه',
|
|
description: 'لطفاً روش تسویه یا اطلاعات پرداخت را اصلاح کنید.',
|
|
},
|
|
awaiting_check_review: {
|
|
variant: 'waiting',
|
|
title: 'در حال بررسی چکها',
|
|
description: 'چکهای ثبتشده در حال بررسی هستند. نتیجه بررسی بهزودی اعلام میشود.',
|
|
},
|
|
checks_approved: {
|
|
variant: 'success',
|
|
title: 'چکها تأیید شده',
|
|
description: 'چکهای شما توسط مدیریت تأیید شد. سفارش وارد مراحل بعدی میشود.',
|
|
},
|
|
cash_confirmed: {
|
|
variant: 'success',
|
|
title: 'پرداخت تأیید شد',
|
|
description: 'رسید پرداخت شما تأیید شد و سفارش وارد مراحل بعدی میشود.',
|
|
},
|
|
final_approved: {
|
|
variant: 'success',
|
|
title: 'تأیید نهایی',
|
|
description: 'سفارش شما تأیید نهایی شد و آماده آمادهسازی است.',
|
|
},
|
|
preparing: {
|
|
variant: 'info',
|
|
title: 'در حال آمادهسازی',
|
|
description: 'سفارش شما در انبار در حال آمادهسازی است.',
|
|
},
|
|
ready_to_ship: {
|
|
variant: 'info',
|
|
title: 'آماده ارسال',
|
|
description: 'سفارش آماده ارسال است و بهزودی تحویل باربری میشود.',
|
|
},
|
|
shipped: {
|
|
variant: 'info',
|
|
title: 'ارسال شده',
|
|
description: 'سفارش ارسال شده است. جزئیات بارنامه را میتوانید مشاهده کنید.',
|
|
},
|
|
delivered: {
|
|
variant: 'success',
|
|
title: 'تحویل شده',
|
|
description: 'سفارش با موفقیت تحویل داده شد.',
|
|
},
|
|
}
|
|
|
|
export function getTrackingStepIndex(status: OrderStatus): number {
|
|
return STATUS_STEP_INDEX[status] ?? 1
|
|
}
|
|
|
|
export function getStatusHero(status: OrderStatus): StatusHeroConfig | null {
|
|
return STATUS_HERO[status] ?? null
|
|
}
|
|
|
|
export function getStepTimestamp(order: Order, stepStatus: OrderStatus): string | null {
|
|
if (stepStatus === 'submitted') {
|
|
return order.createdAt
|
|
}
|
|
|
|
const entry = [...order.statusHistory]
|
|
.reverse()
|
|
.find((item) => item.toStatus === stepStatus)
|
|
|
|
return entry?.changedAt ?? null
|
|
}
|
|
|
|
export function getTrackingFooterLabel(status: OrderStatus): string {
|
|
if (status === 'shipped') return 'مشاهده جزئیات و بارنامه'
|
|
if (['checks_approved', 'cash_confirmed', 'delivered', 'final_approved'].includes(status)) {
|
|
return 'مشاهده جزئیات'
|
|
}
|
|
return 'مشاهده جزئیات سفارش'
|
|
}
|
|
|
|
export { ORDER_TRACKING_STEPS }
|