chore: update
This commit is contained in:
+178
-51
@@ -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" };
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user