-
+

m.type === "image")?.url || ""}
+ src={
+ product.media?.find((m) => m.type === "image")
+ ?.url || ""
+ }
alt={product.name}
className="product-detail-image"
/>
- {isOutOfStock &&
SOLD OUT
}
- {isComingSoon &&
À VENIR
}
+ {isOutOfStock && (
+
SOLD OUT
+ )}
+ {isComingSoon && (
+
+ COMMING SOON
+
+ )}
@@ -258,7 +296,8 @@ function ProductDetail() {
{selectedPrice > 0 && (
{selectedPrice.toFixed(2)} €{" "}
- {selectedGrams && `pour ${selectedGrams}${product.unit || "g"}`}
+ {selectedGrams &&
+ `pour ${selectedGrams}${product.unit || "g"}`}
)}
@@ -296,7 +335,8 @@ function ProductDetail() {
key={p.quantity}
value={p.quantity}
>
- {p.quantity}{product.unit || "g"} -{" "}
+ {p.quantity}
+ {product.unit || "g"} -{" "}
{p.price.toFixed(2)} €
))}
@@ -308,13 +348,17 @@ function ProductDetail() {
diff --git a/mobile/src/components/ProductCard.tsx b/mobile/src/components/ProductCard.tsx
index 01a0b06c..61fb9d00 100644
--- a/mobile/src/components/ProductCard.tsx
+++ b/mobile/src/components/ProductCard.tsx
@@ -13,7 +13,13 @@ import {
function getTextColor(hex: string): string {
const h = hex.replace("#", "");
- const full = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
+ const full =
+ h.length === 3
+ ? h
+ .split("")
+ .map((c) => c + c)
+ .join("")
+ : h;
const r = parseInt(full.slice(0, 2), 16);
const g = parseInt(full.slice(2, 4), 16);
const b = parseInt(full.slice(4, 6), 16);
@@ -37,20 +43,29 @@ interface ProductCardProps {
stock: number;
unit?: string;
coming_soon?: boolean;
- prices?: Array<{ quantity: number; price: number; active_price?: boolean }>;
+ prices?: Array<{
+ quantity: number;
+ price: number;
+ active_price?: boolean;
+ }>;
media?: Array<{ url: string; type: string }>;
};
onPress: () => void;
categoryColor?: string;
}
-export default function ProductCard({ product, onPress, categoryColor }: ProductCardProps) {
+export default function ProductCard({
+ product,
+ onPress,
+ categoryColor,
+}: ProductCardProps) {
const { colors } = useTheme();
const { addToCart } = useCart();
const catColor = categoryColor ?? colors.accent;
const isSoldOut = product.stock <= 0;
const isComingSoon = product.coming_soon === true;
- const activePrices = product.prices?.filter((p) => p.active_price !== false) ?? [];
+ const activePrices =
+ product.prices?.filter((p) => p.active_price !== false) ?? [];
const firstPrice = activePrices[0]?.price ?? null;
const imageMedia = product.media?.find((m) => m.type === "image");
@@ -161,7 +176,7 @@ export default function ProductCard({ product, onPress, categoryColor }: Product
)}
{isComingSoon && (
- À VENIR
+ COMMING SOON
)}
@@ -236,8 +251,8 @@ export default function ProductCard({ product, onPress, categoryColor }: Product
{isSoldOut
? "Rupture de stock"
: isComingSoon
- ? "Bientôt disponible"
- : "Ajouter rapidement"}
+ ? "Bientôt disponible"
+ : "Ajouter rapidement"}
)}
@@ -297,7 +312,8 @@ export default function ProductCard({ product, onPress, categoryColor }: Product
{ color: colors.textWhite },
]}
>
- {p.quantity}{product.unit || "g"}
+ {p.quantity}
+ {product.unit || "g"}
c.name.toLowerCase() === (p.category || "").toLowerCase(),
+ (c) =>
+ c.name.toLowerCase() ===
+ (p.category || "").toLowerCase(),
);
if (matched?.color) setCatColor(matched.color);
} else {
@@ -111,11 +113,19 @@ export default function ProductDetailScreen() {
const catTextColor = (() => {
const h = catColor.replace("#", "");
- const full = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
+ const full =
+ h.length === 3
+ ? h
+ .split("")
+ .map((c) => c + c)
+ .join("")
+ : h;
const r = parseInt(full.slice(0, 2), 16);
const g = parseInt(full.slice(2, 4), 16);
const b = parseInt(full.slice(4, 6), 16);
- return (r * 299 + g * 587 + b * 114) / 1000 > 128 ? "#000000" : "#ffffff";
+ return (r * 299 + g * 587 + b * 114) / 1000 > 128
+ ? "#000000"
+ : "#ffffff";
})();
const overlayBg = isDark ? "rgba(255,255,255,0.02)" : "rgba(0,0,0,0.02)";
@@ -546,7 +556,9 @@ export default function ProductDetailScreen() {
)}
{isComingSoon && (
- À VENIR
+
+ COMMING SOON
+
)}
{videoUri && !isOutOfStock && (
@@ -573,7 +585,8 @@ export default function ProductDetailScreen() {
{selectedPrice.toFixed(2)} €{" "}
- {selectedGrams && `pour ${selectedGrams}${product.unit || "g"}`}
+ {selectedGrams &&
+ `pour ${selectedGrams}${product.unit || "g"}`}
)}
@@ -615,27 +628,34 @@ export default function ProductDetailScreen() {
{isOutOfStock
? "Rupture de stock"
: isComingSoon
- ? "Bientôt disponible"
- : "Ajouter au panier"}
+ ? "Bientôt disponible"
+ : "Ajouter au panier"}
@@ -691,7 +711,8 @@ export default function ProductDetailScreen() {
},
]}
>
- {p.quantity}{product.unit || "g"}
+ {p.quantity}
+ {product.unit || "g"}