chore: build
This commit is contained in:
@@ -102,7 +102,9 @@ const getDeliveryAddress = (order: OrderWithTracking): string => {
|
||||
|
||||
const formatOrderItem = (item: OrderItem) => {
|
||||
return {
|
||||
name: String(item.produit || item.product_name || item.name_product || "Produit"),
|
||||
name: String(
|
||||
item.produit || item.product_name || item.name_product || "Produit",
|
||||
),
|
||||
quantity: Number(item.quantite || item.quantity || 0),
|
||||
price: Number(item.prix || item.price || 0),
|
||||
};
|
||||
@@ -157,7 +159,6 @@ const getStatusIcon = (status: string): IconDefinition => {
|
||||
return iconMap[status?.toLowerCase()] || faQuestionCircle;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* ✅ Calculer les points avec le TOTAL (pas item par item)
|
||||
*/
|
||||
@@ -335,33 +336,35 @@ function SuiviLivraison() {
|
||||
|
||||
if (response.success) {
|
||||
const ordersWithTracking = await Promise.all(
|
||||
(response.commands || []).map(async (order: OrderDetail) => {
|
||||
const normalizedOrder = {
|
||||
...order,
|
||||
total: getTotalAmount(order),
|
||||
};
|
||||
(response.commands || []).map(
|
||||
async (order: OrderDetail) => {
|
||||
const normalizedOrder = {
|
||||
...order,
|
||||
total: getTotalAmount(order),
|
||||
};
|
||||
|
||||
let tracking;
|
||||
let eta;
|
||||
let tracking;
|
||||
let eta;
|
||||
|
||||
try {
|
||||
tracking = await getOrderTracking(order.id);
|
||||
} catch {
|
||||
tracking = undefined;
|
||||
}
|
||||
try {
|
||||
tracking = await getOrderTracking(order.id);
|
||||
} catch {
|
||||
tracking = undefined;
|
||||
}
|
||||
|
||||
try {
|
||||
eta = await getOrderETA(order.id);
|
||||
} catch {
|
||||
eta = undefined;
|
||||
}
|
||||
try {
|
||||
eta = await getOrderETA(order.id);
|
||||
} catch {
|
||||
eta = undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
...normalizedOrder,
|
||||
tracking,
|
||||
eta,
|
||||
};
|
||||
}),
|
||||
return {
|
||||
...normalizedOrder,
|
||||
tracking,
|
||||
eta,
|
||||
};
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
setOrders(ordersWithTracking);
|
||||
@@ -369,7 +372,10 @@ function SuiviLivraison() {
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
console.error("Erreur loadOrders:", err);
|
||||
const msg = err instanceof Error ? err.message : "Erreur lors du chargement";
|
||||
const msg =
|
||||
err instanceof Error
|
||||
? err.message
|
||||
: "Erreur lors du chargement";
|
||||
setError(msg);
|
||||
showToast(msg, "error");
|
||||
} finally {
|
||||
@@ -400,7 +406,10 @@ function SuiviLivraison() {
|
||||
const order = orders.find((o) => o.id === orderId);
|
||||
|
||||
if (order) {
|
||||
const { points, categoryDisplay } = calculateOrderPoints(order, poolNames);
|
||||
const { points, categoryDisplay } = calculateOrderPoints(
|
||||
order,
|
||||
poolNames,
|
||||
);
|
||||
setSelectedOrderPoints(points);
|
||||
setSelectedOrderCategoryDisplay(categoryDisplay);
|
||||
} else {
|
||||
@@ -454,11 +463,6 @@ function SuiviLivraison() {
|
||||
);
|
||||
setConfirming(null);
|
||||
loadOrders();
|
||||
const confirmedOrder = orders.find((o) => o.id === orderToConfirm);
|
||||
navigate(
|
||||
`/user/commande/${confirmedOrder?.client_order_number ?? orderToConfirm}`,
|
||||
{ state: { commandId: orderToConfirm } },
|
||||
);
|
||||
} else {
|
||||
setError(response.message || "Erreur lors de la confirmation");
|
||||
showToast(
|
||||
@@ -554,7 +558,12 @@ function SuiviLivraison() {
|
||||
}
|
||||
} catch (error: unknown) {
|
||||
console.error("❌ [CANCEL] Erreur:", error);
|
||||
showToast(error instanceof Error ? error.message : "Erreur lors de l'annulation", "error");
|
||||
showToast(
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Erreur lors de l'annulation",
|
||||
"error",
|
||||
);
|
||||
} finally {
|
||||
setCancellingOrder(null);
|
||||
}
|
||||
@@ -622,10 +631,19 @@ function SuiviLivraison() {
|
||||
// Heure d'arrivée estimée : depuis le backend ou calculée côté client
|
||||
const computedArrival = (() => {
|
||||
if (statusLow !== "en_route") return null;
|
||||
if (order.eta?.estimated_arrival) return order.eta.estimated_arrival;
|
||||
if (order.eta?.eta_minutes && order.eta.eta_minutes > 0) {
|
||||
return new Date(Date.now() + order.eta.eta_minutes * 60000)
|
||||
.toLocaleTimeString("fr-FR", { hour: "2-digit", minute: "2-digit" });
|
||||
if (order.eta?.estimated_arrival)
|
||||
return order.eta.estimated_arrival;
|
||||
if (
|
||||
order.eta?.eta_minutes &&
|
||||
order.eta.eta_minutes > 0
|
||||
) {
|
||||
return new Date(
|
||||
Date.now() +
|
||||
order.eta.eta_minutes * 60000,
|
||||
).toLocaleTimeString("fr-FR", {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
});
|
||||
}
|
||||
return null;
|
||||
})();
|
||||
@@ -660,7 +678,8 @@ function SuiviLivraison() {
|
||||
<div className="order-header-left">
|
||||
<div className="order-id-row">
|
||||
<span className="order-id">
|
||||
Commande #{order.client_order_number}
|
||||
Commande #
|
||||
{order.client_order_number}
|
||||
</span>
|
||||
<div
|
||||
className="status-badge"
|
||||
@@ -680,15 +699,21 @@ function SuiviLivraison() {
|
||||
order.status,
|
||||
)}
|
||||
</div>
|
||||
{(showEta || (statusLow === "en_route" && computedArrival)) && (
|
||||
{statusLow === "en_route" && (
|
||||
<div className="eta-badge eta-badge--enRoute">
|
||||
<FontAwesomeIcon icon={faClock} />
|
||||
{` Vers ${computedArrival}`}
|
||||
<FontAwesomeIcon
|
||||
icon={faClock}
|
||||
/>
|
||||
{computedArrival
|
||||
? ` Vers ${computedArrival}`
|
||||
: " Aucune heure disponible"}
|
||||
</div>
|
||||
)}
|
||||
{showArrivedEta && (
|
||||
<div className="eta-badge eta-badge--arrived">
|
||||
<FontAwesomeIcon icon={faClock} />
|
||||
<FontAwesomeIcon
|
||||
icon={faClock}
|
||||
/>
|
||||
{" ~5 min"}
|
||||
</div>
|
||||
)}
|
||||
@@ -767,40 +792,80 @@ function SuiviLivraison() {
|
||||
{showArrivedEta && (
|
||||
<div className="eta-card eta-card--arrived">
|
||||
<div className="eta-card-icon">
|
||||
<FontAwesomeIcon icon={faMapMarkerAlt} />
|
||||
<FontAwesomeIcon
|
||||
icon={
|
||||
faMapMarkerAlt
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
<div className="eta-card-body">
|
||||
<p className="eta-card-title">Livreur sur place</p>
|
||||
<p className="eta-card-value">~5 min</p>
|
||||
<p className="eta-card-sub">Préparez-vous à réceptionner votre commande</p>
|
||||
<p className="eta-card-title">
|
||||
Livreur sur place
|
||||
</p>
|
||||
<p className="eta-card-value">
|
||||
~5 min
|
||||
</p>
|
||||
<p className="eta-card-sub">
|
||||
Préparez-vous à
|
||||
réceptionner votre
|
||||
commande
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* ETA card - en_route */}
|
||||
{(showEta || (statusLow === "en_route" && computedArrival)) && (
|
||||
<div
|
||||
className="eta-card eta-card--enRoute"
|
||||
>
|
||||
{(showEta ||
|
||||
(statusLow === "en_route" &&
|
||||
computedArrival)) && (
|
||||
<div className="eta-card eta-card--enRoute">
|
||||
<div className="eta-card-icon">
|
||||
<FontAwesomeIcon icon={faClock} />
|
||||
<FontAwesomeIcon
|
||||
icon={faClock}
|
||||
/>
|
||||
</div>
|
||||
<div className="eta-card-body">
|
||||
<p className="eta-card-title">Heure d'arrivée estimée</p>
|
||||
<p className="eta-card-title">
|
||||
Heure d'arrivée
|
||||
estimée
|
||||
</p>
|
||||
{computedArrival && (
|
||||
<p className="eta-card-value">{computedArrival}</p>
|
||||
)}
|
||||
{order.eta?.eta_minutes && order.eta.eta_minutes > 0 && (
|
||||
<p className="eta-card-sub">
|
||||
~{order.eta.eta_minutes} min restantes
|
||||
<p className="eta-card-value">
|
||||
{
|
||||
computedArrival
|
||||
}
|
||||
</p>
|
||||
)}
|
||||
{order.eta?.livreur_distance != null && (
|
||||
{order.eta
|
||||
?.eta_minutes &&
|
||||
order.eta
|
||||
.eta_minutes >
|
||||
0 && (
|
||||
<p className="eta-card-sub">
|
||||
~
|
||||
{
|
||||
order
|
||||
.eta
|
||||
.eta_minutes
|
||||
}{" "}
|
||||
min
|
||||
restantes
|
||||
</p>
|
||||
)}
|
||||
{order.eta
|
||||
?.livreur_distance !=
|
||||
null && (
|
||||
<p className="eta-card-sub">
|
||||
Distance :{" "}
|
||||
{typeof order.eta.livreur_distance === "number"
|
||||
? order.eta.livreur_distance.toFixed(1)
|
||||
: order.eta.livreur_distance}{" "}
|
||||
{typeof order
|
||||
.eta
|
||||
.livreur_distance ===
|
||||
"number"
|
||||
? order.eta.livreur_distance.toFixed(
|
||||
1,
|
||||
)
|
||||
: order.eta
|
||||
.livreur_distance}{" "}
|
||||
km
|
||||
</p>
|
||||
)}
|
||||
@@ -927,19 +992,53 @@ function SuiviLivraison() {
|
||||
/>{" "}
|
||||
Montant total
|
||||
</h4>
|
||||
{(order.referral_used ?? 0) > 0 && (
|
||||
<p style={{ margin: "0 0 2px", fontSize: "0.85rem", color: "var(--text-muted)" }}>
|
||||
Brut : {(order.total_prix ?? 0).toFixed(2)} €
|
||||
{(order.referral_used ??
|
||||
0) > 0 && (
|
||||
<p
|
||||
style={{
|
||||
margin: "0 0 2px",
|
||||
fontSize:
|
||||
"0.85rem",
|
||||
color: "var(--text-muted)",
|
||||
}}
|
||||
>
|
||||
Brut :{" "}
|
||||
{(
|
||||
order.total_prix ??
|
||||
0
|
||||
).toFixed(2)}{" "}
|
||||
€
|
||||
</p>
|
||||
)}
|
||||
<p className="total-amount">
|
||||
<strong>
|
||||
{Math.max(0, getTotalAmount(order) - (order.referral_used ?? 0)).toFixed(2)} €
|
||||
{Math.max(
|
||||
0,
|
||||
getTotalAmount(
|
||||
order,
|
||||
) -
|
||||
(order.referral_used ??
|
||||
0),
|
||||
).toFixed(2)}{" "}
|
||||
€
|
||||
</strong>
|
||||
</p>
|
||||
{(order.referral_used ?? 0) > 0 && (
|
||||
<p style={{ margin: "4px 0 0", fontSize: "0.82rem", color: "#10b981", fontWeight: 500 }}>
|
||||
— dont {(order.referral_used!).toFixed(2)} € parrainage déduit
|
||||
{(order.referral_used ??
|
||||
0) > 0 && (
|
||||
<p
|
||||
style={{
|
||||
margin: "4px 0 0",
|
||||
fontSize:
|
||||
"0.82rem",
|
||||
color: "#10b981",
|
||||
fontWeight: 500,
|
||||
}}
|
||||
>
|
||||
— dont{" "}
|
||||
{order.referral_used!.toFixed(
|
||||
2,
|
||||
)}{" "}
|
||||
€ parrainage déduit
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user