You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

787 lines
24 KiB

import React, { useEffect } from "react";
import {
View,
Text,
Image,
StyleSheet,
TouchableOpacity,
ScrollView,
} from "react-native";
import widthUtils from "../utils/widthUtils";
import fontSize from "../utils/fontsizeUtils";
import CloseIcon from "../components/CloseIcon";
import {
ProductDetailParams,
ProductGroupList,
SkuAttribute,
} from "../services/api/productApi";
import { useState } from "react";
interface ProductCardProps {
onClose: () => void;
product: ProductDetailParams;
groupList: ProductGroupList[];
}
const ProductCard: React.FC<ProductCardProps> = ({
onClose,
product: localProduct,
groupList: localGroupList,
}: {
onClose: () => void;
product: ProductDetailParams;
groupList: ProductGroupList[];
}) => {
const [groupList, setGroupList] =
useState<ProductGroupList[]>(localGroupList);
const [product, setProduct] = useState<ProductDetailParams>(localProduct);
const [imgTitle, setImgTitle] = useState<string>("");
useEffect(() => {
const item = groupList.filter((item) => item.has_image);
item.forEach((item) => {
const colorItem = item.attributes.filter(
(attribute) => attribute.has_color
);
if (colorItem.length > 0) {
setImgTitle(colorItem[0].sku_image_url);
}
});
if (item.length === 0) {
setImgTitle(product.product_image_urls[0]);
}
if(item.length === 1){
console.log(item);
}
});
const handleColorSelect = (colorId: string, index: number) => {
const newGroupList = [...groupList];
const attributeIndex = newGroupList[index]?.attributes.findIndex(
(item) => item.value === colorId
);
if (attributeIndex !== -1) {
newGroupList[index].attributes = newGroupList[index].attributes.map(
(item, i) => {
if (i === attributeIndex) {
return { ...item, has_color: true };
}
return { ...item, has_color: false };
}
);
setGroupList(newGroupList);
}
const selectedSku: SkuAttribute[] = [];
groupList.forEach((item) => {
item.attributes.forEach((attribute) => {
if (attribute.has_color) {
selectedSku.push(attribute);
}
});
});
let price = 0;
product?.skus.forEach((item) => {
const values1 = item.attributes.map((item) => item.value).sort();
const values2 = selectedSku.map((item) => item.value).sort();
if (values1.every((val, index) => val === values2[index])) {
if (item.offer_price) {
price = item.offer_price;
} else {
price =
product.sale_info.price_range_list[
product.sale_info.price_range_list.length - 1
].price;
}
}
});
if (product) {
setProduct({
...product,
price: price === 0 ? "无货" : price,
});
}
};
return (
<View style={styles.container}>
<View style={styles.productCardContainer3}>
<View style={styles.pricingCard}>
<View style={styles.flexRowAlignedEndFullWidth}>
<View style={styles.productCardContainer}>
<View style={styles.cardContainer}>
<View style={styles.flexColumnEndAlign2}>
<Image
source={{ uri: imgTitle }}
style={styles.flexColumnImg}
/>
{/* SVG commented out as requested */}
{/* <View style={styles.svgContainer}>
<svg viewBox="0 0 24 24" x="0" y="0" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="look" xmlns="http://www.w3.org/2000/svg">
<path id="Rectangle 653" d="M1,1h17c2.7614,0 5,2.239 5,5v17h-17c-2.7614,0 -5,-2.239 -5,-5z" fill="#5B5B5B" fill-opacity="0.7" />
<path id="Vector 12" d="M12,6h6v6" stroke="white" stroke-linecap="round" stroke-linejoin="round" />
<path id="Vector 13" d="M12,18h-6v-6" stroke="white" stroke-linecap="round" stroke-linejoin="round" />
</g>
</svg>
</View> */}
</View>
</View>
</View>
<View style={styles.productCardContainer2}>
<View style={styles.productCardContainer1}>
<View style={styles.priceInfoContainer1}>
<Text style={styles.highlightedText}>{product.price}</Text>
<View style={styles.priceInfoContainer2}>
<Text style={styles.orangeHeading}>FCFA</Text>
<View style={styles.percentageChangeContainer}>
<Text style={styles.discountPercentageTextStyle}>
-5%
</Text>
{/* SVG commented out as requested */}
{/* <View style={styles.svgContainer1}>
<svg viewBox="0 0 32 32" x="0" y="0" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="paint5_linear_128_1116" x1="7.443999999999988" y1="7.443999999999988" x2="12.580000000000013" y2="29.312000000000012" gradientUnits="userSpaceOnUse" xmlns="http://www.w3.org/2000/svg">
<stop stop-color="#FFE5AD" />
<stop offset="1" stop-color="#F9AE46" />
</linearGradient>
<linearGradient id="paint6_linear_128_1116" x1="16" y1="2" x2="16" y2="30" gradientUnits="userSpaceOnUse" xmlns="http://www.w3.org/2000/svg">
<stop stop-color="white" />
<stop offset="1" stop-color="#FFD180" />
</linearGradient>
</defs>
<path id="Star 1_2" d="M14.621,3.313c0.772,-0.735 1.986,-0.735 2.758,0l1.401,1.334c0.439,0.418 1.043,0.615 1.644,0.534l1.917,-0.255c1.057,-0.141 2.039,0.572 2.232,1.621l0.349,1.903c0.109,0.596 0.483,1.11 1.016,1.398l1.701,0.92c0.939,0.507 1.314,1.661 0.853,2.623l-0.836,1.745c-0.262,0.546 -0.262,1.182 0,1.728l0.836,1.745c0.461,0.962 0.086,2.116 -0.853,2.623l-1.701,0.92c-0.533,0.288 -0.907,0.802 -1.016,1.398l-0.349,1.903c-0.193,1.049 -1.175,1.762 -2.232,1.621l-1.917,-0.255c-0.601,-0.081 -1.205,0.116 -1.644,0.534l-1.401,1.334c-0.772,0.735 -1.986,0.735 -2.758,0l-1.401,-1.334c-0.439,-0.418 -1.043,-0.615 -1.644,-0.534l-1.917,0.255c-1.057,0.141 -2.039,-0.572 -2.232,-1.621l-0.349,-1.903c-0.109,-0.596 -0.483,-1.11 -1.016,-1.398l-1.701,-0.92c-0.939,-0.507 -1.314,-1.661 -0.853,-2.623l0.836,-1.745c0.262,-0.546 0.262,-1.182 0,-1.728l-0.836,-1.745c-0.461,-0.962 -0.086,-2.116 0.853,-2.623l1.701,-0.92c0.533,-0.288 0.907,-0.802 1.016,-1.398l0.349,-1.903c0.193,-1.049 1.175,-1.762 2.232,-1.621l1.917,0.255c0.601,0.081 1.205,-0.116 1.644,-0.534z" fill="url(#paint5_linear_128_1116)" stroke="url(#paint6_linear_128_1116)" xmlns="http://www.w3.org/2000/svg" />
</svg>
</View> */}
</View>
</View>
</View>
<View style={styles.vipButtonContainer}>
<View style={styles.vipButton}>
<Text style={styles.italicBoldSegoeVip}>VIP</Text>
</View>
</View>
</View>
<View style={styles.pricingCardContainer}>
<View style={styles.pricingCard}>
<View style={styles.priceInfoContainer}>
<Text style={styles.priceHighlightedText}>3072</Text>
<Text style={styles.priceTagBold}>FCFA</Text>
</View>
<Text style={styles.productPriceTier}>2 Pièces</Text>
</View>
<View style={styles.pricingCard}>
<View style={styles.priceInfoContainer}>
<Text style={styles.priceHighlightedText}>2500</Text>
<Text style={styles.priceTagBold}>FCFA</Text>
</View>
<Text style={styles.productPriceTier}>50 Pièces</Text>
</View>
<View style={styles.pricingCard}>
<View style={styles.priceInfoContainer}>
<Text style={styles.priceHighlightedText}>2099</Text>
<Text style={styles.priceTagBold}>FCFA</Text>
</View>
<Text style={styles.productPriceTier}>100 Pièces</Text>
</View>
</View>
</View>
</View>
<View style={styles.productDetailsContainer}>
{groupList.map((item, index1) => (
<React.Fragment key={item.attribute_name + index1}>
{item.has_image && groupList.length > 1 && (
<View>
<Text style={styles.primaryTextHeading}>CouleurNoir</Text>
<ScrollView
horizontal
showsHorizontalScrollIndicator={false}
key={item.attribute_name + index1}
>
<View
style={{ flexDirection: "row", gap: 12, width: "100%" }}
>
{item.attributes.map((attribute, index) => (
<TouchableOpacity
key={attribute.value + index}
onPress={() =>
handleColorSelect(attribute.value, index1)
}
>
<View
style={[
styles.colorPaletteContainer1,
attribute.has_color &&
styles.selectedColorImageContainer,
]}
>
<View
key={attribute.value}
style={styles.cardContainerWithTitle}
>
<View style={styles.cardContainerWithImage}>
<Image
source={{ uri: attribute.sku_image_url }}
style={styles.imageContainer}
/>
</View>
<Text style={styles.profileCard}>
{attribute.value}
</Text>
</View>
</View>
</TouchableOpacity>
))}
</View>
</ScrollView>
</View>
)}
{!item.has_image && (
<View style={styles.productStockInfoContainer}>
<Text style={styles.primaryTextHeading}>Taille</Text>
<ScrollView showsVerticalScrollIndicator={false}>
{item.attributes.map((attribute) => (
<View
style={styles.productStockDisplayWidget}
key={attribute.value + index1}
>
<View style={styles.stockAvailabilityDisplayWidget}>
<View
style={[
styles.stockInfoDisplayContainer,
styles.stockAvailabilityDisplay,
]}
>
<View style={styles.pricingCard}>
<Text
style={[
styles.stockAvailabilityInfoStyle,
{ fontWeight: "400" },
]}
>
{attribute.value}
</Text>
<Text style={styles.stockStatusInfoTextStyle}>
En stock 231
</Text>
</View>
<View style={styles.stockInfoContainer}>
<View
style={styles.stockCountDisplayStyleContainer}
></View>
<Text
style={
styles.stockCountDisplayStyleContainer1
}
>
0
</Text>
<Text
style={{ fontSize: 16, fontWeight: "400" }}
>
+
</Text>
</View>
</View>
</View>
</View>
))}
</ScrollView>
</View>
)}
{item.has_image && groupList.length === 1 && (
<View style={{ flex: 1, height: "100%" }}>
<ScrollView style={{ flex: 1 }}>
{item.attributes.map((attribute, index) => (
<View
key={attribute.value + index1}
style={{
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
marginBottom: 10,
}}
>
<View style={{ width: 50, height: 50 }}>
<Image
source={{ uri: attribute.sku_image_url }}
style={{
width: "100%",
height: "100%",
borderRadius: 5,
}}
/>
</View>
<View style={{width:widthUtils(200,200).width}}>
<Text
style={{textAlign:'left',alignSelf:'center',width:'100%'}}
numberOfLines={1}
ellipsizeMode="tail"
>
{attribute.value}
</Text>
</View>
<View style={styles.stockInfoContainer}>
<View
style={styles.stockCountDisplayStyleContainer}
></View>
<Text
style={styles.stockCountDisplayStyleContainer1}
>
0
</Text>
<Text style={{ fontSize: 16, fontWeight: "400" }}>
+
</Text>
</View>
</View>
))}
</ScrollView>
</View>
)}
</React.Fragment>
))}
</View>
</View>
</View>
<View style={styles.closeIconContainer}>
<TouchableOpacity onPress={onClose}>
<CloseIcon size={18} />
</TouchableOpacity>
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
width: "100%",
backgroundColor: "white",
},
productCardContainer3: {
flexDirection: "column",
alignItems: "stretch",
justifyContent: "flex-start",
width: "100%",
paddingTop: 15,
paddingRight: 17,
paddingLeft: 19,
},
pricingCard: {
paddingTop: 5,
paddingBottom: 5,
},
flexRowAlignedEndFullWidth: {
flexDirection: "row",
alignItems: "flex-end",
justifyContent: "flex-start",
width: "100%",
},
productCardContainer: {
flexBasis: widthUtils(80, 80).width,
paddingTop: 5,
},
cardContainer: {
width: "100%",
backgroundColor: "#e0e0e0",
borderRadius: 5,
},
flexColumnEndAlign2: {
flexDirection: "column",
alignItems: "flex-end",
justifyContent: "flex-start",
width: "100%",
height: widthUtils(80, 80).height,
borderRadius: 5,
},
flexColumnImg: {
width: "100%",
height: "100%",
borderRadius: 5,
},
svgContainer: {
width: widthUtils(24, 24).width,
height: widthUtils(24, 24).height,
},
productCardContainer2: {
flexBasis: widthUtils(295, 295).width,
marginLeft: 15,
},
productCardContainer1: {
flexDirection: "row",
alignItems: "flex-end",
justifyContent: "flex-start",
},
priceInfoContainer1: {
flexDirection: "row",
alignItems: "center",
justifyContent: "flex-start",
},
highlightedText: {
padding: 0,
margin: 0,
fontWeight: "700",
fontSize: fontSize(30),
fontFamily: "Segoe UI",
color: "#ff5100",
},
priceInfoContainer2: {
flexDirection: "row",
alignItems: "flex-start",
justifyContent: "flex-start",
marginLeft: 1,
},
orangeHeading: {
padding: 0,
paddingBottom: 14,
margin: 0,
fontWeight: "700",
fontSize: 14,
fontFamily: "Segoe UI",
color: "#ff5100",
},
percentageChangeContainer: {
flexDirection: "column",
alignItems: "center",
justifyContent: "flex-start",
marginLeft: 14.5,
},
discountPercentageTextStyle: {
padding: 0,
margin: 0,
fontStyle: "italic",
fontWeight: "900",
fontSize: 11,
fontFamily: "Segoe UI",
color: "#4e2000",
},
svgContainer1: {
width: 32,
height: 32,
marginTop: -26,
},
vipButtonContainer: {
flexDirection: "row",
alignItems: "center",
justifyContent: "flex-start",
marginLeft: 1.25,
},
svgContainer2: {
width: 10,
height: 10,
color: "#3b3b3b",
},
vipButton: {
width: 55,
minWidth: 55,
height: 21,
marginLeft: -2.5,
backgroundColor: "#3b3b3b",
borderWidth: 0,
borderRadius: 5,
borderBottomLeftRadius: 0,
},
italicBoldSegoeVip: {
fontStyle: "italic",
fontWeight: "900",
fontSize: 14,
fontFamily: "Segoe UI",
},
royalBadge: {
fontStyle: "italic",
fontWeight: "900",
fontSize: fontSize(14),
fontFamily: "Segoe UI",
letterSpacing: -2,
},
pricingCardContainer: {
flexDirection: "row",
gap: widthUtils(29.5, 29.5).width,
alignItems: "flex-start",
justifyContent: "space-between",
width: "100%",
paddingRight: 15,
paddingBottom: 3,
paddingLeft: 11,
marginTop: 7,
backgroundColor: "#f3f4f8",
borderRadius: 5,
},
priceInfoContainer: {
flexDirection: "row",
alignItems: "center",
justifyContent: "flex-start",
},
priceHighlightedText: {
padding: 0,
margin: 0,
fontWeight: "700",
fontSize: fontSize(16),
fontFamily: "Segoe UI",
color: "#373737",
},
priceTagBold: {
padding: 0,
margin: 0,
fontWeight: "700",
fontSize: fontSize(11),
fontFamily: "Segoe UI",
color: "#373737",
},
productPriceTier: {
padding: 0,
margin: 0,
marginTop: -4,
fontWeight: "400",
fontSize: fontSize(12),
fontFamily: "PingFang SC",
color: "#373737",
},
productDetailsContainer: {
width: "100%",
marginTop: 24,
height: "100%",
},
primaryTextHeading: {
padding: 0,
margin: 0,
fontWeight: "600",
fontSize: 16,
lineHeight: 20,
fontFamily: "Segoe UI",
color: "black",
},
colorPaletteContainer1: {
marginTop: 12,
},
colorPaletteContainer: {
flexDirection: "row",
gap: 10,
alignItems: "flex-start",
justifyContent: "flex-start",
width: "100%",
},
cardContainerWithTitleAndIcon: {
flex: 1,
flexDirection: "column",
alignItems: "stretch",
justifyContent: "flex-start",
paddingBottom: 5,
backgroundColor: "#fff5f0",
borderWidth: 1,
borderColor: "#ff5100",
borderRadius: 5,
},
cardContainer1: {
backgroundColor: "#e0e0e0",
borderRadius: 5,
},
flexColumnEndAlign: {
flexDirection: "column",
alignItems: "flex-end",
justifyContent: "flex-start",
width: "100%",
height: 90,
borderRadius: 5,
},
uniqueTextStyler: {
alignSelf: "center",
padding: 0,
margin: 0,
marginTop: 1,
fontWeight: "600",
fontSize: 16,
lineHeight: 20,
fontFamily: "Segoe UI",
color: "#ff5100",
},
cardContainer2: {
flex: 1,
flexDirection: "column",
alignItems: "stretch",
justifyContent: "flex-start",
paddingBottom: 5,
backgroundColor: "#f4f4f4",
borderRadius: 5,
width: 90,
height: 116,
},
flexColumnEndAlign1: {
flexDirection: "column",
alignItems: "flex-end",
justifyContent: "flex-start",
width: "100%",
height: 90,
borderRadius: 5,
},
profileCard: {
alignSelf: "center",
padding: 0,
margin: 0,
marginTop: 1,
fontWeight: "400",
fontFamily: "Segoe UI",
color: "black",
height: 26,
textAlign: "center",
width: 90,
fontSize: fontSize(18),
},
beigeContainer: {
flexDirection: "column",
alignItems: "flex-end",
justifyContent: "flex-start",
height: 90,
backgroundColor: "#e0e0e0",
borderRadius: 5,
},
colorPaletteWidget: {
flexDirection: "column",
alignItems: "flex-end",
justifyContent: "flex-start",
height: 90,
borderRadius: 5,
},
cardContainerWithTitle: {
flexDirection: "column",
alignItems: "stretch",
justifyContent: "flex-start",
width: 90,
height: 116,
paddingBottom: 5,
backgroundColor: "#f4f4f4",
borderRadius: 5,
},
cardContainerWithImage: {
flexDirection: "row",
alignItems: "flex-start",
justifyContent: "flex-start",
borderRadius: 5,
width: 90,
height: 90,
},
imageContainer: {
width: "100%",
height: "100%",
borderWidth: 0,
resizeMode: "cover",
},
svgContainer3: {
width: "100%",
height: "100%",
},
productStockInfoContainer: {
marginTop: 24,
},
productStockDisplayWidget: {
width: "100%",
marginTop: 8,
},
stockAvailabilityDisplayWidget: {
width: "100%",
},
stockInfoDisplayContainer: {
flexDirection: "row",
gap: 8,
alignItems: "center",
justifyContent: "space-between",
width: "100%",
},
stockAvailabilityDisplay: {
marginTop: 10,
},
stockAvailabilityInfoStyle: {
padding: 0,
margin: 0,
fontSize: 16,
lineHeight: 20,
fontFamily: "Segoe UI",
color: "black",
},
stockStatusInfoTextStyle: {
padding: 0,
margin: 0,
fontWeight: "400",
fontSize: 12,
fontFamily: "Segoe UI",
color: "#7c7c7c",
},
stockInfoContainer: {
flexDirection: "row",
gap: 7.5,
alignItems: "center",
justifyContent: "flex-start",
},
stockCountDisplayStyleContainer: {
width: 9,
borderTopWidth: 1,
borderTopColor: "black",
},
stockCountDisplayStyleContainer1: {
alignItems: "center",
justifyContent: "center",
height: 24,
paddingHorizontal: 15,
fontWeight: "400",
fontSize: 14,
fontFamily: "Segoe UI",
color: "black",
backgroundColor: "#f4f4f4",
borderWidth: 0,
borderRadius: 5,
},
svgContainer4: {
width: 8,
height: 8,
},
verticalFlexContainer: {
flexDirection: "column",
alignItems: "stretch",
justifyContent: "flex-start",
width: "100%",
marginTop: 10,
},
numberTextContainer: {
padding: 0,
margin: 0,
fontWeight: "400",
fontSize: 16,
lineHeight: 20,
fontFamily: "Segoe UI",
color: "black",
},
verticalAlignBottom: {
flexDirection: "column",
alignItems: "flex-end",
justifyContent: "center",
marginTop: -4,
},
verticalAlignContainer: {
alignSelf: "flex-start",
paddingRight: 33,
paddingLeft: 322,
marginTop: -4.5,
},
borderBoxedWidthBlackTopLine: {
width: 9,
borderTopWidth: 1,
borderTopColor: "black",
},
closeIconContainer: {
position: "absolute",
top: 15,
right: 15,
zIndex: 1,
},
selectedColorImageContainer: {
borderWidth: 1,
borderColor: "#ff5217",
},
});
export default ProductCard;