import React, { useState, useEffect } from "react"; import { View, Text, TextInput, TouchableOpacity, ScrollView, Modal, Switch, StyleSheet, Platform, } from "react-native"; import { Picker } from "@react-native-picker/picker"; import { AddressItem, addressApi } from "../../services/api/addressApi"; import { useNavigation } from "@react-navigation/native"; import { NativeStackNavigationProp } from "@react-navigation/native-stack"; export function Recipient() { const navigation = useNavigation>(); const [showModal, setShowModal] = useState(false); const [formData, setFormData] = useState({ firstName: "", lastName: "", phone: "", whatsapp: "", sameAsPhone: false, setDefault: false, }); const [shippingMethod, setShippingMethod] = useState(null); const [warehouse, setWarehouse] = useState(""); const [arrival, setArrival] = useState("-"); const [shippingFee, setShippingFee] = useState("-"); const [address, setAddress] = useState([]); const getAddress = async () => { const response = await addressApi.getAddress(); setAddress(response.items); }; useEffect(() => { getAddress(); },[]); const shippingData = { sea: { abidjan: { days: "20–25 days", fee: "$20.00" }, nairobi: { days: "25–30 days", fee: "$22.00" }, lagos: { days: "30–35 days", fee: "$25.00" }, accra: { days: "28–33 days", fee: "$23.50" }, johannesburg: { days: "35–45 days", fee: "$30.00" }, dakar: { days: "30–40 days", fee: "$27.00" }, }, air: { abidjan: { days: "3–5 days", fee: "$40.00" }, nairobi: { days: "5–7 days", fee: "$45.00" }, lagos: { days: "6–8 days", fee: "$50.00" }, accra: { days: "5–7 days", fee: "$48.00" }, johannesburg: { days: "7–9 days", fee: "$55.00" }, dakar: { days: "6–8 days", fee: "$52.00" }, }, }; const [paymentMethod, setPaymentMethod] = useState(null); const [currency, setCurrency] = useState("usd"); const [actualPayment, setActualPayment] = useState(null); const [mobileNumber, setMobileNumber] = useState(""); const [countryCode, setCountryCode] = useState("225"); const balance = 245.0; const exchangeRates = { usd: 1, eur: 0.885 }; const updateShippingInfo = (method, location) => { if (method && location && shippingData[method]?.[location]) { setArrival(shippingData[method][location].days); setShippingFee(shippingData[method][location].fee); } else { setArrival("-"); setShippingFee("-"); } }; const handleInput = (key, value) => { setFormData((prev) => ({ ...prev, [key]: value })); }; const handleSameAsPhone = (value) => { setFormData((prev) => ({ ...prev, sameAsPhone: value, whatsapp: value ? prev.phone : "", })); }; const handleSubmit = () => { if ( !formData.firstName || !formData.lastName || !formData.phone || !formData.whatsapp ) { alert("Please fill all required fields"); return; } setShowModal(false); }; const getOrderAmount = () => { // 模拟总金额,可加入实际订单计算逻辑 const baseAmount = parseFloat(shippingFee.replace("$", "")) || 0; return 100 + baseAmount; // 示例:商品 $100 + 运费 }; const updateActualPayment = (method, selectedCurrency = currency) => { const amount = getOrderAmount(); let finalAmount = amount; let display = ""; if (method === "balance") { display = balance >= amount ? "$0.00 (使用余额支付)" : `$${(amount - balance).toFixed(2)} (余额不足)`; } else if (method === "paypal") { const rate = exchangeRates[selectedCurrency]; const converted = (amount * rate).toFixed(2); const symbol = selectedCurrency === "usd" ? "$" : "€"; display = `${symbol}${converted}`; } else if (method === "mobile_money") { display = `$${amount.toFixed(2)} (FCFA ${(amount * 580).toFixed(0)})`; } else { display = `$${amount.toFixed(2)}`; } setActualPayment(display); }; const [couponModalVisible, setCouponModalVisible] = useState(false); const [appliedCoupons, setAppliedCoupons] = useState([]); const [orderTotal, setOrderTotal] = useState(121.97); const [originalTotal] = useState(121.97); const [subtotal] = useState(96.47); const [domesticShipping] = useState(25.5); const [internationalShipping] = useState(45.0); const validCoupons = { WELCOME10: { discount: 10, type: "percent", name: "Welcome 10% Off" }, SAVE20: { discount: 20, type: "fixed", name: "$20 Off" }, FREESHIP: { discount: 25.5, type: "fixed", name: "Free Domestic Shipping" }, }; const addCoupon = (code) => { if (appliedCoupons.find((c) => c.code === code)) { alert("This coupon is already applied."); return; } const couponInfo = validCoupons[code]; const newCoupons = [ ...appliedCoupons, { code: code, name: couponInfo.name, discount: couponInfo.discount, type: couponInfo.type, }, ]; setAppliedCoupons(newCoupons); updateTotalWithDiscounts(newCoupons); }; const removeCoupon = (code) => { const newCoupons = appliedCoupons.filter((c) => c.code !== code); setAppliedCoupons(newCoupons); updateTotalWithDiscounts(newCoupons); }; const updateTotalWithDiscounts = (coupons) => { let totalDiscount = 0; coupons.forEach((coupon) => { if (coupon.type === "percent") { totalDiscount += (subtotal * coupon.discount) / 100; } else { totalDiscount += coupon.discount; } }); totalDiscount = Math.min(totalDiscount, subtotal + domesticShipping); const newTotal = originalTotal - totalDiscount; setOrderTotal(newTotal); }; const isCouponApplied = (code) => { return appliedCoupons.some((c) => c.code === code); }; // 判断有没有地址 const addRessHandel = () => { if (address.length !== 0) { setShowModal(true) }else{ navigation.navigate("AddRess") } } const [expanded, setExpanded] = useState(false); const [orderItems] = useState([ { id: 1, name: "Wireless Bluetooth Speaker Portable Outdoor Mini", variant: "Color: Black | Size: Medium", quantity: 1, price: 29.99, shipping: 8.5, image: null, }, { id: 2, name: "Wireless Charging Pad for iPhone and Android Devices", variant: "Color: White", quantity: 2, price: 31.98, shipping: 5.0, image: null, }, { id: 3, name: "Kitchen Multifunctional Food Slicer with 8 Blades", variant: "Type: Stainless Steel", quantity: 1, price: 34.5, shipping: 12.0, image: null, }, ]); const toggleExpanded = () => { setExpanded(!expanded); }; return ( {/* Header */} {"←"} Checkout {/* Recipient Info */} {address.length != 0 && ( 👤 Recipient Information alert("Go to manage page")}> Manage )} Add Recipient Information {/* Shipping Method */} 🚢 Shipping Method {[ { id: "sea", label: "Sea Shipping", icon: "🚢", detail: "Economical", }, { id: "air", label: "Air Shipping", icon: "✈️", detail: "Express" }, ].map((option) => ( { setShippingMethod(option.id); updateShippingInfo(option.id, warehouse); // 👈 这就是“再加一句”的地方 }} > {option.icon} {option.label} {option.detail} ))} {/* Warehouse Selection */} 🏭 Delivery Warehouse Select a warehouse: { setWarehouse(value); updateShippingInfo(shippingMethod, value); }} > {arrival !== "-" && ( Estimated Arrival:{" "} {arrival} International Fee:{" "} {shippingFee} (Cash on Delivery) )} 💳 Payment Method {[ { id: "balance", icon: "💰", label: "Account Balance" }, { id: "mobile_money", icon: "📱", label: "Mobile Money" }, { id: "paypal", icon: "🅿️", label: "PayPal" }, { id: "card", icon: "💳", label: "Credit/Debit Card" }, ].map((option) => ( { setPaymentMethod(option.id); updateActualPayment(option.id); }} > {option.icon} {option.label} ))} {/* Mobile Money 表单 */} {paymentMethod === "mobile_money" && ( Mobile Number { const next = countryCode === "225" ? "234" : countryCode === "234" ? "233" : "225"; setCountryCode(next); }} > {countryCode} )} {/* PayPal Currency 切换 */} {paymentMethod === "paypal" && ( Select Currency {["usd", "eur"].map((cur) => ( { setCurrency(cur); updateActualPayment("paypal", cur); }} style={[ styles.currencyButton, currency === cur && styles.currencyButtonSelected, ]} > {cur.toUpperCase()} ))} )} 📦 Coupons Order Summary Products(3 items) {expanded ? "Hide Details" : "View Details"} {orderItems.map((item) => ( {item.image ? ( ) : ( )} {item.name} {item.variant} Qty: {item.quantity} ${item.price.toFixed(2)} +${item.shipping.toFixed(2)} domestic Supplier to warehouse shipping ))} 🎟️ Coupons setCouponModalVisible(true)}> Select {appliedCoupons.length === 0 ? ( No coupons applied. Click "Select" to browse available coupons. ) : null} {appliedCoupons.map((coupon) => ( {coupon.name} {coupon.type === "percent" ? `${coupon.discount}% Off` : `$${coupon.discount.toFixed(2)} Off`} removeCoupon(coupon.code)}> × ))} Subtotal $231.00 Domestic Shipping $231.00 Estimated International Shipping $231.00 {/* 实际支付金额 */} {actualPayment && ( Actual Payment: {actualPayment} )} {/* Coupon Modal */} setCouponModalVisible(false)} > Available Coupons setCouponModalVisible(false)} > × Welcome 10% Off 10% off your total order Valid until: 31/12/2023 addCoupon("WELCOME10")} disabled={isCouponApplied("WELCOME10")} > {isCouponApplied("WELCOME10") ? "Used" : "Use"} $20 Off $20 off your order over $100 Valid until: 30/11/2023 addCoupon("SAVE20")} disabled={isCouponApplied("SAVE20")} > {isCouponApplied("SAVE20") ? "Used" : "Use"} Free Domestic Shipping Free domestic shipping on your order Valid until: 15/12/2023 addCoupon("FREESHIP")} disabled={isCouponApplied("FREESHIP")} > {isCouponApplied("FREESHIP") ? "Used" : "Use"} {/* Modal 表单 */} setShowModal(false)}> 新增收件人 {["First Name", "Last Name"].map((label, index) => ( {label} * handleInput( label === "First Name" ? "firstName" : "lastName", text ) } /> ))} Phone Number * handleInput("phone", text)} /> WhatsApp * handleInput("whatsapp", text)} /> 与我的号码一样 Set as default handleInput("setDefault", value)} /> Confirmer ); } const styles = StyleSheet.create({ container: { backgroundColor: "#f8f9fa", flex: 1 }, header: { flexDirection: "row", alignItems: "center", padding: 16, backgroundColor: "#fff", elevation: 3, }, back: { fontSize: 20, marginRight: 16 }, title: { fontSize: 18, fontWeight: "500", flex: 1, textAlign: "center" }, section: { backgroundColor: "#fff", borderRadius: 8, padding: 16, }, sectionHeader: { flexDirection: "row", alignItems: "center", paddingTop: 12, paddingBottom: 12, }, sectionIcon: { marginRight: 8, fontSize: 18 }, sectionTitle: { flex: 1, fontSize: 15, fontWeight: "500" }, sectionAction: { color: "#ff6000", fontSize: 13, fontWeight: "500" }, addRecipient: { borderWidth: 1, borderColor: "#ccc", padding: 12, borderRadius: 6, flexDirection: "row", justifyContent: "center", alignItems: "center", backgroundColor: "#fafafa", }, addRecipientIcon: { fontSize: 20, color: "#ff6000", marginRight: 6 }, addRecipientText: { fontSize: 14, color: "#666" }, shippingOptions: { flexDirection: "row", gap: 10, justifyContent: "space-between", marginTop: 12, }, shippingCard: { flex: 1, alignItems: "center", padding: 12, borderRadius: 6, borderWidth: 1, borderColor: "#e0e0e0", backgroundColor: "#fff", }, shippingCardSelected: { borderColor: "#ff6000", backgroundColor: "#fff8f3" }, shippingIcon: { fontSize: 22, marginBottom: 6 }, shippingLabel: { fontSize: 14, fontWeight: "500" }, shippingDetail: { fontSize: 12, color: "#888", marginTop: 3 }, selectBox: { marginBottom: 12 }, selectLabel: { fontSize: 14, marginBottom: 6, color: "#666" }, selectWrapper: { borderWidth: 1, borderColor: "#ddd", borderRadius: 6, overflow: "hidden", backgroundColor: "#fff", }, shippingInfo: { marginTop: 12, padding: 12, backgroundColor: "#f9f9f9", borderRadius: 6, }, shippingInfoRow: { fontSize: 13, marginBottom: 6, color: "#333" }, shippingInfoLabel: { color: "#777", fontWeight: "500" }, modalOverlay: { flex: 1, justifyContent: "center", alignItems: "center", backgroundColor: "rgba(0,0,0,0.5)", }, formContainer: { width: "90%", maxHeight: "90%", backgroundColor: "#fff", borderRadius: 12, overflow: "hidden", }, formHeader: { flexDirection: "row", alignItems: "center", padding: 16, borderBottomWidth: 1, borderColor: "#eee", }, closeButton: { fontSize: 20, color: "#555" }, formTitle: { flex: 1, fontSize: 16, fontWeight: "500", textAlign: "center" }, formBody: { padding: 16 }, formGroup: { marginBottom: 16 }, formLabel: { marginBottom: 6, fontSize: 14, color: "#666" }, input: { borderWidth: 1, borderColor: "#ddd", borderRadius: 6, padding: 12, fontSize: 14, backgroundColor: "#fff", }, checkboxRow: { flexDirection: "row", alignItems: "center", marginTop: 8 }, checkboxLabel: { marginLeft: 8, fontSize: 13, color: "#666" }, switchRow: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", marginTop: 10, }, formFooter: { padding: 16, borderTopWidth: 1, borderColor: "#eee" }, confirmButton: { backgroundColor: "#0945b5", borderRadius: 6, padding: 14 }, confirmText: { color: "#fff", textAlign: "center", fontSize: 15, fontWeight: "500", }, paymentOption: { flexDirection: "row", alignItems: "center", borderWidth: 1, borderColor: "#ddd", padding: 12, borderRadius: 6, marginTop: 10, }, paymentSelected: { borderColor: "#ff6000", backgroundColor: "#fff8f3", }, paymentIcon: { fontSize: 20, marginRight: 10 }, paymentLabel: { fontSize: 14, fontWeight: "500" }, mobileForm: { marginTop: 12 }, countryCode: { paddingVertical: 12, paddingHorizontal: 14, backgroundColor: "#f0f0f0", borderRadius: 6, borderWidth: 1, borderColor: "#ccc", }, currencyButton: { flex: 1, paddingVertical: 10, alignItems: "center", borderWidth: 1, borderColor: "#ccc", borderRadius: 6, marginRight: 10, backgroundColor: "#fff", }, currencyButtonSelected: { borderColor: "#ff6000", backgroundColor: "#fff8f3", }, actualPaymentBox: { marginTop: 16, padding: 12, backgroundColor: "#f9f9f9", borderRadius: 6, alignItems: "center", }, section1: { backgroundColor: "#fff", borderRadius: 8, overflow: "hidden", ...Platform.select({ ios: { shadowColor: "#000", shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.03, shadowRadius: 3, }, android: { elevation: 1, }, }), }, sectionHeader1: { flexDirection: "row", alignItems: "center", paddingTop: 12, paddingBottom: 12, borderBottomWidth: 1, borderBottomColor: "#f5f5f5", }, sectionIcon1: { fontSize: 18, marginRight: 10, color: "#666", }, setOrderContent: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", paddingTop: 12, paddingBottom: 12, }, sectionTitle1: { fontSize: 15, fontWeight: "500", flex: 1, }, sectionAction1: { color: "#ff6000", fontSize: 13, fontWeight: "500", }, sectionContent: { paddingTop: 16, paddingBottom: 16, }, noCouponsMessage: { color: "#888", fontSize: 13, marginBottom: 10, }, // Applied coupons styles appliedCoupons: { flexDirection: "row", flexWrap: "wrap", }, couponTag: { flexDirection: "row", alignItems: "center", backgroundColor: "#fff8f3", borderWidth: 1, borderStyle: "dashed", borderColor: "#ff6000", borderRadius: 4, padding: 8, marginRight: 10, marginBottom: 10, }, couponTagName: { color: "#ff6000", fontWeight: "500", marginRight: 8, fontSize: 13, }, couponTagDiscount: { color: "#ff6000", fontSize: 13, }, couponDelete: { color: "#777", fontSize: 16, marginLeft: 8, }, // Coupon modal styles couponModal: { flex: 1, backgroundColor: "rgba(0, 0, 0, 0.5)", justifyContent: "center", alignItems: "center", }, couponModalContainer: { backgroundColor: "#fff", width: "90%", maxHeight: "80%", borderRadius: 12, overflow: "hidden", }, couponModalHeader: { padding: 15, flexDirection: "row", alignItems: "center", justifyContent: "space-between", borderBottomWidth: 1, borderBottomColor: "#f0f0f0", }, couponModalTitle: { fontSize: 16, fontWeight: "500", }, couponModalClose: { fontSize: 20, color: "#777", }, couponModalBody: { padding: 15, }, // Available coupons styles availableCoupons: { gap: 12, }, couponCard: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", padding: 12, backgroundColor: "#fff8f3", borderWidth: 1, borderStyle: "dashed", borderColor: "#ff6000", borderRadius: 8, }, couponInfo: { flex: 1, }, couponName: { fontWeight: "500", color: "#ff6000", fontSize: 15, marginBottom: 3, }, couponDiscount: { fontSize: 13, color: "#666", }, couponExpiry: { fontSize: 11, color: "#999", marginTop: 4, }, couponUseBtn: { backgroundColor: "#ff6000", paddingVertical: 6, paddingHorizontal: 16, borderRadius: 4, fontWeight: "500", marginLeft: 10, }, couponUsedBtn: { backgroundColor: "#ccc", }, couponUseBtnText: { color: "white", fontSize: 13, fontWeight: "500", }, orderItems: { maxHeight: 0, overflow: "hidden", }, orderItemsExpanded: { maxHeight: 1000, // Arbitrary large number to accommodate all items }, orderItem: { flexDirection: "row", padding: 16, borderBottomWidth: 1, borderBottomColor: "#f5f5f5", }, itemImage: { width: 70, height: 70, borderRadius: 6, marginRight: 12, borderWidth: 1, borderColor: "#eee", }, itemImagePlaceholder: { width: 70, height: 70, borderRadius: 6, marginRight: 12, borderWidth: 1, borderColor: "#eee", backgroundColor: "#f1f1f1", }, itemDetails: { flex: 1, }, itemName: { fontSize: 14, lineHeight: 18, }, itemVariant: { fontSize: 12, color: "#666", backgroundColor: "#f7f7f7", paddingVertical: 3, paddingHorizontal: 6, borderRadius: 4, marginTop: 6, alignSelf: "flex-start", }, itemQuantity: { fontSize: 12, color: "#666", marginTop: 4, }, itemPrices: { alignItems: "flex-end", fontSize: 13, color: "#555", }, itemPrice: { fontWeight: "600", color: "#ff6000", fontSize: 15, marginBottom: 5, }, itemShipping: { fontSize: 12, color: "#777", }, shippingNote: { fontSize: 11, color: "#888", marginTop: 2, fontStyle: "italic", }, priceBox: { borderRadius: 10, }, priceBox1: { justifyContent: "space-between", flexDirection: "row", alignItems: "center", padding: 12, borderBottomWidth: 1, borderBottomColor: "#f5f5f5", }, });