import { useEffect, useState } from 'react'; import { orderBookingClient } from '../../api/clients'; import { ORDER_BOOKING } from '../../api/config'; import { Card } from '../reusable/Card'; import { Spinner } from '../reusable/Spinner'; import { EmptyState } from '../reusable/EmptyState'; import { Store, User, Package, Calendar, Hash, Mail, Weight, List, MapPin, ArrowLeft } from 'lucide-react'; export interface WiredDetailViewProps { instanceId: number | string; columns?: 1 | 2 | 3; onDataLoad?: (data: Record) => void; onBack?: () => void; } export function OrderDetail({ instanceId, onDataLoad, onBack }: WiredDetailViewProps) { const [data, setData] = useState | null>(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { let live = true; async function run() { setLoading(true); setError(null); try { const r = await orderBookingClient.detailView(ORDER_BOOKING.detailViews.ORDERS, instanceId); if (live) { setData(r.data || {}); if (onDataLoad) onDataLoad(r.data || {}); } } catch (e) { if (live) setError((e as { message?: string })?.message ?? 'Failed to load'); } finally { if (live) setLoading(false); } } run(); return () => { live = false; }; }, [instanceId]); if (error) { return ( ); } if (loading) { return (
); } if (!data || Object.keys(data).length === 0) { return ( ); } const remainingData = { ...data }; const extract = (key: string, obj: any = data) => { if (obj && key in obj) { const val = obj[key]; delete obj[key]; return val; } return null; }; // State const stateName = extract('current_state_name', remainingData) || 'Ordered'; delete remainingData.current_state_id; // Order Details const orderId = extract('order_id', remainingData) || '-'; let dateOfOrder = extract('date_of_order_3', remainingData); if (dateOfOrder) { dateOfOrder = new Date(dateOfOrder as string).toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }); } else { dateOfOrder = '-'; } // SO Info const soKey = Object.keys(remainingData).find(k => k.endsWith('__user_id')) || 'so_name'; const soRaw = extract(soKey, remainingData); let soName = '-'; let soEmail = '-'; let soId = '-'; if (soRaw && typeof soRaw === 'object') { soName = (soRaw as any).name || '-'; soEmail = (soRaw as any).email || '-'; soId = (soRaw as any).user_id || (soRaw as any).id || (soRaw as any).uid || '-'; } const soInitials = soName.length > 2 ? soName.substring(0,2).toUpperCase() : 'SO'; // Store Info const storeRaw = extract('select_store', remainingData); let storeName = '-'; let distributorName = '-'; let routeName = '-'; let routeCode = '-'; if (storeRaw && typeof storeRaw === 'object') { storeName = (storeRaw as any).business_name || '-'; distributorName = (storeRaw as any).distributor_name || '-'; routeName = (storeRaw as any).route_name || '-'; routeCode = (storeRaw as any).route_code || '-'; } // Line Items const orderDetailsGrid = extract('order_details_3', remainingData); const itemsArray = Array.isArray(orderDetailsGrid) ? orderDetailsGrid : []; // Totals const totalBags = extract('total_bags_3', remainingData) || 0; const totalKgs = extract('total_kgs_3', remainingData) || 0; return (
{/* Top Section */}
{onBack && ( )}
Order ID
{String(orderId)}
{String(dateOfOrder)} Instance #{instanceId}
Store
{String(storeName)}
{String(routeCode)} - {String(routeName)}
{String(distributorName)}
{/* Middle Stats Section */}
TOTAL BAGS
{String(totalBags)}
TOTAL KGS
{Number(totalKgs).toLocaleString()}
LINE ITEMS
{itemsArray.length}
{/* Bottom Section */}
{/* Left Table */}
ORDER PRODUCTS
{itemsArray.map((item: any, idx: number) => { const productName = String(item.product_name_3 || item.product_name || 'Unknown Product'); const skuCodeRaw = item.sku_code_3 || item.sku_code || ''; const skuCode = isNaN(Number(skuCodeRaw)) || String(skuCodeRaw).length > 3 ? String(skuCodeRaw) : ''; const category = String(item.product_category_3 || item.product_category || ''); const brCode = String(item.br_code_3 || item.br_code || ''); const subtitleArr = [skuCode, category, brCode].filter(v => v && v !== '-' && v !== '—'); const subtitle = subtitleArr.join(' . ').toUpperCase(); const bagsNum = Number(item.bags_3 || item.bags || 0); const bagsStr = String(bagsNum); const skuNum = Number(item.sku_3 || item.sku || 0); const rowKgsRaw = item.row_kgs_3 || item.row_kgs || item.weight; const kgsNum = skuNum > 0 ? skuNum * bagsNum : Number(rowKgsRaw || 0); const kgsStr = kgsNum > 0 ? `${kgsNum} kg` : '0 kg'; return (
{productName}
{bagsStr} Bags ({kgsStr})
); })} {itemsArray.length > 0 && (
TOTAL
{totalBags} Bags ({Number(totalKgs).toLocaleString()} kg)
)}
{/* Right Sidebar */}
{/* SO Card */}
Sales Officer
{soInitials}
{String(soName)}
Sales Officer - ID {String(soId)}
Email
{String(soEmail)}
User ID
{String(soId)}
{/* Order Meta */}
Order Meta
Instance #{instanceId}
State {String(stateName)}
Date of Order {String(dateOfOrder)}
); }