feat(orders): display confirmed pickup date and slot under PR in orders table
This commit is contained in:
parent
9d1966ea79
commit
64bcbe080e
3 changed files with 81 additions and 12 deletions
|
|
@ -243,18 +243,26 @@ export const SellerProvider: React.FC<{ children: React.ReactNode }> = ({ childr
|
|||
|
||||
// Map Orders
|
||||
setOrders(ordersArr.map((o: any) => {
|
||||
let dynamicSlot = 'Afternoon Slot (2 PM - 5 PM)';
|
||||
if (o.pickup_payload?.pickup_time) {
|
||||
const t = String(o.pickup_payload.pickup_time);
|
||||
if (t.startsWith('10')) dynamicSlot = 'Morning Slot (10 AM - 1 PM)';
|
||||
else if (t.startsWith('14')) dynamicSlot = 'Afternoon Slot (2 PM - 5 PM)';
|
||||
else if (t.startsWith('17')) dynamicSlot = 'Evening Slot (5 PM - 7 PM)';
|
||||
else dynamicSlot = t;
|
||||
} else if (o.eta && o.eta.includes('(')) {
|
||||
const m = o.eta.match(/\(([^)]+)\)/);
|
||||
if (m) dynamicSlot = m[1];
|
||||
let pickupDateVal = o.pickup_payload?.pickup_date || '';
|
||||
let pickupTimeVal = o.pickup_payload?.pickup_time || '';
|
||||
|
||||
if (!pickupDateVal && o.eta && String(o.eta).includes('Pickup:')) {
|
||||
const mDate = String(o.eta).match(/Pickup:\s*([\d-]+)/);
|
||||
if (mDate) pickupDateVal = mDate[1];
|
||||
}
|
||||
|
||||
if (!pickupTimeVal && o.eta && String(o.eta).includes('(')) {
|
||||
const mTime = String(o.eta).match(/\(([^)]+)\)/);
|
||||
if (mTime) pickupTimeVal = mTime[1];
|
||||
}
|
||||
|
||||
let dynamicSlot = '02:00 PM – 06:00 PM';
|
||||
const t = String(pickupTimeVal || '');
|
||||
if (t.startsWith('10')) dynamicSlot = '10:00 AM – 01:00 PM';
|
||||
else if (t.startsWith('14')) dynamicSlot = '02:00 PM – 06:00 PM';
|
||||
else if (t.startsWith('17')) dynamicSlot = '05:00 PM – 08:00 PM';
|
||||
else if (t) dynamicSlot = t;
|
||||
|
||||
return {
|
||||
id: String(o.id),
|
||||
orderNumber: o.order_id || `ORD-${o.id}`,
|
||||
|
|
@ -270,6 +278,8 @@ export const SellerProvider: React.FC<{ children: React.ReactNode }> = ({ childr
|
|||
awbNumber: o.tracking || 'N/A',
|
||||
pickupId: o.pickup_id || undefined,
|
||||
pickupPayload: o.pickup_payload || undefined,
|
||||
pickupDate: pickupDateVal || undefined,
|
||||
pickupTime: pickupTimeVal || undefined,
|
||||
pickupSlot: dynamicSlot,
|
||||
deliveryDate: o.eta || '2-3 Days'
|
||||
};
|
||||
|
|
|
|||
|
|
@ -22,6 +22,33 @@ import {
|
|||
Clock
|
||||
} from 'lucide-react';
|
||||
|
||||
const formatPickupDate = (dateStr?: string, fallbackEta?: string) => {
|
||||
if (dateStr && dateStr.includes('-')) {
|
||||
try {
|
||||
const parts = dateStr.split('-');
|
||||
if (parts.length === 3) {
|
||||
const d = new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));
|
||||
return d.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
|
||||
}
|
||||
} catch {}
|
||||
return dateStr;
|
||||
}
|
||||
if (fallbackEta && fallbackEta.includes('Pickup:')) {
|
||||
const m = fallbackEta.match(/Pickup:\s*([\d-]+)/);
|
||||
if (m) {
|
||||
try {
|
||||
const parts = m[1].split('-');
|
||||
if (parts.length === 3) {
|
||||
const d = new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10));
|
||||
return d.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
|
||||
}
|
||||
} catch {}
|
||||
return m[1];
|
||||
}
|
||||
}
|
||||
return dateStr || '';
|
||||
};
|
||||
|
||||
export const OrdersPage: React.FC = () => {
|
||||
const navigate = useNavigate();
|
||||
const { orders, acceptOrder, readyToShipOrder, shipOrder, rejectOrder, trackOrder, getOrderLabel, cancelOrderPickup, reschedulePickup, fetchData } = useSeller();
|
||||
|
|
@ -583,8 +610,38 @@ export const OrdersPage: React.FC = () => {
|
|||
ord.status.replace('_', ' ').toUpperCase()}
|
||||
</span>
|
||||
{ord.pickupId && (
|
||||
<div className="is-size-7 mt-1 has-text-weight-semibold" style={{ color: '#15803d' }}>
|
||||
PR #{ord.pickupId}
|
||||
<div className="mt-1">
|
||||
<div className="is-size-7 has-text-weight-bold" style={{ color: '#15803d' }}>
|
||||
PR #{ord.pickupId}
|
||||
</div>
|
||||
{(ord.pickupDate || ord.deliveryDate?.includes('Pickup:') || ord.pickupSlot) && (
|
||||
<div
|
||||
className="mt-1"
|
||||
style={{
|
||||
display: 'inline-flex',
|
||||
alignItems: 'center',
|
||||
gap: '5px',
|
||||
background: '#f0fdf4',
|
||||
border: '1px solid #bbf7d0',
|
||||
borderRadius: '6px',
|
||||
padding: '2px 8px',
|
||||
color: '#166534',
|
||||
fontSize: '0.72rem',
|
||||
whiteSpace: 'nowrap'
|
||||
}}
|
||||
title={`Confirmed Pickup: ${formatPickupDate(ord.pickupDate, ord.deliveryDate)} (${ord.pickupSlot || '02:00 PM – 06:00 PM'})`}
|
||||
>
|
||||
<Calendar size={11} style={{ color: '#15803d', flexShrink: 0 }} />
|
||||
<span style={{ fontWeight: 700 }}>
|
||||
{formatPickupDate(ord.pickupDate, ord.deliveryDate) || 'Scheduled'}
|
||||
</span>
|
||||
<span style={{ color: '#86efac' }}>•</span>
|
||||
<Clock size={11} style={{ color: '#15803d', flexShrink: 0 }} />
|
||||
<span style={{ fontWeight: 600 }}>
|
||||
{ord.pickupSlot || '02:00 PM – 06:00 PM'}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -111,6 +111,8 @@ export interface OrderItem {
|
|||
courierPartner: string;
|
||||
awbNumber: string;
|
||||
pickupSlot?: string;
|
||||
pickupDate?: string;
|
||||
pickupTime?: string;
|
||||
deliveryDate?: string;
|
||||
imageUrl?: string;
|
||||
shippingAddress?: string;
|
||||
|
|
|
|||
Loading…
Reference in a new issue