chore: build
Backend - Build & Lint / build (push) Has been cancelled
Frontend Client - EAS Build / build (push) Has been cancelled
Frontend Web - Build & Lint / build (push) Has been cancelled

This commit is contained in:
2026-06-30 19:24:36 +02:00
parent 781212f706
commit 8d131a1ade
6 changed files with 420 additions and 139 deletions
+167 -68
View File
@@ -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>