Files
shop-admin/src/pages/orders/Native.tsx
T
hamid zarghami 587a2f30b1 base page title
2025-10-15 12:29:37 +03:30

144 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { type FC, useState } from 'react'
import { useSearchParams } from 'react-router-dom'
import PageLoading from '../../components/PageLoading'
import Error from '../../components/Error'
import PaginationUi from '../../components/PaginationUi'
import PageTitle from '../../components/PageTitle'
import Td from '../../components/Td'
import { Eye } from 'iconsax-react'
import { Link } from 'react-router-dom'
import { type NativeOrderType } from '@/pages/orders/types/Types'
import { useGetNativeOrders } from '@/pages/orders/hooks/useOrderData'
import { Pages } from '@/config/Pages'
const STATUS_CONFIG = {
Cancelled: { label: 'کنسل شده', color: 'bg-red-100 text-red-800' },
wait_payment: { label: 'در انتظار پرداخت', color: 'bg-orange-100 text-orange-800' },
process_by_sellers: { label: 'در حال پردازش توسط فروشنده', color: 'bg-blue-100 text-blue-800' },
cancelled_system: { label: 'کنسل شده توسط سیستم', color: 'bg-red-100 text-red-800' },
Delivered: { label: 'تحویل داده شده', color: 'bg-green-100 text-green-800' },
}
const getStatusLabel = (status: string): string => STATUS_CONFIG[status as keyof typeof STATUS_CONFIG]?.label || status
const getStatusColor = (status: string): string => {
const statusConfig = STATUS_CONFIG[status as keyof typeof STATUS_CONFIG]
return statusConfig && 'color' in statusConfig ? statusConfig.color : 'bg-gray-100 text-gray-800'
}
const Native: FC = () => {
const [searchParams] = useSearchParams()
const status = searchParams.get('status') || ''
const [currentPage, setCurrentPage] = useState(1)
const { data, isLoading, error } = useGetNativeOrders(currentPage, status)
const orders = data?.results?.orders || []
const pager = data?.results?.pager ? {
...data.results.pager,
prevPage: data.results.pager.prevPage ? true : null,
nextPage: data.results.pager.nextPage ? 'next' : null
} : {
page: 1,
limit: 10,
totalPages: 1,
totalItems: 0,
prevPage: null,
nextPage: null
}
if (isLoading) {
return (
<div className="flex justify-center items-center min-h-[400px]">
<PageLoading />
</div>
)
}
if (error) {
return (
<div className="flex justify-center items-center min-h-[400px]">
<Error errorText={`خطا در بارگذاری ${getStatusLabel(status)}`} />
</div>
)
}
const getTableHeaders = () => {
const headers = [
'شماره سفارش',
'مشتری',
'مبلغ',
'وضعیت'
]
headers.push('تاریخ')
headers.push('عملیات')
return headers.map(header => <Td key={header} text={header} />)
}
const getTableRow = (order: NativeOrderType) => {
const statusColor = getStatusColor(order.orderStatus)
return (
<tr key={order._id} className='tr'>
<Td text={`#${order._id}`} />
<Td text={order.user?.fullName || 'نامشخص'} />
<Td text={(order.payment?.totalPrice || 0).toLocaleString('fa-IR')} />
<Td text="">
<span className={`px-2 py-1 rounded-full text-xs ${statusColor}`}>
{getStatusLabel(order.orderStatus)}
</span>
</Td>
<Td text={order.createdAt || 'نامشخص'} />
<Td text="">
<div className="flex items-center gap-2">
<Link to={`${Pages.orders.detailUser}${order._id}`}>
<Eye color='#8C90A3' size={16} className="cursor-pointer hover:text-blue-500 transition-colors" />
</Link>
</div>
</Td>
</tr>
)
}
const columnCount = 6
return (
<div className="space-y-6">
<PageTitle />
<h1 className="text-2xl font-bold">{getStatusLabel(status)}</h1>
<div className='relative overflow-x-auto rounded-3xl bg-white shadow-sm'>
<table className='w-full text-sm'>
<thead className='thead'>
<tr>
{getTableHeaders()}
</tr>
</thead>
<tbody>
{orders.length === 0 ? (
<tr className='tr'>
<td colSpan={columnCount} className="text-center py-12 text-gray-500">
هیچ سفارشی یافت نشد
</td>
</tr>
) : (
orders.map(order => getTableRow(order))
)}
</tbody>
</table>
</div>
{orders.length > 0 && (
<PaginationUi
pager={pager}
onPageChange={setCurrentPage}
/>
)}
</div>
)
}
export default Native