diff --git a/frontend-admin/src/api/api_admin.ts b/frontend-admin/src/api/api_admin.ts
index e28093f4..1bf09c94 100644
--- a/frontend-admin/src/api/api_admin.ts
+++ b/frontend-admin/src/api/api_admin.ts
@@ -446,11 +446,10 @@ export const createProductAdmin = async (formData: FormData) => {
`${V2}/admin/protected/products`,
formData,
{
- headers: { "Content-Type": "multipart/form-data" },
timeout: 120000,
},
);
- return { success: true, data: data.data, message: data.message };
+ return { success: true, data: data.product, message: data.message };
};
export const updateProductAdmin = async (
@@ -749,7 +748,7 @@ export const uploadProductMediaAdmin = async (
const { data } = await apiClient.post(
`${V2}/admin/protected/products/${productId}/media`,
fd,
- { headers: { "Content-Type": "multipart/form-data" }, timeout: 120000 },
+ { timeout: 120000 },
);
return { success: true, media: data.media, message: data.message };
};
diff --git a/frontend-admin/src/screens/admin/ProductsScreen.tsx b/frontend-admin/src/screens/admin/ProductsScreen.tsx
index 5104cfdd..4b8c8deb 100644
--- a/frontend-admin/src/screens/admin/ProductsScreen.tsx
+++ b/frontend-admin/src/screens/admin/ProductsScreen.tsx
@@ -62,12 +62,12 @@ interface PendingMedia {
// Les catégories sont chargées dynamiquement depuis l'API
const UNITS = [
- { value: "u", label: "u" },
- { value: "kg", label: "kg" },
- { value: "g", label: "g" },
+ { value: "u", label: "u" },
+ { value: "kg", label: "kg" },
+ { value: "g", label: "g" },
{ value: "bag", label: "bag" },
- { value: "l", label: "l" },
- { value: "cl", label: "cl" },
+ { value: "l", label: "l" },
+ { value: "cl", label: "cl" },
{ value: "pcs", label: "pcs" },
];
@@ -247,11 +247,7 @@ export default function ProductsScreen() {
}
const result = await ImagePicker.launchImageLibraryAsync({
- mediaTypes:
- type === "image"
- ? ImagePicker.MediaTypeOptions.Images
- : ImagePicker.MediaTypeOptions.Videos,
- quality: 0.8,
+ mediaTypes: type === "image" ? ["images"] : ["videos"],
allowsMultipleSelection: true,
});
@@ -358,7 +354,10 @@ export default function ProductsScreen() {
prices.forEach((p, i) => {
fd.append(`prices[${i}][quantity]`, String(p.quantity));
fd.append(`prices[${i}][price]`, String(p.price));
- fd.append(`prices[${i}][active_price]`, p.active_price ? "true" : "false");
+ fd.append(
+ `prices[${i}][active_price]`,
+ p.active_price ? "true" : "false",
+ );
});
// Attacher les médias en attente
@@ -388,13 +387,18 @@ export default function ProductsScreen() {
m.mediaType,
);
} catch (uploadErr: any) {
- const msg = uploadErr?.response?.data?.error || uploadErr?.message || `Erreur upload ${m.mediaType}`;
+ const msg =
+ uploadErr?.response?.data?.error ||
+ uploadErr?.message ||
+ `Erreur upload ${m.mediaType}`;
uploadErrors.push(msg);
}
}
setUploadingMedia(false);
if (uploadErrors.length > 0) {
- setFormError(`Erreur upload média: ${uploadErrors.join(", ")}`);
+ setFormError(
+ `Erreur upload média: ${uploadErrors.join(", ")}`,
+ );
await loadData();
return;
}
@@ -645,8 +649,14 @@ export default function ProductsScreen() {
borderColor: "#22c55e",
backgroundColor: "#22c55e20",
},
- comingSoonBtnText: { color: colors.textMuted, fontSize: fontSize.sm },
- comingSoonBtnTextActive: { color: "#22c55e", fontWeight: "700" },
+ comingSoonBtnText: {
+ color: colors.textMuted,
+ fontSize: fontSize.sm,
+ },
+ comingSoonBtnTextActive: {
+ color: "#22c55e",
+ fontWeight: "700",
+ },
// Prices
sectionHeader: {
@@ -808,7 +818,10 @@ export default function ProductsScreen() {
{item.name}
c.name === item.category)?.color || colors.accent}
+ color={
+ categories.find((c) => c.name === item.category)
+ ?.color || colors.accent
+ }
/>
@@ -843,9 +856,18 @@ export default function ProductsScreen() {
)}
)}
- Stock: {item.stock} {item.unit || "u"}
+
+ Stock: {item.stock} {item.unit || "u"}
+
{item.prices && item.prices.length > 0 && (
-
+
{item.prices.map((p, i) => (
- {p.quantity}{item.unit || "u"} = {p.price}€
+ {p.quantity}
+ {item.unit || "u"} = {p.price}€
{i < item.prices!.length - 1 ? " |" : ""}
))}
@@ -1024,7 +1047,8 @@ export default function ProductsScreen() {
setForm((f) => {
@@ -1032,16 +1056,24 @@ export default function ProductsScreen() {
return {
...f,
comingSoon: next,
- prices: f.prices.map((p) => ({ ...p, active: !next })),
+ prices: f.prices.map((p) => ({
+ ...p,
+ active: !next,
+ })),
};
})
}
>
-
- {form.comingSoon ? "À venir (activé)" : "Marquer comme «À venir»"}
+
+ {form.comingSoon
+ ? "À venir (activé)"
+ : "Marquer comme «À venir»"}
@@ -1140,9 +1172,18 @@ export default function ProductsScreen() {
onPress={() => togglePriceActive(idx)}
>
{form.prices.length > 1 && (