111 lines
3.7 KiB
TypeScript
111 lines
3.7 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>> = {
|
||
|
|
awaiting_review: {
|
||
|
|
variant: 'waiting',
|
||
|
|
title: 'در انتظار بررسی مدیریت',
|
||
|
|
description: 'سفارش شما ثبت شده و در صف بررسی مدیریت قرار دارد. پس از بررسی، نتیجه از طریق همین صفحه اطلاعرسانی میشود.',
|
||
|
|
},
|
||
|
|
pricing: {
|
||
|
|
variant: 'waiting',
|
||
|
|
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 }
|