feat(orders): display confirmed pickup date and slot under PR in orders table
All checks were successful
Beta CI/CD Pipeline / build-and-test (push) Successful in 1m36s
Beta CI/CD Pipeline / deploy-beta (push) Successful in 43s

This commit is contained in:
vickytechkey 2026-10-13 20:16:11 +05:30
parent 9d1966ea79
commit 64bcbe080e
3 changed files with 81 additions and 12 deletions

View file

@ -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'
};

View file

@ -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>

View file

@ -111,6 +111,8 @@ export interface OrderItem {
courierPartner: string;
awbNumber: string;
pickupSlot?: string;
pickupDate?: string;
pickupTime?: string;
deliveryDate?: string;
imageUrl?: string;
shippingAddress?: string;