import React, { useState, useEffect } from "react"; import { shippingService, DeliveryScheduleItem, } from "../src/services/shipping.service"; export interface DeliveryDay { date: string; day: string; cap: number; sales: number; capDisp: number; available: "Sim" | "Não"; } interface BaldinhoProps { selectedDeliveryDate: string; onDateChange: (date: string) => void; deliveryDays?: DeliveryDay[]; // Opcional agora, pois será carregado dinamicamente } const Baldinho: React.FC = ({ selectedDeliveryDate, onDateChange, deliveryDays: deliveryDaysProp, }) => { const [deliveryDays, setDeliveryDays] = useState( deliveryDaysProp || [] ); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); /** * Converte um item da API para o formato do componente */ const mapApiItemToDeliveryDay = (item: DeliveryScheduleItem): DeliveryDay => { const date = new Date(item.dateDelivery); const dayNames = [ "domingo", "segunda-feira", "terça-feira", "quarta-feira", "quinta-feira", "sexta-feira", "sábado", ]; const dayName = dayNames[date.getUTCDay()]; // Formatar data como DD/MM/YYYY const formattedDate = date.toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", timeZone: "UTC", }); return { date: formattedDate, day: dayName, cap: item.deliverySize || 0, sales: item.saleWeigth || 0, capDisp: item.avaliableDelivery || 0, available: item.delivery === "S" ? "Sim" : "Não", }; }; /** * Carrega os dados do agendamento de entrega da API * Segue o mesmo padrão do Angular: getScheduleDelivery() */ useEffect(() => { const loadDeliverySchedule = async () => { try { setLoading(true); setError(null); // Se já tiver dados via props, não carrega da API if (deliveryDaysProp && deliveryDaysProp.length > 0) { setDeliveryDays(deliveryDaysProp); setLoading(false); return; } const response = await shippingService.getScheduleDelivery(); if ( response && response.deliveries && Array.isArray(response.deliveries) ) { const mappedDays = response.deliveries.map(mapApiItemToDeliveryDay); setDeliveryDays(mappedDays); // Se não houver data selecionada e houver dias disponíveis, selecionar o primeiro disponível if (!selectedDeliveryDate && mappedDays.length > 0) { const firstAvailable = mappedDays.find( (d) => d.available === "Sim" ); if (firstAvailable) { onDateChange(firstAvailable.date); } } } else { setDeliveryDays([]); } } catch (err: any) { console.error("Erro ao carregar agendamento de entrega:", err); setError(err.message || "Erro ao carregar dados de entrega"); setDeliveryDays([]); } finally { setLoading(false); } }; loadDeliverySchedule(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Carrega apenas uma vez ao montar o componente return (
{/* Lateral: Seleção Atual */}
Fluxo de Logística

Agendamento de Entrega:

{selectedDeliveryDate}

Confira a grade ao lado. Dias em{" "} VERMELHO estão com capacidade esgotada ou sem operação.

{/* Elementos decorativos */}
{/* Tabela de Disponibilidade */}

Capacidade Operacional

Selecione uma data disponível para continuar o pedido

{" "} Bloqueado
{" "} Liberado
{loading ? (
Carregando disponibilidade...
) : error ? (

{error}

) : deliveryDays.length === 0 ? (

Nenhum agendamento disponível

) : (
{deliveryDays.map((d, i) => { const occupancy = d.cap > 0 ? (d.sales / d.cap) * 100 : 100; const isFull = d.available === "Não"; return ( !isFull && onDateChange(d.date)} className={`transition-all duration-200 group cursor-pointer ${ isFull ? "bg-red-600 text-white hover:bg-red-700" : selectedDeliveryDate === d.date ? "bg-orange-50 text-orange-900 border-l-4 border-l-orange-500" : "bg-white hover:bg-slate-50" }`} > ); })}
Data Dia Capacidade Carga Atual Status
{d.date} {d.day} {d.cap} Ton
{d.sales.toFixed(3)} Ton
85 ? "bg-orange-500" : "bg-emerald-500" }`} style={{ width: `${Math.min(occupancy, 100)}%`, }} >
{d.available === "Sim" ? "• Disponível" : "• Esgotado"} {!isFull && ( )}
)}
); }; export default Baldinho;