diff --git a/frontend-prep/src/pages/User/OrderDetails.tsx b/frontend-prep/src/pages/User/OrderDetails.tsx
index 5e881e63..ca780c7f 100644
--- a/frontend-prep/src/pages/User/OrderDetails.tsx
+++ b/frontend-prep/src/pages/User/OrderDetails.tsx
@@ -104,7 +104,7 @@ function OrderDetails() {
if (commandId) {
fetchOrderDetails(commandId);
}
- }, [orderId]);
+ }, [orderId]); // eslint-disable-line react-hooks/exhaustive-deps
// ============================================
// FONCTIONS POUR PHOTOS ET VIDÉOS (COMME PRODUCTCARD)
@@ -299,7 +299,7 @@ function OrderDetails() {
// ✅ Produits depuis items (command_items)
products:
- apiData.items?.map((item: any) => ({
+ apiData.items?.map((item: Record
) => ({
id: item.id,
product_id: item.product_id,
name_product: item.produit,
diff --git a/frontend-prep/src/pages/User/ProductDetail.tsx b/frontend-prep/src/pages/User/ProductDetail.tsx
index a58404a9..328faec7 100644
--- a/frontend-prep/src/pages/User/ProductDetail.tsx
+++ b/frontend-prep/src/pages/User/ProductDetail.tsx
@@ -63,7 +63,7 @@ function ProductDetail() {
useEffect(() => {
if (id) loadProduct(Number(id));
- }, [id]);
+ }, [id]); // eslint-disable-line react-hooks/exhaustive-deps
const loadProduct = async (productId: number) => {
// ✅ Vérifier l'auth avant de charger le produit
@@ -110,8 +110,8 @@ function ProductDetail() {
} else {
setError(response.message || "Produit non trouvé");
}
- } catch (err: any) {
- setError(err.message || "Erreur lors du chargement du produit");
+ } catch (err: unknown) {
+ setError(err instanceof Error ? err.message : "Erreur lors du chargement du produit");
} finally {
setLoading(false);
}
diff --git a/frontend-prep/src/pages/User/ProfilePage.tsx b/frontend-prep/src/pages/User/ProfilePage.tsx
index 6df65bbd..e3728785 100644
--- a/frontend-prep/src/pages/User/ProfilePage.tsx
+++ b/frontend-prep/src/pages/User/ProfilePage.tsx
@@ -23,9 +23,9 @@ export default function ProfilePage() {
const [loadingProfile, setLoadingProfile] = useState(true);
// Données locales (localStorage)
- const [defaultAddress, setDefaultAddress] = useState('');
- const [defaultPhone, setDefaultPhone] = useState('');
- const [signalPseudo, setSignalPseudo] = useState('');
+ const [defaultAddress, setDefaultAddress] = useState(() => localStorage.getItem(STORAGE_ADDRESS) ?? '');
+ const [defaultPhone, setDefaultPhone] = useState(() => localStorage.getItem(STORAGE_PHONE) ?? '');
+ const [signalPseudo, setSignalPseudo] = useState(() => localStorage.getItem(STORAGE_SIGNAL) ?? '');
// Feedback
const [savingContact, setSavingContact] = useState(false);
@@ -47,11 +47,6 @@ export default function ProfilePage() {
navigate('/login/client', { replace: true });
return;
}
- // Charger depuis localStorage
- setDefaultAddress(localStorage.getItem(STORAGE_ADDRESS) ?? '');
- setDefaultPhone(localStorage.getItem(STORAGE_PHONE) ?? '');
- setSignalPseudo(localStorage.getItem(STORAGE_SIGNAL) || username);
-
// Statut Telegram
getTelegramStatus().then((s) => { setTgLinked(s.linked); setTgEnabled(s.enabled); });
@@ -68,7 +63,7 @@ export default function ProfilePage() {
}
setLoadingProfile(false);
});
- }, [navigate]);
+ }, [navigate]); // eslint-disable-line react-hooks/exhaustive-deps
const showSuccess = (msg: string) => {
setSuccessMsg(msg);
diff --git a/frontend-prep/src/pages/User/SuiviLivraison.tsx b/frontend-prep/src/pages/User/SuiviLivraison.tsx
index c74e0a29..bb2ce401 100644
--- a/frontend-prep/src/pages/User/SuiviLivraison.tsx
+++ b/frontend-prep/src/pages/User/SuiviLivraison.tsx
@@ -27,6 +27,7 @@ import Navbar from "../../components/Navbar";
import Toast from "../../components/Toast";
import "./SuiviLivraison.css";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import type { IconDefinition } from "@fortawesome/fontawesome-svg-core";
import {
faHourglassHalf,
faTruck,
@@ -109,7 +110,7 @@ const getDeliveryAddress = (order: OrderWithTracking): string => {
return order.delivery_address || order.adresse || "Non disponible";
};
-const formatOrderItem = (item: any) => {
+const formatOrderItem = (item: Record) => {
return {
name:
item.produit || item.product_name || item.name_product || "Produit",
@@ -153,8 +154,8 @@ const getStatusLabel = (status: string): string => {
return statusMap[status?.toLowerCase()] || "Statut inconnu";
};
-const getStatusIcon = (status: string): any => {
- const iconMap: Record = {
+const getStatusIcon = (status: string): IconDefinition => {
+ const iconMap: Record = {
pending: faHourglassHalf,
assigned: faBiking,
en_route: faTruck,
@@ -178,7 +179,7 @@ const calculateOrderPoints = (
points: number;
category: string;
categoryDisplay: string;
- categoryIcon: any;
+ categoryIcon: IconDefinition;
categoryColor: string;
} => {
// Totaux indexés par pool (+ index spécial pour "gros&semi" exclu des points)
@@ -186,7 +187,7 @@ const calculateOrderPoints = (
let excludedTotal = 0;
if (order.items && order.items.length > 0) {
- order.items.forEach((item: any) => {
+ order.items.forEach((item: Record) => {
const cat = (item.category || "").toLowerCase();
const itemPrice = item.prix || item.price || 0;
@@ -332,7 +333,7 @@ function SuiviLivraison() {
loadOrders();
const interval = setInterval(loadOrders, 10000);
return () => clearInterval(interval);
- }, []);
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
const loadOrders = async () => {
// ✅ Vérifier l'auth avant de charger les commandes
@@ -359,7 +360,7 @@ function SuiviLivraison() {
try {
tracking = await getOrderTracking(order.id);
- } catch (err) {
+ } catch {
console.warn(
`Tracking non disponible pour commande ${order.id}`,
);
@@ -368,7 +369,7 @@ function SuiviLivraison() {
try {
eta = await getOrderETA(order.id);
- } catch (err) {
+ } catch {
console.warn(
`ETA non disponible pour commande ${order.id}`,
);
@@ -389,10 +390,11 @@ function SuiviLivraison() {
setError("Impossible de charger les commandes");
showToast("Impossible de charger les commandes", "error");
}
- } catch (err: any) {
+ } catch (err: unknown) {
console.error("Erreur loadOrders:", err);
- setError(err.message || "Erreur lors du chargement");
- showToast(err.message || "Erreur lors du chargement", "error");
+ const msg = err instanceof Error ? err.message : "Erreur lors du chargement";
+ setError(msg);
+ showToast(msg, "error");
} finally {
setLoading(false);
}
@@ -462,7 +464,7 @@ function SuiviLivraison() {
const pointsEarned =
response.points_earned || selectedOrderPoints;
const apiCategory =
- response.category || (response as any).data?.category || "";
+ response.category || (response as Record & { data?: { category?: string } }).data?.category || "";
const displayCategory =
apiCategory && apiCategory !== "total"
@@ -483,9 +485,10 @@ function SuiviLivraison() {
);
setConfirming(null);
}
- } catch (err: any) {
- setError(err.message || "Erreur serveur");
- showToast(err.message || "Erreur serveur", "error");
+ } catch (err: unknown) {
+ const msg = err instanceof Error ? err.message : "Erreur serveur";
+ setError(msg);
+ showToast(msg, "error");
setConfirming(null);
}
};
@@ -567,9 +570,9 @@ function SuiviLivraison() {
"error",
);
}
- } catch (error: any) {
+ } catch (error: unknown) {
console.error("❌ [CANCEL] Erreur:", error);
- showToast(error.message || "Erreur lors de l'annulation", "error");
+ showToast(error instanceof Error ? error.message : "Erreur lors de l'annulation", "error");
} finally {
setCancellingOrder(null);
}
@@ -895,7 +898,7 @@ function SuiviLivraison() {
{order.items.map(
(
- item: any,
+ item: Record,
idx: number,
) => {
const formatted =