import React, { useState, useEffect } from "react";
import {
View,
Text,
TouchableOpacity,
StyleSheet,
ScrollView,
Image,
Alert,
ActivityIndicator,
} from "react-native";
import { payApi, PaymentMethodsResponse } from "../../services/api/payApi";
import fontSize from "../../utils/fontsizeUtils";
import BackIcon from "../../components/BackIcon";
import { useNavigation } from "@react-navigation/native";
import widthUtils from "../../utils/widthUtils";
import useOrderStore from "../../store/order";
import useCreateOrderStore from "../../store/createOrder";
import { useRoute, RouteProp } from "@react-navigation/native";
import useUserStore from "../../store/user";
import {
ordersApi,
OrderData,
AddressDataItem,
DomesticShippingFeeData,
} from "../../services/api/orders";
// Define route params type
type PaymentMethodRouteParams = {
countryCode?: string;
};
interface PaymentOption {
id: string;
label: string;
icon: string;
value?: string | string[];
}
interface PaymentTab {
id: string;
label: string;
options: PaymentOption[];
}
interface PaymentMethodProps {
onSelectPayment?: (paymentMethod: string) => void;
selectedPayment?: string | null;
}
const PaymentMethodItem = ({
option,
isSelected,
onSelect,
}: {
option: PaymentOption;
isSelected: boolean;
onSelect: () => void;
}) => (
{option.icon}
{option.label}
{Array.isArray(option.value) && option.value.length > 0 && (
{option.value.map((op: string) => (
{op}
))}
)}
);
export const PaymentMethod = () => {
const [tabs, setTabs] = useState([
{
id: "online",
label: "Online Payment",
options: [],
},
{
id: "offline",
label: "Offline Payment",
options: [],
},
]);
const [currentTab, setCurrentTab] = useState("online");
const [paymentMethods, setPaymentMethods] =
useState();
const [selectedPayment, setSelectedPayment] = useState(null);
const navigation = useNavigation();
const route =
useRoute, string>>();
const [expanded, setExpanded] = useState(false);
const order = useOrderStore((state) => state.order);
const [previewOrder, setPreviewOrder] = useState();
const [loading, setLoading] = useState(false);
const state = useUserStore();
const { items,orderData } = useCreateOrderStore();
const toggleExpanded = () => {
setExpanded(!expanded);
};
const onSelectPayment = (paymentId: string) => {
setSelectedPayment(paymentId);
};
const getPaymentMethods = async () => {
try {
const response = await payApi.getCountryPaymentMethods();
setPaymentMethods(response);
// 设置默认支付方式选项
setTabs([
{
id: "online",
label: "Online Payment",
options: response.current_country_methods.map((method) => ({
id: method.key,
label: method.key,
icon: getPaymentIcon(method.key),
value: method.value,
})),
},
{
id: "offline",
label: "Offline Payment",
options: [],
},
]);
} catch (error) {
console.error("获取支付方式失败:", error);
}
};
const getPaymentIcon = (key: string): string => {
switch (key) {
case "Brainnel Pay(Mobile Money)":
return "💳";
case "Wave":
return "💸";
case "Paypal":
return "🅿️";
case "Bank Card Payment":
return "💳";
default:
return "💰";
}
};
useEffect(() => {
getPaymentMethods();
}, []);
useEffect(() => {
setLoading(true);
if (route.params?.countryCode) {
const data = {
country_code: route.params.countryCode,
items: items,
};
ordersApi
.getOrders(data)
.then((res) => {
setPreviewOrder(res);
setLoading(false);
})
.catch(() => {
setLoading(false);
Alert.alert("Error", "Failed to get preview order");
});
}
}, [route.params?.countryCode]);
return (
<>
navigation.goBack()}>
Payment Method
{loading ? (
) : (
💳
Payment Method
{/* 选项卡 */}
{tabs.map((tab) => (
setCurrentTab(tab.id)}
>
{tab.label}
))}
{/* 支付选项 */}
{tabs
.find((tab) => tab.id === currentTab)
?.options.map((option) => (
onSelectPayment(option.id)}
/>
))}
{/* Order Summary Section */}
📦
Order Summary
Products({previewOrder?.items?.length || 0} items)
{expanded ? "Hide Details" : "View Details"}
{previewOrder?.items?.map((item) => (
{item.sku_image_url ? (
) : (
)}
{item.product_name}
{item.sku_attributes?.map((attribute) => (
{attribute?.attribute_name}:{" "}
{attribute?.attribute_value}
))}
Qty: {item.quantity}
${item?.total_price}
))}
Subtotal
{previewOrder?.total_amount || 0}
Domestic Shipping
{previewOrder?.shipping_fee || 0}
Estimated International Shipping
{orderData.transport_type === 1 ?previewOrder?.shipping_fee_sea : previewOrder?.shipping_fee_air || 0}
{/* 实际支付金额 */}
Total
${previewOrder?.actual_amount?.toFixed(2)}
)}
>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
},
sectionHeader: {
flexDirection: "row",
alignItems: "center",
marginBottom: 15,
paddingHorizontal: 15,
},
sectionIcon: {
fontSize: fontSize(20),
marginRight: 8,
},
sectionTitle: {
fontSize: fontSize(18),
fontWeight: "600",
color: "#000",
},
tabContainer: {
flexDirection: "row",
marginBottom: 15,
borderBottomWidth: 1,
borderBottomColor: "#EEEEEE",
paddingHorizontal: 15,
},
tabButton: {
paddingVertical: 10,
paddingHorizontal: 15,
marginRight: 10,
},
tabButtonActive: {
borderBottomWidth: 2,
borderBottomColor: "#FF5100",
},
tabText: {
fontSize: fontSize(16),
color: "#666",
},
tabTextActive: {
color: "#FF5100",
fontWeight: "500",
},
paymentOptions: {
marginBottom: 15,
paddingHorizontal: 15,
},
paymentOption: {
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
padding: 15,
backgroundColor: "#F8F8F8",
borderRadius: 8,
marginBottom: 10,
},
paymentSelected: {
backgroundColor: "#FFF0E8",
borderWidth: 1,
borderColor: "#FF5100",
},
paymentContent: {
flex: 1,
},
defaultPaymentContainer: {
flexDirection: "row",
alignItems: "center",
},
paymentIcon: {
fontSize: fontSize(24),
marginRight: 8,
},
paymentLabel: {
fontSize: fontSize(16),
fontWeight: "500",
},
operatorContainer: {
flexDirection: "row",
flexWrap: "wrap",
marginTop: 8,
},
operatorBox: {
backgroundColor: "#EEEEEE",
paddingVertical: 4,
paddingHorizontal: 8,
borderRadius: 4,
marginRight: 8,
marginBottom: 4,
},
operatorText: {
fontSize: fontSize(12),
color: "#666",
},
radioButton: {
width: 20,
height: 20,
borderRadius: 10,
borderWidth: 1,
borderColor: "#CCCCCC",
justifyContent: "center",
alignItems: "center",
},
radioInner: {
width: 12,
height: 12,
borderRadius: 6,
backgroundColor: "transparent",
},
radioInnerSelected: {
backgroundColor: "#FF5100",
},
titleContainer: {
width: "100%",
padding: 15,
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
position: "relative",
marginBottom: 10,
},
backIconContainer: {
position: "absolute",
left: 15,
},
titleHeading: {
fontWeight: "600",
fontSize: 20,
lineHeight: 22,
fontFamily: "PingFang SC",
color: "black",
},
// Order Summary Styles
section: {
backgroundColor: "#fff",
borderRadius: 8,
paddingHorizontal: 15,
marginTop: 15,
},
section1: {
backgroundColor: "#fff",
borderRadius: 8,
overflow: "hidden",
},
sectionHeader1: {
flexDirection: "row",
alignItems: "center",
paddingTop: 12,
paddingBottom: 12,
borderBottomWidth: 1,
borderBottomColor: "#f5f5f5",
},
sectionIcon1: {
fontSize: fontSize(18),
marginRight: 10,
color: "#666",
},
sectionTitle1: {
fontSize: fontSize(15),
fontWeight: "500",
flex: 1,
},
setOrderContent: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
paddingTop: 12,
paddingBottom: 12,
paddingHorizontal: 12,
},
sectionAction: {
color: "#ff6000",
fontSize: fontSize(13),
fontWeight: "500",
},
noCouponsMessage: {
color: "#888",
fontSize: fontSize(13),
},
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: widthUtils(70, 70).width,
height: widthUtils(70, 70).height,
borderRadius: 6,
marginRight: 12,
borderWidth: 1,
borderColor: "#eee",
},
itemImagePlaceholder: {
width: widthUtils(70, 70).width,
height: widthUtils(70, 70).height,
borderRadius: 6,
marginRight: 12,
borderWidth: 1,
borderColor: "#eee",
backgroundColor: "#f1f1f1",
},
itemDetails: {
flex: 1,
},
itemName: {
fontSize: fontSize(14),
lineHeight: 18,
},
itemVariant: {
fontSize: fontSize(12),
color: "#666",
backgroundColor: "#f7f7f7",
paddingVertical: 3,
paddingHorizontal: 6,
borderRadius: 4,
marginTop: 6,
alignSelf: "flex-start",
},
itemQuantity: {
fontSize: fontSize(12),
color: "#666",
marginTop: 4,
},
itemPrices: {
alignItems: "flex-end",
fontSize: fontSize(13),
color: "#555",
},
itemPrice: {
fontWeight: "600",
color: "#ff6000",
fontSize: fontSize(15),
marginBottom: 5,
},
priceBox: {
borderRadius: 10,
marginTop: 15,
paddingHorizontal: 15,
},
priceBox1: {
justifyContent: "space-between",
flexDirection: "row",
alignItems: "center",
padding: 12,
borderBottomWidth: 1,
borderBottomColor: "#f5f5f5",
},
actualPaymentBox: {
padding: 12,
borderRadius: 6,
backgroundColor: "#fff8f4",
marginTop: 15,
marginHorizontal: 15,
marginBottom: 20,
},
actualPaymentBox1: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
},
loadingContainer: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});