chore: update

This commit is contained in:
2026-03-19 19:56:51 +01:00
parent 3384ebded0
commit 7173266bb9
31 changed files with 3645 additions and 1942 deletions
+178 -51
View File
@@ -4,15 +4,21 @@
// ✅ AuthResponse inclut access_token
// ✅ loginUser et registerUser retournent AuthResponse
// ✅ sessionStorage (pas localStorage)
const API_URL = "http://5.181.0.112/api/v1";
const BACKEND_URL = "http://5.181.0.112";
const API_URL = "/api/v1";
const BACKEND_URL = "";
export function getMediaUrl(url: string): string {
if (!url) return "";
if (url.startsWith("http")) return url;
return `${BACKEND_URL}${url}`;
}
async function safeJson(response: Response) {
const ct = response.headers.get("content-type") || "";
if (!response.ok && !ct.includes("application/json")) {
throw new Error(`HTTP ${response.status}`);
}
return response.json();
}
import type {
ConfirmReceptionResponse,
CheckoutCartResponse,
@@ -184,7 +190,7 @@ export const loginUser = async (
if (!response.ok) {
let errorMessage = "Erreur de connexion";
try {
const errorData = await response.json();
const errorData = await safeJson(response);
errorMessage =
errorData.error || errorData.message || errorMessage;
} catch {
@@ -201,7 +207,7 @@ export const loginUser = async (
};
}
const data = await response.json();
const data = await safeJson(response);
console.log("📋 [LOGIN] Réponse:", data);
// ✅ Vérifier access_token
@@ -294,7 +300,7 @@ export const changePassword = async (
new_password: newPassword,
}),
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
return {
success: false,
@@ -375,16 +381,15 @@ export const getCart = async (username: string): Promise<BasketResponse> => {
},
});
const responseData = await response.json();
if (!response.ok) {
return {
success: false,
message: responseData.error || "Erreur récupération",
message: "Erreur récupération",
panier: [],
};
}
const responseData = await safeJson(response);
return {
success: true,
panier: responseData.panier || [],
@@ -445,7 +450,7 @@ export const addToCart = async (cartItem: {
body: JSON.stringify(cartItem),
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
return {
@@ -502,7 +507,7 @@ export const removeFromCart = async (id: number, username: string) => {
}),
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
return {
@@ -558,7 +563,7 @@ export const clearCart = async (username: string) => {
// ✅ Gérer les erreurs HTTP avant de parser JSON
if (!response.ok) {
try {
const errorData = await response.json();
const errorData = await safeJson(response);
console.error("❌ [CLEAR] Erreur API:", errorData);
return {
success: false,
@@ -575,7 +580,7 @@ export const clearCart = async (username: string) => {
}
// ✅ Parser JSON seulement si response.ok
const data = await response.json();
const data = await safeJson(response);
console.log("✅ [CLEAR] Panier vidé:", {
stock_released: data.stock_released,
@@ -620,7 +625,7 @@ export const getMyOrders = async () => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
return {
@@ -651,6 +656,8 @@ export interface CheckoutData {
last_name?: string;
phone?: string;
payment_method?: string;
pay_currency?: string;
use_referral_balance?: boolean;
}
export const createCheckout = async (checkoutData: CheckoutData) => {
@@ -685,16 +692,24 @@ export const createCheckout = async (checkoutData: CheckoutData) => {
},
body: JSON.stringify({
...checkoutData,
use_referral_balance: checkoutData.use_referral_balance ?? false,
use_referral_balance:
checkoutData.use_referral_balance ?? false,
}),
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
const isZoneError =
!!data.postal_code ||
(typeof data.error === "string" &&
(data.error.includes("code postal") ||
data.error.includes("hors zone")));
return {
success: false,
message: data.error || "Erreur création",
postal_code: data.postal_code as string | undefined,
zone_error: isZoneError as boolean,
};
}
@@ -706,6 +721,13 @@ export const createCheckout = async (checkoutData: CheckoutData) => {
delivery_address: data.delivery_address,
assigned_to: data.assigned_to,
queue_info: data.queue_info,
payment_method: data.payment_method as string | undefined,
payment_status: data.payment_status as string | undefined,
pay_address: data.pay_address as string | undefined,
pay_amount: data.pay_amount as number | undefined,
pay_currency: data.pay_currency as string | undefined,
price_amount: data.price_amount as number | undefined,
price_currency: data.price_currency as string | undefined,
};
} catch (error) {
console.error("❌ [CHECKOUT] Erreur:", error);
@@ -743,7 +765,7 @@ export const approveDelivery = async (
},
);
const responseData = await response.json();
const responseData = await safeJson(response);
if (!response.ok) {
return {
@@ -797,7 +819,7 @@ export interface Category {
export const getCategories = async (): Promise<Category[]> => {
try {
const response = await fetch(`${API_URL}/categories`);
const data = await response.json();
const data = await safeJson(response);
return data.categories || [];
} catch {
return [];
@@ -807,7 +829,7 @@ export const getCategories = async (): Promise<Category[]> => {
export const getAllProducts = async () => {
try {
const response = await fetch(`${API_URL}/products`);
return await response.json();
return await safeJson(response);
} catch (error) {
console.error("❌ [PRODUCTS] Erreur:", error);
return { success: false, data: [] };
@@ -820,11 +842,10 @@ export const getAllProducts = async () => {
*/
export const getProductsByCategory = async (category: string) => {
try {
// ✅ CHANGÉ: De /products?category=X à /products/category/X
const response = await fetch(
`${API_URL}/products/category/${category}`,
);
return await response.json();
return await safeJson(response);
} catch (error) {
console.error("❌ [PRODUCTS] Erreur:", error);
return { success: false, data: [] };
@@ -837,7 +858,7 @@ export const getProductsByCategory = async (category: string) => {
export const getProductById = async (id: number) => {
try {
const response = await fetch(`${API_URL}/products/${id}`);
return await response.json();
return await safeJson(response);
} catch (error) {
console.error("❌ [PRODUCT] Erreur:", error);
return { success: false, data: null };
@@ -874,15 +895,18 @@ export const getOrderTracking = async (
commandId,
);
const response = await fetch(`${API_URL}/commands/${commandId}/track`, {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
const response = await fetch(
`${API_URL}/commands/${commandId}/tracking`,
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
},
});
);
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [TRACKING] Erreur API:", data);
@@ -965,7 +989,7 @@ export const getOrderETA = async (commandId: number): Promise<ETAResponse> => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [ETA] Erreur API:", data);
@@ -1040,7 +1064,7 @@ export const getOrdersWithTracking = async () => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [ORDERS_TRACKING] Erreur API:", data);
@@ -1112,7 +1136,7 @@ export const confirmReception = async (
},
);
const responseData = await response.json();
const responseData = await safeJson(response);
if (!response.ok) {
console.error("❌ [CONFIRM] Erreur API:", responseData);
@@ -1165,7 +1189,7 @@ export const getOrderTotal = async (commandId: number): Promise<number> => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [TOTAL] Erreur API:", data);
@@ -1237,7 +1261,7 @@ export const getMyCompletedOrders = async (): Promise<HistoryResponse> => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [HISTORY] Erreur API:", data);
@@ -1366,7 +1390,7 @@ export const cancelCommand = async (
},
);
const data = await response.json();
const data = await safeJson(response);
// ⚠️ AVERTISSEMENT (409 Conflict) - Livreur assigné
if (response.status === 409 && data.warning) {
@@ -1468,7 +1492,7 @@ export const getMyCancellationHistory =
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [CANCEL_HISTORY] Erreur API:", data);
@@ -1522,7 +1546,7 @@ export const getOrderDetails = async (commandId: number) => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [ORDER DETAILS] Erreur API:", data);
@@ -1587,7 +1611,7 @@ export const getCommandItemsWithDetails = async (commandId: number) => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [COMMAND ITEMS] Erreur API:", data);
@@ -1638,7 +1662,7 @@ export const getMyPenalties = async (): Promise<PenaltiesResponse> => {
},
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [PENALTIES] Erreur API:", data);
@@ -1718,7 +1742,7 @@ export const checkoutCart = async (
}),
});
const data = await response.json();
const data = await safeJson(response);
if (!response.ok) {
console.error("❌ [CHECKOUT] Erreur API:", data);
@@ -1795,7 +1819,7 @@ export const getClientNotifications =
unread_count: 0,
total: 0,
};
const data = await response.json();
const data = await safeJson(response);
return {
success: true,
notifications: data.notifications || [],
@@ -1834,43 +1858,146 @@ export interface PublicSettings {
points_enabled: boolean;
points_separated: boolean;
referral_enabled: boolean;
pool_names: string[];
crypto_payment_enabled: boolean;
crypto_only: boolean;
nowpayments_currencies: string[];
}
export const getPublicSettings = async (): Promise<PublicSettings> => {
const defaults: PublicSettings = { penalties_enabled: true, show_amende_score: true, points_enabled: true, points_separated: true, referral_enabled: true };
const defaults: PublicSettings = {
penalties_enabled: true,
show_amende_score: true,
points_enabled: true,
points_separated: true,
referral_enabled: true,
pool_names: ["Pool 1", "Pool 2"],
crypto_payment_enabled: false,
crypto_only: false,
nowpayments_currencies: [],
};
try {
const response = await fetch(`${API_URL}/app-settings`);
if (!response.ok) return defaults;
const data = await response.json();
const data = await safeJson(response);
return {
penalties_enabled: data.penalties_enabled ?? true,
show_amende_score: data.show_amende_score ?? true,
points_enabled: data.points_enabled ?? true,
points_separated: data.points_separated ?? true,
referral_enabled: data.referral_enabled ?? true,
pool_names:
Array.isArray(data.pool_names) && data.pool_names.length > 0
? data.pool_names
: defaults.pool_names,
crypto_payment_enabled: data.crypto_payment_enabled ?? false,
crypto_only: data.crypto_only ?? false,
nowpayments_currencies: Array.isArray(data.nowpayments_currencies)
? data.nowpayments_currencies
: [],
};
} catch {
return defaults;
}
};
export interface CryptoPaymentStatus {
command_id: number;
payment_status: string;
pay_address: string;
pay_amount: number;
pay_currency: string;
price_amount: number;
price_currency: string;
}
export const getCryptoPaymentStatus = async (
commandId: number,
): Promise<CryptoPaymentStatus | null> => {
const token = getAuthToken();
if (!token) return null;
try {
const response = await fetch(
`${API_URL}/commands/${commandId}/payment-status`,
{
headers: { Authorization: `Bearer ${token}` },
},
);
if (!response.ok) return null;
return await safeJson(response);
} catch {
return null;
}
};
export interface ReferralBalanceResponse {
success: boolean;
balance: number;
referral_enabled?: boolean;
}
export const getReferralBalance = async (): Promise<ReferralBalanceResponse> => {
export const getReferralBalance =
async (): Promise<ReferralBalanceResponse> => {
const token = getAuthToken();
if (!token) return { success: false, balance: 0 };
try {
const response = await fetch(`${API_URL}/referral/balance`, {
headers: { Authorization: `Bearer ${token}` },
});
if (!response.ok) return { success: false, balance: 0 };
const data = await safeJson(response);
return {
success: true,
balance: data.balance ?? 0,
referral_enabled: data.referral_enabled,
};
} catch {
return { success: false, balance: 0 };
}
};
export const getMyProfile = async (): Promise<{
success: boolean;
client?: {
nom: string;
prenom: string;
telephone: string;
username: string;
};
message?: string;
}> => {
const token = getAuthToken();
if (!token) return { success: false, balance: 0 };
if (!token) return { success: false, message: "Non authentifié" };
try {
const response = await fetch(`${API_URL}/referral/balance`, {
const response = await fetch(`${API_URL}/profile`, {
headers: { Authorization: `Bearer ${token}` },
});
if (!response.ok) return { success: false, balance: 0 };
const data = await response.json();
return { success: true, balance: data.balance ?? 0, referral_enabled: data.referral_enabled };
const data = await safeJson(response);
return data;
} catch {
return { success: false, balance: 0 };
return { success: false, message: "Erreur de connexion" };
}
};
export const updateMyProfile = async (fields: {
nom?: string;
prenom?: string;
telephone?: string;
}): Promise<{ success: boolean; message?: string }> => {
const token = getAuthToken();
if (!token) return { success: false, message: "Non authentifié" };
try {
const response = await fetch(`${API_URL}/profile/update`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(fields),
});
const data = await safeJson(response);
return data;
} catch {
return { success: false, message: "Erreur de connexion" };
}
};