"use client"; import { useEffect, useState } from "react"; import { ArrowLeft } from "lucide-react"; import { useNavigation } from "../../hooks"; import { Button } from "../../components/ui/button"; import { OrderInfoCard } from "./OrderInfoCard"; import Timeline from "./OrderTimeline"; import { QRCodeRastreamento } from "../../components/qr-code-rastreamento"; import { ordersApi } from "../../lib/api"; import { createSearchParams, buildUrl } from "../../utils/url-helpers"; import { Order, OrderItem, OrderDelivery, cutitens, transfer, status, TimelineEvent, leadtime, } from "../types"; /** * Interface que define a estrutura de um evento na timeline */ export interface TimelineDisplayEvent { id: string; codigoFuncionario: string; description: string; date: string; status: string; icon: any; color: string; } interface OrderDetailProps { order: Order; timelineEvents: leadtime[]; } export function mapTimelineEvents(events: leadtime[]): TimelineEvent[] { return events.map(event => ({ id: event.descricaoEtapa, title: event.descricaoEtapa, description: event.descricao || "Status updated", date: event.data || new Date().toISOString(), status: event.descricaoEtapa, user: event.codigoFuncionario, })); } export function OrderDetail({ order, timelineEvents }: OrderDetailProps) { const { searchParams, navigateTo, goBack, goToOrdersFind } = useNavigation(); const from = searchParams.get("from"); const returnPath = searchParams.get("returnPath") || "/orders/find"; const [orderItems, setOrderItems] = useState([]); const [loadingItems, setLoadingItems] = useState(false); const [itemsError, setItemsError] = useState(null); const [cutItems, setCutItems] = useState([]); const [transfers, setTransfers] = useState([]); const [statusData, setStatusData] = useState([]); const [orderDelivery, setOrderDelivery] = useState({ placeId: 0, placeName: "", street: "", addressNumber: "", bairro: "", city: "", state: "", addressComplement: "", cep: "", commentOrder1: "", commentOrder2: "", commentDelivery1: order.commentDelivery1 || "", commentDelivery2: "", commentDelivery3: "", commentDelivery4: "", shippimentId: 0, shippimentDate: new Date(), shippimentComment: "", place: order.deliveryLocal || "", driver: order.driver || "", car: order.carDescription || "", closeDate: new Date(), separatorName: "", confName: "", releaseDate: new Date(), }); useEffect(() => { async function fetchOrderItems() { if (!order.orderId) return; setLoadingItems(true); setItemsError(null); try { const response = await ordersApi.getOrderItems(order.orderId); const items = Array.isArray(response?.data) ? response.data : Array.isArray(response) ? response : []; setOrderItems(items); } catch { setItemsError("Could not load order items."); } finally { setLoadingItems(false); } } fetchOrderItems(); }, [order.orderId]); useEffect(() => { async function fetchDeliveryInfo() { if (!order.orderId) return; try { const response = await ordersApi.getOrderDelivery(order.orderId); const data = response?.data || response; setOrderDelivery(prev => ({ ...prev, ...data, place: data.place || order.deliveryLocal || "", driver: data.driver || order.driver || "", car: data.car || order.carDescription || "", })); } catch {} } fetchDeliveryInfo(); }, [order.orderId]); useEffect(() => { async function fetchCutItems() { if (!order.orderId) return; try { const response = await ordersApi.getCutItems(order.orderId); const items = Array.isArray(response?.data) ? response.data : Array.isArray(response) ? response : []; setCutItems(items); } catch {} } fetchCutItems(); }, [order.orderId]); useEffect(() => { async function fetchTransfers() { if (!order.orderId) return; try { const id = parseInt(order.orderId); if (isNaN(id)) return; const response = await ordersApi.getTransfer(id); const items = Array.isArray(response?.data) ? response.data : Array.isArray(response) ? response : []; setTransfers( items.map(item => ({ ...item, oldShipmentId: Number(item.oldShipmentId ?? item.oldShipment ?? 0), newShipmentId: Number(item.newShipmentId ?? item.newShipment ?? 0), })) ); } catch {} } fetchTransfers(); }, [order.orderId]); useEffect(() => { async function fetchStatusData() { if (!order.orderId) return; try { const id = parseInt(order.orderId); if (isNaN(id)) return; const response = await ordersApi.getStatusOrder(id); const items = Array.isArray(response?.data) ? response.data : Array.isArray(response) ? response : []; setStatusData(items); } catch {} } fetchStatusData(); }, [order.orderId]); const returnParams = createSearchParams( searchParams, ["from", "returnPath"], { origem: "detail", noRefresh: "true", preserveState: "true" } ); const handleBack = () => { if (from === "lista") { const baseUrl = returnPath; const params: Record = {}; searchParams.forEach((value, key) => { params[key] = value; }); const url = buildUrl(baseUrl, { ...params, origem: "detail", noRefresh: "true", preserveState: "true", }); navigateTo(url); } else if (window.history.length > 2) { goBack(); } else { // Usar a função que limpa parâmetros ao navegar para orders/find goToOrdersFind(); } }; const orderWithDefaults = { ...order, paymentMethod: order.paymentMethod || "Not provided", paymentPlan: order.paymentPlan || "Not provided", paymentName: order.paymentName || "Not provided", driver: order.driver || "Not provided", carDescription: order.carDescription || "Not provided", deliveryLocal: order.deliveryLocal || "Not provided", deliveryType: order.deliveryType || "Not provided", }; const store = { storeId: order.storeId, store: order.storeName, }; return (

Pedido {order.orderId}

Detalhes completos do pedido

); }