From 2e26cd10a4bcb88136044f2fbb4f559ac0dcc982 Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 18:23:36 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=BE=85=E6=94=AF=E4=BB=98=E9=87=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B4=AD=E7=89=A9=E8=BD=A6=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/locales/en/translation.json | 1 + app/locales/fr/translation.json | 1 + app/screens/productStatus/OrderDatails.tsx | 59 +++++- app/services/api/cart.ts | 4 +- app/services/api/orders.ts | 3 +- app/store/burialPoint.ts | 32 ++-- event.js | 197 +++++++++++++++++++++ event.json | 194 ++++++++++++++++++++ event_list.json | 16 ++ event_page.json | 18 ++ page.json | 18 ++ 11 files changed, 518 insertions(+), 25 deletions(-) create mode 100644 event.js create mode 100644 event.json create mode 100644 event_list.json create mode 100644 event_page.json create mode 100644 page.json diff --git a/app/locales/en/translation.json b/app/locales/en/translation.json index 8118232..78b5010 100644 --- a/app/locales/en/translation.json +++ b/app/locales/en/translation.json @@ -235,6 +235,7 @@ "order.error.payment_update": "Failed to update payment method", "order.details": "Order Details", "order.information": "Order Information", + "order.error.add_cart": "Failed to add to cart", "order.id": "Order ID", "order.create_time": "Order Time", "order.shipping_type": "Shipping Method", diff --git a/app/locales/fr/translation.json b/app/locales/fr/translation.json index 8d6ecba..7e4e1a7 100644 --- a/app/locales/fr/translation.json +++ b/app/locales/fr/translation.json @@ -166,6 +166,7 @@ "order.error.payment_update": "Échec de la mise à jour du mode de paiement", "order.details": "Détails de la commande", "order.information": "Informations de commande", + "order.error.add_cart": "Échec de l'ajout au panier", "order.id": "ID de commande", "order.create_time": "Date de commande", "order.shipping_type": "Méthode d'expédition", diff --git a/app/screens/productStatus/OrderDatails.tsx b/app/screens/productStatus/OrderDatails.tsx index cbb40bb..2617b30 100644 --- a/app/screens/productStatus/OrderDatails.tsx +++ b/app/screens/productStatus/OrderDatails.tsx @@ -21,7 +21,11 @@ import fontSize from "../../utils/fontsizeUtils"; import { useNavigation } from "@react-navigation/native"; import { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { useRoute, RouteProp } from "@react-navigation/native"; -import { ordersApi, OrderDetailsType } from "../../services/api/orders"; +import { + ordersApi, + OrderDetailsType, + OrderItemDetails, +} from "../../services/api/orders"; import { payApi, PaymentMethod } from "../../services/api/payApi"; import useUserStore from "../../store/user"; import OrderIcon from "../../components/OrderIcon"; @@ -40,7 +44,7 @@ import CircleOutlineIcon from "../../components/CircleOutlineIcon"; import CheckIcon from "../../components/CheckIcon"; import payMap from "../../utils/payMap"; import PhoneNumberInputModal from "../../screens/BalanceScreen/PhoneNumberInputModal"; - +import { cartApi } from "../../services/api/cart"; // 定义选项类型 interface PaymentOption { id: string; @@ -73,6 +77,7 @@ export const OrderDetails = () => { const [isLoading, setIsLoading] = useState(true); const { deleteOrder, changeOrder, updateOrderShippingInfo } = useOrderListStore(); + const [showPaymentModal, setShowPaymentModal] = useState(false); const [selectedPayment, setSelectedPayment] = useState(null); const [currentTab, setCurrentTab] = useState("online"); @@ -409,6 +414,45 @@ export const OrderDetails = () => { } }; + // 添加购物车 + + const addToCart = async (items: OrderItemDetails[]) => { + const groupedData: { + [key: string]: { + offer_id: number; + skus: { quantity: number; sku_id: string }[]; + }; + } = {}; + + items.forEach((item) => { + const offerId = item.offer_id.toString(); + + if (!groupedData[offerId]) { + groupedData[offerId] = { + offer_id: item.offer_id, + skus: [], + }; + } + + groupedData[offerId].skus.push({ + quantity: item.quantity, + sku_id: item.sku_id.toString(), + }); + }); + + // 转换为数组格式 + const result = Object.values(groupedData)[0]; + try{ + setIsLoading(true); + await cartApi(result); + setIsLoading(false); + Alert.alert(t("order.add_cart_success")); + } catch (error) { + setIsLoading(false); + Alert.alert(t("error"), t("order.error.add_cart")); + } + }; + // 添加确定按钮禁用逻辑函数 const isConfirmButtonDisabled = () => { // 如果没有选择支付方式,禁用按钮 @@ -659,7 +703,10 @@ export const OrderDetails = () => { - + addToCart(orderDetails.items)} + > @@ -748,14 +795,14 @@ export const OrderDetails = () => { { - callPhone("15903995548"); + callPhone(orderDetails.whatsapp_number); }} > {t("order.contact_shipping")} - { changeOrder(route.params.orderId, 2); @@ -765,7 +812,7 @@ export const OrderDetails = () => { {t("order.cancel")} - + */} )} {/* 代收货 */} diff --git a/app/services/api/cart.ts b/app/services/api/cart.ts index 0179aab..42f3f96 100644 --- a/app/services/api/cart.ts +++ b/app/services/api/cart.ts @@ -2,8 +2,8 @@ import apiService from './apiClient'; export interface AddToCartParams { - offer_id: number; - skus: {sku_id:number,quantity:number}[] + offer_id: number | string; + skus: {sku_id:number | string,quantity:number}[] } export interface GetCartListResponse { diff --git a/app/services/api/orders.ts b/app/services/api/orders.ts index 70b0f2b..80ca361 100644 --- a/app/services/api/orders.ts +++ b/app/services/api/orders.ts @@ -284,7 +284,7 @@ interface SkuAttributesDetails { sku_image: string; } -interface OrderItemDetails { +export interface OrderItemDetails { offer_id: number; cart_item_id: number | null; sku_id: number; @@ -310,6 +310,7 @@ export interface OrderDetailsType { domestic_shipping_fee: number; actual_amount: number; currency:string, + whatsapp_number:string, discount_amount: number; shipping_fee: number; address_id: number; diff --git a/app/store/burialPoint.ts b/app/store/burialPoint.ts index cd102b2..e854223 100644 --- a/app/store/burialPoint.ts +++ b/app/store/burialPoint.ts @@ -194,7 +194,7 @@ const useBurialPointStore = create((set, get) => ({ logLogin: (isSuccess = true, loginMethod = "phone") => { const loginEvent: BurialEvent = { event_name: "login", - page_name: null, + page_name: "login", referre_page: null, event_properties: [ { @@ -212,7 +212,7 @@ const useBurialPointStore = create((set, get) => ({ logRegister: (isSuccess = true, registerMethod = "phone") => { const registerEvent: BurialEvent = { event_name: "register", - page_name: null, + page_name: "register", referre_page: null, event_properties: [ { @@ -229,8 +229,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录浏览商品事件埋点 logViewProduct: (productInfo: ProductProperty, fromPage = "home") => { const viewProductEvent: BurialEvent = { - event_name: "product_view", - page_name: "ProductDetail", + event_name: "product", + page_name: "product", referre_page: fromPage, event_properties: [productInfo] }; @@ -258,8 +258,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录填写地址信息事件埋点 logAddressInfo: (addressInfo: Omit, fromPage = "cart") => { const addressEvent: BurialEvent = { - event_name: "fill_information", - page_name: "PreviewAddress", + event_name: "address", + page_name: "address", referre_page: fromPage, event_properties: [ { @@ -275,8 +275,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录物流信息确认事件埋点 logShippingConfirm: (shippingInfo: Omit, fromPage = "address") => { const shippingEvent: BurialEvent = { - event_name: "shipping_confirm", - page_name: "ShippingFee", + event_name: "shipping", + page_name: "shipping", referre_page: fromPage, event_properties: [ { @@ -292,8 +292,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录支付方式确认事件埋点 logPaymentConfirm: (paymentInfo: Omit, fromPage = "shipping") => { const paymentEvent: BurialEvent = { - event_name: "payment_confirm", - page_name: "PaymentMethod", + event_name: "payment", + page_name: "payment", referre_page: fromPage, event_properties: [ { @@ -309,8 +309,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录预览订单事件埋点 logPreviewOrder: (fromPage = "pay_method") => { const previewEvent: BurialEvent = { - event_name: "preview_order", - page_name: "PreviewOrder", + event_name: "order", + page_name: "order", referre_page: fromPage, event_properties: [ { @@ -325,8 +325,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录支付结账事件埋点 logCheckout: (checkoutInfo: Omit, fromPage = "perview") => { const checkoutEvent: BurialEvent = { - event_name: "check_out", - page_name: "pay", + event_name: "checkout", + page_name: "checkout", referre_page: fromPage, event_properties: [ { @@ -342,8 +342,8 @@ const useBurialPointStore = create((set, get) => ({ // 记录添加购物车事件埋点 logAddToCart: (cartInfo: Omit, fromPage = "search") => { const addToCartEvent: BurialEvent = { - event_name: "add_to_cart", - page_name: "add_to_cart", + event_name: "addToCart", + page_name: "addToCart", referre_page: fromPage, event_properties: [ { diff --git a/event.js b/event.js new file mode 100644 index 0000000..22767cd --- /dev/null +++ b/event.js @@ -0,0 +1,197 @@ +const eventData = { + user_id: 11, + device_id: "ios", + version: "1747643239421-2wi8sr8yr", + session_id: "1747643239421-g28qurlzy", + event_list: [ + { + event_name: "launch", // app启动 + page_name: null, + event_properties: [ + { + is_open: 1, // 1: 正常打开 0: app崩溃 + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "login", // 登录 + page_name: "login", // 登录页面 + event_properties: [ + { + is_login: 1, + login_method: "phone", // facebook, google, phone, email, apple + user_name: "1234567890", // 用户名称 + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "register", // 注册 + page_name: "register", // 注册页面 + event_properties: [ + { + is_register: 1, + user_name: "1234567890", // 用户名称 + register_method: "phone", // facebook, google, phone, email, apple + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "search", // 搜索 + page_name: "search", // 搜索页面 + event_properties: [ + { + search_keyword: "1234567890", // 搜索关键词 + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "product", // 商品 + page_name: "product", // 商品页面 + event_properties: [ + { + offer_id: 892906753556, // 商品ID + category_id: 1037036, // 商品分类ID + price: 2.17, // 商品价格 + currency: "FCFA", // FCFA, USD, CDF,CFA,EUR, + timestamp: "2025-05-19 08:27:21", + product_name: "瑜伽服女夏天排汗瑜伽服大码胖速干衣跑步套装女晨跑运动套装女", // 商品名称 + product_img: + "https://cbu01.alicdn.com/img/ibank/O1CN01KvfDVh1UL3CWndJ89_!!2219347832500-0-cib.jpg", // 商品图片 + }, + ], + }, + { + event_name: "category", // 分类 + page_name: "category", // 分类页面 + event_properties: [ + { + category_id: "1234567890", // 分类ID + timestamp: "2025-05-19 08:27:21", + category_name: "食品酒水", // 分类名称 + level: 1, // 分类级别 + }, + ], + }, + { + event_name: "productList", // 商品列表 + page_name: "productList", // 商品列表页面 + event_properties: [ + { + category_id: "133", // 分类ID + category_name: "农业用品", // 分类名称 + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "addToCart", // 添加到购物车 + page_name: "addToCart", // 添加到购物车页面 + event_properties: [ + { + offer_id: 892906753556, // 商品ID + category_id: 1037036, // 商品分类ID + price: 2.17, // 商品价格 + quality: 1, // 商品数量 + currency: "FCFA", // FCFA, USD, CDF,CFA,EUR, + timestamp: "2025-05-19 08:27:21", + product_name: "瑜伽服女夏天排汗瑜伽服大码胖速干衣跑步套装女晨跑运动套装女", // 商品名称 + product_img: + "https://cbu01.alicdn.com/img/ibank/O1CN01KvfDVh1UL3CWndJ89_!!2219347832500-0-cib.jpg", // 商品图片 + }, + { + offer_id: 892906753557, // 商品ID + category_id: 1037036, // 商品分类ID + price: 2.17, // 商品价格 + quality: 2, // 商品数量 + currency: "FCFA", // FCFA, USD, CDF,CFA,EUR, + timestamp: "2025-05-19 08:27:21", + product_name: "瑜伽服女夏天排汗瑜伽服大码胖速干衣跑步套装女晨跑运动套装女", // 商品名称 + product_img: + "https://cbu01.alicdn.com/img/ibank/O1CN01KvfDVh1UL3CWndJ89_!!2219347832500-0-cib.jpg", + }, + ], + }, + { + event_name: "address", // 地址 + page_name: "address", // 地址页面 + event_properties: [ + { + last_name: "san", // 姓 + first_name: "zhang", // 名 + country: "chinese", // 国家 + phone: 10086, // 手机号 + whatsapp: 10086, // whatsapp号 + timestamp: "2025-05-12 00:00:30", + }, + ], + }, + { + event_name: "shipping", + page_name: "shipping", + event_properties: [ + { + shipping_method: 0, // 运输方式 // 0 船运 1 空运 + shipping_price_outside: 40, // 国际运输价格 + shipping_price_within: 20, // 国内运输价格 + currency: "FCFA", // FCFA, USD, CDF,CFA,EUR, + forwarder_name: "达菲物流", // 货代中心 // 欧万物流 //303仓库 + country_city: "Congo-Kinshasa", // 国家-城市 + timestamp: "2025-05-12 00:00:30", + }, + ], + }, + { + event_name: "payment", // 支付 + page_name: "payment", // 支付页面 + event_properties: [ + { + pay_method: "palpay", //支付方式 // palpay, mobile_money, wave, bank_card balance + online: 1, //线上或线下 // 1 线上支付 0 线下支付 + all_price: 519.8, // 总价格 + currency: "FCFA", // FCFA, USD, CDF,CFA,EUR, + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "order", // 订单 + page_name: "order", // 订单页面 + event_properties: [ + { + order_id: "1234567890", // 订单ID + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + { + event_name: "checkout", // 结算 + page_name: "checkout", // 结算页面 + event_properties: [ + { + is_suc: 1, // 是否成功 1 成功 0 失败 + all_price: 519.8, // 总价格 + currency: "FCFA", // FCFA, USD, CDF,CFA,EUR, + timestamp: "2025-05-12 00:00:30", + shipping_method: 0, // 0 船运 1 空运 + shipping_price_outside: 40, // 国际运输价格 + shipping_price_within: 20, // 国内运输价格 + }, + ], + }, + { + event_name: "purchase", // 购买 + page_name: "purchase", // 购买页面 + event_properties: [ + { + order_id: "1234567890", // 订单ID + is_suc: 1, // 是否成功 1 成功 + timestamp: "2025-05-19 08:27:21", + }, + ], + }, + ], + }; \ No newline at end of file diff --git a/event.json b/event.json new file mode 100644 index 0000000..d0d02ad --- /dev/null +++ b/event.json @@ -0,0 +1,194 @@ +{ + "user_id": 11, + "device_id": "ios", + "version": "1747643239421-2wi8sr8yr", + "session_id": "1747643239421-g28qurlzy", + "event_list": [ + { + "event_name": "app_launch", + "page_name": null, + "event_properties": [ + { + "is_open": 1, + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "login", + "page_name": "login", + "event_properties": [ + { + "is_login": 1, + "login_method": "phone", + "user_name": "1234567890", + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "register", + "page_name": "register", + "event_properties": [ + { + "is_register": 1, + "user_name": "1234567890", + "register_method": "phone", + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "search", + "page_name": "search", + "event_properties": [ + { + "search_keyword": "1234567890", + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "product", + "page_name": "product", + "event_properties": [ + { + "offer_id": 892906753556, + "category_id": 1037036, + "price": 2.17, + "currency": "FCFA", + "timestamp": "2025-05-19 08:27:21", + "product_name": "瑜伽服女夏天排汗瑜伽服大码胖速干衣跑步套装女晨跑运动套装女", + "product_img": "https://cbu01.alicdn.com/img/ibank/O1CN01KvfDVh1UL3CWndJ89_!!2219347832500-0-cib.jpg" + } + ] + }, + { + "event_name": "category", + "page_name": "category", + "event_properties": [ + { + "category_id": "1234567890", + "timestamp": "2025-05-19 08:27:21", + "category_name": "食品酒水", + "level": 1 + } + ] + }, + { + "event_name": "productList", + "page_name": "productList", + "event_properties": [ + { + "category_id": "133", + "category_name": "农业用品", + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "addToCart", + "page_name": "addToCart", + "event_properties": [ + { + "offer_id": 892906753556, + "category_id": 1037036, + "price": 2.17, + "quality": 1, + "currency": "FCFA", + "timestamp": "2025-05-19 08:27:21", + "product_name": "瑜伽服女夏天排汗瑜伽服大码胖速干衣跑步套装女晨跑运动套装女", + "product_img": "https://cbu01.alicdn.com/img/ibank/O1CN01KvfDVh1UL3CWndJ89_!!2219347832500-0-cib.jpg" + }, + { + "offer_id": 892906753557, + "category_id": 1037036, + "price": 2.17, + "quality": 2, + "currency": "FCFA", + "timestamp": "2025-05-19 08:27:21", + "product_name": "瑜伽服女夏天排汗瑜伽服大码胖速干衣跑步套装女晨跑运动套装女", + "product_img": "https://cbu01.alicdn.com/img/ibank/O1CN01KvfDVh1UL3CWndJ89_!!2219347832500-0-cib.jpg" + } + ] + }, + { + "event_name": "address", + "page_name": "address", + "event_properties": [ + { + "last_name": "san", + "first_name": "zhang", + "country": "chinese", + "phone_number": 10086, + "whatsApp_number": 10086, + "timestamp": "2025-05-12 00:00:30" + } + ] + }, + { + "event_name": "shipping", + "page_name": "shipping", + "event_properties": [ + { + "shipping_method": 0, + "shipping_price_outside": 40, + "shipping_price_within": 20, + "currency": "fcfa", + "forwarder_name": "达菲物流", + "country_city": "Congo-Kinshasa", + "timestamp": "2025-05-12 00:00:30" + } + ] + }, + { + "event_name": "payment", + "page_name": "payment", + "event_properties": [ + { + "pay_method": "palpay", + "offline_payment": 1, + "all_price": 519.8, + "currency": "fcfa", + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "order", + "page_name": "order", + "event_properties": [ + { + "order_id": "1234567890", + "timestamp": "2025-05-19 08:27:21" + } + ] + }, + { + "event_name": "checkout", + "page_name": "checkout", + "event_properties": [ + { + "is_suc": 1, + "all_price": 519.8, + "currency": "fcfa", + "timestamp": "2025-05-12 00:00:30", + "shipping_method": 0, + "shipping_price_outside": 40, + "shipping_price_within": 20 + } + ] + }, + { + "event_name": "purchase", + "page_name": "purchase", + "event_properties": [ + { + "order_id": "1234567890", + "is_suc": 1, + "timestamp": "2025-05-19 08:27:21" + } + ] + } + ] +} diff --git a/event_list.json b/event_list.json new file mode 100644 index 0000000..065728d --- /dev/null +++ b/event_list.json @@ -0,0 +1,16 @@ +{ + "app启动":"launch", + "登录":"login", + "注册":"register", + "浏览商品":"product", + "浏览分类":"category", + "浏览商品list":"productList", + "搜索":"search", + "添加购物车":"addToCart", + "填写地址":"adress", + "物流方式":"shipping", + "支付方式":"payment", + "创建订单":"order", + "发起结账":"checkout", + "支付成功":"purchase" +} \ No newline at end of file diff --git a/event_page.json b/event_page.json new file mode 100644 index 0000000..707082d --- /dev/null +++ b/event_page.json @@ -0,0 +1,18 @@ +{ + "启动app": null, + "登录": "login", + "注册": "register", + "主页": "home", + "搜索": "search", + "商品详情页": "product", + "浏览商品分类": "category", + "浏览商品list": "productList", + "购物车": "cart", + "填写地址": "address", + "物流方式": "shipping", + "支付方式": "payment", + "浏览订单": "order", + "结账": "checkout", + "支付成功": "purchase", + "支付失败": "paymentFailed" +} diff --git a/page.json b/page.json new file mode 100644 index 0000000..707082d --- /dev/null +++ b/page.json @@ -0,0 +1,18 @@ +{ + "启动app": null, + "登录": "login", + "注册": "register", + "主页": "home", + "搜索": "search", + "商品详情页": "product", + "浏览商品分类": "category", + "浏览商品list": "productList", + "购物车": "cart", + "填写地址": "address", + "物流方式": "shipping", + "支付方式": "payment", + "浏览订单": "order", + "结账": "checkout", + "支付成功": "purchase", + "支付失败": "paymentFailed" +} From 9e4ef7d5a8b76107a66099f1fa120208d6754151 Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 19:52:40 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/constants/productStatus.ts | 8 +- app/screens/productStatus/OrderDatails.tsx | 66 +++++----- app/services/api/orders.ts | 9 ++ app/store/orderList.ts | 146 +++++++++++++-------- 4 files changed, 137 insertions(+), 92 deletions(-) diff --git a/app/constants/productStatus.ts b/app/constants/productStatus.ts index b2f0419..888827e 100644 --- a/app/constants/productStatus.ts +++ b/app/constants/productStatus.ts @@ -13,8 +13,8 @@ export const productStatus: ProductStatus[] = [ // { icon: DocumentClockIcon, text: '付运费', textKey: 'order.status.pay_shipping', status: 6 }, { icon: DocumentClockIcon, text: '待发货', textKey: 'order.status.waiting_shipment', status: 1 }, { icon: DocumentApprovedIcon, text: '运输中', textKey: 'order.status.in_transit', status: 2 }, - { icon: DocumentApprovedIcon, text: '代收货', textKey: 'order.status.waiting_receipt', status: 3 }, - { icon: PdfDocumentIcon, text: '已完成', textKey: 'order.status.completed', status: 4 }, - { icon: DocumentClockIcon, text: '已取消', textKey: 'order.status.cancelled', status: 5 }, - { icon: DocumentClockIcon, text: '已退款', textKey: 'order.status.refunded', status: 6 } + // { icon: DocumentApprovedIcon, text: '代收货', textKey: 'order.status.waiting_receipt', status: 3 }, + { icon: PdfDocumentIcon, text: '已完成', textKey: 'order.status.completed', status: 3 }, + { icon: DocumentClockIcon, text: '已过期', textKey: 'order.status.cancelled', status: 4 }, + // { icon: DocumentClockIcon, text: '已退款', textKey: 'order.status.refunded', status: 6 } ] \ No newline at end of file diff --git a/app/screens/productStatus/OrderDatails.tsx b/app/screens/productStatus/OrderDatails.tsx index 2617b30..967fa5e 100644 --- a/app/screens/productStatus/OrderDatails.tsx +++ b/app/screens/productStatus/OrderDatails.tsx @@ -75,7 +75,7 @@ export const OrderDetails = () => { >(); const [orderDetails, setOrderDetails] = useState(); const [isLoading, setIsLoading] = useState(true); - const { deleteOrder, changeOrder, updateOrderShippingInfo } = + const { deleteOrder, changeOrder, updateOrderShippingInfo,cancelOrder,confirmOrder } = useOrderListStore(); const [showPaymentModal, setShowPaymentModal] = useState(false); @@ -717,6 +717,7 @@ export const OrderDetails = () => { + {/* {route.params.status} */} {/* 价格信息 */} @@ -767,12 +768,13 @@ export const OrderDetails = () => { {/* 代付款 */} - {orderDetails.order_status === 0 && ( + {route.params.status === 0 && ( { - deleteOrder(route.params.orderId); + cancelOrder(route.params.orderId); + navigation.goBack(); }} > @@ -790,7 +792,7 @@ export const OrderDetails = () => { )} {/* 待发货 */} - {orderDetails.order_status === 1 && ( + {route.params.status === 1 && ( { )} {/* 代收货 */} - {orderDetails.order_status === 2 && ( + {route.params.status === 2 && ( { { - updateOrderShippingInfo(route.params.orderId, { - shipping_status: 0, - shipping_info: { - shipping_company: "string", - shipping_no: "string", - shipping_info: {}, - }, - }); + confirmOrder(route.params.orderId); + navigation.goBack(); }} > @@ -847,32 +843,36 @@ export const OrderDetails = () => { )} {/* 已完成 */} - {orderDetails.order_status === 3 && ( - - { - deleteOrder(route.params.orderId); - navigation.goBack(); - }} - > - - {t("order.cancel")} - - - - - {t("order.pay_now")} - - + {route.params.status === 3 && ( + + // + // { + // addToCart(orderDetails.items); + // // navigation.goBack(); + // }} + // > + // + // {t("order.add_to_cart")} + // + // + // + // + // {t("order.reorder")} + // + // + // )} {/* 已取消 */} - {orderDetails.order_status === 4 && ( + {route.params.status === 4 && ( {}} + onPress={() => { + addToCart(orderDetails.items); + }} > {t("order.add_to_cart")} diff --git a/app/services/api/orders.ts b/app/services/api/orders.ts index 80ca361..5ad96b6 100644 --- a/app/services/api/orders.ts +++ b/app/services/api/orders.ts @@ -402,4 +402,13 @@ export const ordersApi = { // 修改支付方式 updateOrderPaymentMethod: (data: UpdateOrderPaymentMethod) => apiService.put(`/api/orders/edit/`, data), + + // 取消订单 + cancelOrder: (order_id: string) => + apiService.post(`/api/orders/${order_id}/cancel/`), + + // 确定收货 + confirmOrder: (order_id: string) => + apiService.patch(`/api/orders/${order_id}/shipping/`,{ + }), }; diff --git a/app/store/orderList.ts b/app/store/orderList.ts index 0c90da9..bd0cbcb 100644 --- a/app/store/orderList.ts +++ b/app/store/orderList.ts @@ -1,65 +1,101 @@ -import { create } from 'zustand'; -import { ordersApi, PaginatedOrderResponse, PaginatedOrderRequest,UpdateOrderShippingInfo} from '../services/api/orders'; +import { create } from "zustand"; +import { + ordersApi, + PaginatedOrderResponse, + PaginatedOrderRequest, + UpdateOrderShippingInfo, +} from "../services/api/orders"; interface OrderListState { - orders: PaginatedOrderResponse, - getAllOrders: (data: PaginatedOrderRequest,page:number) => Promise, - deleteOrder: (orderId: string) => Promise, - changeOrder: (orderId: string,status:number) => Promise, - updateOrderShippingInfo: (orderId: string,data:UpdateOrderShippingInfo) => Promise, + orders: PaginatedOrderResponse; + getAllOrders: (data: PaginatedOrderRequest, page: number) => Promise; + deleteOrder: (orderId: string) => Promise; + changeOrder: (orderId: string, status: number) => Promise; + updateOrderShippingInfo: ( + orderId: string, + data: UpdateOrderShippingInfo + ) => Promise; + cancelOrder: (orderId: string) => Promise; + confirmOrder: (orderId: string) => Promise; } export const useOrderListStore = create((set, get) => ({ - orders: { - items: [], - total: 0, - page: 1, - page_size: 10, - }, + orders: { + items: [], + total: 0, + page: 1, + page_size: 10, + }, - getAllOrders: async (data: PaginatedOrderRequest,page:number) => { - const response = await ordersApi.getAllOrders(data); - set((state) => ({ - orders: { - ...response, - items: page === 1 - ? response.items - : [...state.orders.items, ...response.items], - } - })); - }, + getAllOrders: async (data: PaginatedOrderRequest, page: number) => { + const response = await ordersApi.getAllOrders(data); + set((state) => ({ + orders: { + ...response, + items: + page === 1 + ? response.items + : [...state.orders.items, ...response.items], + }, + })); + }, - deleteOrder: async (orderId: string) => { - await ordersApi.deleteOrder(orderId); - set((state) => ({ - orders: { - ...state.orders, - items: state.orders.items.filter(item => item.order_id !== orderId), - total: state.orders.total - 1 - } - })); - }, + deleteOrder: async (orderId: string) => { + await ordersApi.deleteOrder(orderId); + set((state) => ({ + orders: { + ...state.orders, + items: state.orders.items.filter((item) => item.order_id !== orderId), + total: state.orders.total - 1, + }, + })); + }, - changeOrder: async (orderId: string,status:number) => { - await ordersApi.changeOrder(orderId,status); - set((state) => ({ - orders: { - ...state.orders, - items: state.orders.items.filter(item => item.order_id !== orderId), - total: state.orders.total - 1 - } - })); - }, + changeOrder: async (orderId: string, status: number) => { + await ordersApi.changeOrder(orderId, status); + set((state) => ({ + orders: { + ...state.orders, + items: state.orders.items.filter((item) => item.order_id !== orderId), + total: state.orders.total - 1, + }, + })); + }, - updateOrderShippingInfo: async (orderId: string,data:UpdateOrderShippingInfo) => { - await ordersApi.updateOrderShippingInfo(orderId,data); - set((state) => ({ - orders: { - ...state.orders, - items: state.orders.items.filter(item => item.order_id !== orderId), - total: state.orders.total - 1 - } - })); - }, -})); + updateOrderShippingInfo: async ( + orderId: string, + data: UpdateOrderShippingInfo + ) => { + await ordersApi.updateOrderShippingInfo(orderId, data); + set((state) => ({ + orders: { + ...state.orders, + items: state.orders.items.filter((item) => item.order_id !== orderId), + total: state.orders.total - 1, + }, + })); + }, + // 取消订单 + cancelOrder: async (orderId: string) => { + set((state) => ({ + orders: { + ...state.orders, + items: state.orders.items.filter((item) => item.order_id !== orderId), + total: state.orders.total - 1, + }, + })); + await ordersApi.cancelOrder(orderId); + }, + // 确定收货 + confirmOrder: async (orderId: string) => { + set((state) => ({ + orders: { + ...state.orders, + items: state.orders.items.filter((item) => item.order_id !== orderId), + total: state.orders.total - 1, + }, + })); + await ordersApi.confirmOrder(orderId); + }, +})); From 7f5c736ac943d915f10252de18c8f136f7ecc9b0 Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 19:56:40 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=8D=A1=E7=89=87=E5=88=87=E6=8D=A2=E8=B4=A7=E5=B8=81=E5=93=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/screens/ProductCard.tsx | 8 ++++---- app/services/api/productApi.ts | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/screens/ProductCard.tsx b/app/screens/ProductCard.tsx index abef686..41e9b19 100644 --- a/app/screens/ProductCard.tsx +++ b/app/screens/ProductCard.tsx @@ -132,7 +132,7 @@ const ProductCard: React.FC = ({ category_id: product?.category_id || 0, price: item.offer_price || price || 0, all_price: totalPrice || 0, - currency: currency || "", + currency: product.currency || "", sku_id: item?.sku_id || 0, quantity: (item?.size as number) || 0, product_name: product?.subject || "", @@ -176,7 +176,7 @@ const ProductCard: React.FC = ({ category_id: product?.category_id || 0, price: item.offer_price || price || 0, all_price: totalPrice || 0, - currency: currency || "", + currency: product.currency || "", sku_id: item?.sku_id || 0, quantity: (item?.size as number) || 0, product_name: product?.subject || "", @@ -263,7 +263,7 @@ const ProductCard: React.FC = ({ {price} - {currency} + {product.currency} @@ -760,7 +760,7 @@ const ProductCard: React.FC = ({ 总价: - {totalPrice.toFixed(2)} {currency} + {totalPrice.toFixed(2)} {product.currency} diff --git a/app/services/api/productApi.ts b/app/services/api/productApi.ts index 1102af1..abd7f74 100644 --- a/app/services/api/productApi.ts +++ b/app/services/api/productApi.ts @@ -56,6 +56,7 @@ export type Products = Product[] "value_trans_en": string, "sku_image_url": string, 'has_color'?: boolean, + currency:string size?:number, list:Sku[], @@ -85,6 +86,7 @@ export type Products = Product[] export interface ProductDetailParams { "offer_id": 0, + currency:string "category_id": 0, "price": number | string, "subject": "string", From fb76aa8aa1df1722dab2316111668f39cba23eb4 Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 20:16:20 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E8=B4=A7?= =?UTF-8?q?=E5=B8=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/screens/CartScreen.tsx | 3 ++- app/services/api/cart.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/screens/CartScreen.tsx b/app/screens/CartScreen.tsx index 86924db..afbf051 100644 --- a/app/screens/CartScreen.tsx +++ b/app/screens/CartScreen.tsx @@ -805,7 +805,7 @@ export const CartScreen = () => { {sku.price} - FCFA + {sku.currency} @@ -1240,6 +1240,7 @@ const styles = StyleSheet.create({ fontFamily: "PingFang SC", fontWeight: "600", color: "#9a9a9a", + textDecorationLine: 'line-through', }, vipContainer: { position: 'relative', diff --git a/app/services/api/cart.ts b/app/services/api/cart.ts index 42f3f96..7a8f93a 100644 --- a/app/services/api/cart.ts +++ b/app/services/api/cart.ts @@ -32,6 +32,7 @@ export interface CartSku { selected: number, currency:string, sku_id: number, + original_min_price:number, attributes:attributes[], } export interface GetCartList { From 938a9b58e8eb1423e54caa396c4b4c9ba5c320c0 Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 20:31:35 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E8=B4=A7?= =?UTF-8?q?=E5=B8=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/screens/CartScreen.tsx | 4 ++-- app/screens/HomeScreen.tsx | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/screens/CartScreen.tsx b/app/screens/CartScreen.tsx index afbf051..227f168 100644 --- a/app/screens/CartScreen.tsx +++ b/app/screens/CartScreen.tsx @@ -1549,13 +1549,13 @@ const styles = StyleSheet.create({ color: "black", }, highlightedText1: { - fontSize: fontSize(24), + fontSize: fontSize(20), fontFamily: "Segoe UI", fontWeight: "700", color: "black", }, priceLabel: { - fontSize: fontSize(11), + fontSize: fontSize(10), fontFamily: "Segoe UI", fontWeight: "700", color: "black", diff --git a/app/screens/HomeScreen.tsx b/app/screens/HomeScreen.tsx index 32ac1f2..1cb19ea 100644 --- a/app/screens/HomeScreen.tsx +++ b/app/screens/HomeScreen.tsx @@ -792,17 +792,17 @@ export const HomeScreen = () => { <> ( navigation.navigate(item.add)} + activeOpacity={1} key={item.imgUrl} style={{ flex: 1, From 69c7f7f2f7bdf991f60269fead65d88ba461b5ff Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 20:45:19 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=9B=BE=E6=8C=87=E7=A4=BA=E7=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/screens/HomeScreen.tsx | 278 +++++++++++++++++++++++++++++++++---- 1 file changed, 252 insertions(+), 26 deletions(-) diff --git a/app/screens/HomeScreen.tsx b/app/screens/HomeScreen.tsx index 1cb19ea..6dd87b2 100644 --- a/app/screens/HomeScreen.tsx +++ b/app/screens/HomeScreen.tsx @@ -781,6 +781,11 @@ export const HomeScreen = () => { Alert.alert("已重置", "现在您可以使用相机功能了"); }, []); + // 优化轮播图切换回调 + const handleCarouselSnap = useCallback((index: number) => { + setActiveIndex(index); + }, []); + const renderItem = ({ item, index }: { item: Product; index: number }) => { if (index >= products.length && index < products.length + loadingPlaceholders) { return ; @@ -788,10 +793,11 @@ export const HomeScreen = () => { return renderProductItem({ item }); }; - const renderHeader = () => ( + const renderHeader = useCallback(() => ( <> { parallaxScrollingScale: 0, parallaxScrollingOffset: 0, }} + onSnapToItem={handleCarouselSnap} renderItem={({ item }) => ( navigation.navigate(item.add)} @@ -822,6 +829,17 @@ export const HomeScreen = () => { )} /> + + {data.map((_, index) => ( + + ))} + { ) : null} - ); + ), [activeIndex, selectedHorizontalCategory]); return ( @@ -956,30 +974,8 @@ export const HomeScreen = () => { {renderSkeletonGrid()} ) : ( - - (item?.offer_id ? `${item.offer_id}-${currentPage}-${index}` : `placeholder-${currentPage}-${index}`) - } - contentContainerStyle={{ - paddingBottom: 15, - backgroundColor: "transparent", - }} - ListHeaderComponent={renderHeader} - onEndReached={handleLoadMore} - onEndReachedThreshold={3} - ListFooterComponent={() => ( - !hasMore && !loadingPlaceholders ? ( - - 没有更多数据了 - - ) : null - )} refreshControl={ { progressBackgroundColor="transparent" /> } - /> + onScroll={({ nativeEvent }) => { + const { layoutMeasurement, contentOffset, contentSize } = nativeEvent; + const paddingToBottom = 20; + if (layoutMeasurement.height + contentOffset.y >= contentSize.height - paddingToBottom) { + handleLoadMore(); + } + }} + scrollEventThrottle={400} + > + {/* 轮播图区域 */} + + ( + navigation.navigate(item.add)} + activeOpacity={1} + key={item.imgUrl} + style={{ + flex: 1, + justifyContent: "center", + alignItems: "center", + backgroundColor: "#f2f2f2", + borderRadius: 0, + overflow: "hidden", + }} + > + + + )} + /> + + {data.map((_, index) => ( + + ))} + + + + + {t("homePage.searchPlaceholder")} + setShowImagePickerModal(true)} + > + + + + + + + {/* Banner区域 */} + + + + + + navigation.navigate("TikTokScreen")} + > + + + + + + + + + {/* 分类区域 */} + + + + {categories.map((category, index) => ( + setSelectedHorizontalCategory(category)} + > + + {t(`homePage.${category.toLowerCase()}`)} + + + ))} + + + + + setShowCategoryModal(true)}> + + + + + + {/* 子分类区域 */} + {selectedHorizontalCategory && + categoryContent[selectedHorizontalCategory] && + categoryContent[selectedHorizontalCategory].length > 0 ? ( + + + {categoryContent[selectedHorizontalCategory].map((item) => ( + { + // Handle subcategory selection + }} + > + + + + {item.title} + + ))} + + + ) : null} + + {/* 产品网格 */} + + + {(() => { + const allItems = [...products, ...Array(loadingPlaceholders).fill(null)]; + const rows = []; + + for (let i = 0; i < allItems.length; i += 2) { + const leftItem = allItems[i]; + const rightItem = allItems[i + 1]; + + rows.push( + + {/* 左侧商品 */} + {leftItem ? ( + i >= products.length ? ( + + ) : ( + renderProductItem({ item: leftItem }) + ) + ) : null} + + {/* 右侧商品 */} + {rightItem ? ( + i + 1 >= products.length ? ( + + ) : ( + renderProductItem({ item: rightItem }) + ) + ) : ( + + )} + + ); + } + + return rows; + })()} + + + {/* 底部提示 */} + {!hasMore && !loadingPlaceholders && ( + + 没有更多数据了 + + )} + + )} ({ paddingTop: 0, }, productCardGroup: { + flexDirection: "row", justifyContent: "space-between", marginBottom: 15, paddingHorizontal: 15, From f5725176e34e4403eadccac08c16bef197291586 Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 20:46:54 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E4=BB=B7?= =?UTF-8?q?=E6=A0=BC=E5=AD=97=E4=BD=93=E5=8F=98=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/screens/CartScreen.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/screens/CartScreen.tsx b/app/screens/CartScreen.tsx index 227f168..f43cccd 100644 --- a/app/screens/CartScreen.tsx +++ b/app/screens/CartScreen.tsx @@ -1211,14 +1211,14 @@ const styles = StyleSheet.create({ alignItems: "center", }, productCodeLabel: { - fontSize: fontSize(20), + fontSize: fontSize(16), lineHeight: 22, fontFamily: "Segoe UI", fontWeight: "700", color: "#FF5100", }, productDetailsTextStyle: { - fontSize: fontSize(11), + fontSize: fontSize(10), fontFamily: "Segoe UI", fontWeight: "700", color: "#FF5100", From f2bb2961a3cdd2fc22fc180319f706b58be0049e Mon Sep 17 00:00:00 2001 From: Mac Date: Sun, 25 May 2025 21:06:11 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E8=B4=AD=E7=89=A9=E8=BD=A6=E4=BB=B7?= =?UTF-8?q?=E6=A0=BC=E5=AD=97=E4=BD=93=E5=8F=98=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/screens/HomeScreen.tsx | 53 +++++--------------------------------- app/utils/languageUtils.ts | 28 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/app/screens/HomeScreen.tsx b/app/screens/HomeScreen.tsx index 6dd87b2..a902832 100644 --- a/app/screens/HomeScreen.tsx +++ b/app/screens/HomeScreen.tsx @@ -62,7 +62,6 @@ type SubcategoryItem = { type CategoryContentType = { [key: string]: SubcategoryItem[]; }; - // 懒加载图片组件 - 改进版本 const LazyImage = React.memo( ({ @@ -76,16 +75,13 @@ const LazyImage = React.memo( }) => { const [isLoaded, setIsLoaded] = useState(false); const [hasError, setHasError] = useState(false); - const onLoad = useCallback(() => { setIsLoaded(true); }, []); - const onError = useCallback(() => { setHasError(true); setIsLoaded(true); // Also mark as loaded on error to remove placeholder }, []); - return ( {/* Show placeholder while image is loading */} @@ -98,7 +94,6 @@ const LazyImage = React.memo( ]} /> )} - {/* Show error state if image failed to load */} {hasError && ( )} - {/* Actual image */} { // 创建动画值 const shimmerAnim = useRef(new Animated.Value(0)).current; - // 设置动画效果 useEffect(() => { const shimmerAnimation = Animated.loop( @@ -144,20 +136,16 @@ const ProductSkeleton = React.memo(() => { useNativeDriver: true, }) ); - shimmerAnimation.start(); - return () => { shimmerAnimation.stop(); }; }, []); - // 定义动画插值 const shimmerTranslate = shimmerAnim.interpolate({ inputRange: [0, 1], outputRange: [-200, 200], }); - return ( @@ -219,7 +207,6 @@ const ProductSkeleton = React.memo(() => { ); }); - // Define the styles type to fix TypeScript errors type StylesType = { safeArea: ViewStyle; @@ -273,6 +260,7 @@ type StylesType = { productCardList: ViewStyle; productCardGroup: ViewStyle; beautyProductCard1: ViewStyle; + productCardGroup1: ViewStyle; beautyCardContainer1: ViewStyle; vipButtonContainer: ViewStyle; vipButton: ViewStyle; @@ -308,7 +296,6 @@ type StylesType = { imagePickerCancelButton: ViewStyle; imagePickerCancelText: TextStyle; }; - export const HomeScreen = () => { const [activeIndex, setActiveIndex] = useState(0); const screenWidth = Dimensions.get("window").width; @@ -339,7 +326,6 @@ export const HomeScreen = () => { const [galleryUsed, setGalleryUsed] = useState(false); const [hotTerms, setHotTerms] = useState([]); const [isLoadingHotTerms, setIsLoadingHotTerms] = useState(false); - // 直接在组件中实现分页加载逻辑 const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); @@ -537,7 +523,6 @@ export const HomeScreen = () => { setRefreshing(false); } }, [hotTerms, getRandomKeyword, fetchInitialProducts]); - const handleProductPress = useCallback( (item: Product) => { InteractionManager.runAfterInteractions(() => { @@ -550,7 +535,6 @@ export const HomeScreen = () => { }, [navigation] ); - const categories = [ "Tous", "Bijoux", @@ -564,7 +548,6 @@ export const HomeScreen = () => { "Hygiène et Soins pour le corps", "Maquillage", ]; - const defaultSubcategories: SubcategoryItem[] = [ { id: 1, title: "Jewelry", icon: "diamond-outline" }, { id: 2, title: "Earrings", icon: "ear-outline" }, @@ -573,7 +556,6 @@ export const HomeScreen = () => { { id: 5, title: "Earrings", icon: "ear-outline" }, { id: 6, title: "Bracelet", icon: "watch-outline" }, ]; - const categoryContent: CategoryContentType = { Tous: [], Bijoux: defaultSubcategories, @@ -587,31 +569,26 @@ export const HomeScreen = () => { "Hygiène et Soins pour le corps": defaultSubcategories, Maquillage: defaultSubcategories, }; - useEffect(() => { if (!categoryContent[selectedHorizontalCategory]) { setSelectedHorizontalCategory("Tous"); } }, [selectedHorizontalCategory]); - const navigateToSearch = useCallback(() => { InteractionManager.runAfterInteractions(() => { navigation.navigate("Search"); }); }, [navigation]); - const navigateToShippingDetails = useCallback(() => { InteractionManager.runAfterInteractions(() => { navigation.navigate("ShippingDetailsSection"); }); }, [navigation]); - const navigateToInquiry = useCallback(() => { InteractionManager.runAfterInteractions(() => { navigation.navigate("InquiryScreen"); }); }, [navigation]); - const scrollToCategory = (category: string) => { const categoryIndex = categories.findIndex((c) => c === category); if (categoryIndex !== -1 && horizontalScrollRef.current) { @@ -626,7 +603,6 @@ export const HomeScreen = () => { }); } }; - const renderProductItem = ({ item }: { item: Product }) => ( handleProductPress(item)} @@ -645,7 +621,6 @@ export const HomeScreen = () => { )} - {userStore.user?.user_id && ( @@ -677,7 +652,6 @@ export const HomeScreen = () => { ); - const renderSkeletonGrid = useCallback(() => { const skeletonArray = Array(8).fill(null); return ( @@ -694,7 +668,6 @@ export const HomeScreen = () => { ); }, []); - const cleanupImagePickerCache = async () => { try { if (Platform.OS === 'web') { @@ -712,7 +685,6 @@ export const HomeScreen = () => { setGalleryUsed(false); } }; - const handleChooseFromGallery = useCallback(async () => { setShowImagePickerModal(false); setTimeout(async () => { @@ -722,14 +694,12 @@ export const HomeScreen = () => { console.log("相册权限被拒绝"); return; } - const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, aspect: [4, 3], quality: 1, }); - if (!result.canceled && result.assets && result.assets.length > 0) { await cleanupImagePickerCache(); navigation.navigate("ImageSearchResultScreen", { @@ -743,7 +713,6 @@ export const HomeScreen = () => { } }, 500); }, []); - const handleTakePhoto = useCallback(async () => { setShowImagePickerModal(false); setTimeout(async () => { @@ -753,14 +722,12 @@ export const HomeScreen = () => { console.log("相机权限被拒绝"); return; } - const result = await ImagePicker.launchCameraAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, aspect: [4, 3], quality: 1, }); - if (!result.canceled && result.assets && result.assets.length > 0) { await cleanupImagePickerCache(); navigation.navigate("ImageSearchResultScreen", { @@ -774,25 +741,21 @@ export const HomeScreen = () => { } }, 500); }, []); - const resetAppState = useCallback(() => { setGalleryUsed(false); cleanupImagePickerCache(); Alert.alert("已重置", "现在您可以使用相机功能了"); }, []); - // 优化轮播图切换回调 const handleCarouselSnap = useCallback((index: number) => { setActiveIndex(index); }, []); - const renderItem = ({ item, index }: { item: Product; index: number }) => { if (index >= products.length && index < products.length + loadingPlaceholders) { return ; } return renderProductItem({ item }); }; - const renderHeader = useCallback(() => ( <> @@ -962,7 +925,6 @@ export const HomeScreen = () => { ) : null} ), [activeIndex, selectedHorizontalCategory]); - return ( @@ -1179,7 +1141,7 @@ export const HomeScreen = () => { const rightItem = allItems[i + 1]; rows.push( - + {/* 左侧商品 */} {leftItem ? ( i >= products.length ? ( @@ -1216,7 +1178,6 @@ export const HomeScreen = () => { )} - { - { 重置相机功能 )} - - { {t("homePage.chooseFromGallery")} - - setShowImagePickerModal(false)} @@ -1615,6 +1571,11 @@ const styles = StyleSheet.create({ marginBottom: 15, paddingHorizontal: 15, }, + productCardGroup1:{ + flexDirection: "row", + justifyContent: "space-between", + marginBottom: 15, + }, beautyProductCard1: { width: "48%", }, diff --git a/app/utils/languageUtils.ts b/app/utils/languageUtils.ts index 5dab337..9342fbc 100644 --- a/app/utils/languageUtils.ts +++ b/app/utils/languageUtils.ts @@ -55,3 +55,31 @@ export const getSkuTransLanguage = >(data: T): str // 返回匹配的翻译值,如果没有匹配则返回法语 return (data[matchedField || 'value_trans'] as string) || ''; }; + + + +export const getOrderTransLanguage = >(data: T): string => { + // 获取当前i18n语言 + const currentLang = getCurrentLanguage(); + + // 特殊处理中文 + if (currentLang === 'zh' && 'value' in data) { + return data.value as string; + } + + // 获取所有subject_trans开头的字段 + const translationFields = Object.keys(data).filter(key => + key.startsWith('product_name') + ); + + // 查找匹配的字段 + const matchedField = translationFields.find(field => { + // 从字段名中提取语言代码 + const langCode = field.replace('product_name', ''); + // 如果没有后缀,则为法语 + return langCode === '' ? currentLang === 'fr' : langCode === currentLang; + }); + + // 返回匹配的翻译值,如果没有匹配则返回法语 + return (data[matchedField || 'product_name'] as string) || ''; +};