import { View, StyleSheet, Text, ScrollView, TouchableOpacity, Image, ActivityIndicator, } from "react-native"; import { useRoute, RouteProp } from "@react-navigation/native"; import { productStatus } from "../../constants/productStatus"; import BackIcon from "../../components/BackIcon"; import MassageIcon from "../../components/MassageIcon"; import { useEffect, useState, useRef } from "react"; import fontSize from "../../utils/fontsizeUtils"; import widthUtils from "../../utils/widthUtils"; import { ordersApi, PaginatedOrderResponse, PaginatedOrderRequest, } from "../../services/api/orders"; import { useNavigation } from "@react-navigation/native"; import { NativeStackNavigationProp } from "@react-navigation/native-stack"; // import ImageView from "react-native-image-viewing"; type StatusScreenRouteProp = RouteProp< { Status: { status: number }; }, "Status" >; export function Status() { const navigation = useNavigation>(); const route = useRoute(); const [statusList, setStatusList] = useState(() => { const initialList = [...productStatus]; initialList.unshift({ text: "全部", status: null, icon: BackIcon, }); return initialList; }); const [status, setStatus] = useState(null); const [orderList, setOrderList] = useState(); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [imageViewerVisible, setImageViewerVisible] = useState(false); const [currentImageIndex, setCurrentImageIndex] = useState(0); const [images, setImages] = useState([]); const statusScrollViewRef = useRef(null); const statusItemRef = useRef>(null); const getAllOrders = async () => { setLoading(true); try { const data = { page: page, page_size: pageSize, }; const response = await ordersApi.getAllOrders(data); setOrderList((prev) => ({ ...response, items: page === 1 ? response.items : [...(prev?.items || []), ...response.items], })); setTotal(response.total); } finally { setLoading(false); } }; const scrollToStatus = () => { const itemIndex = statusList.findIndex( (item) => item.status === route.params.status ); console.log(itemIndex); statusItemRef.current?.measure((x, y, width, height, pageX, pageY) => { if (width) { statusScrollViewRef.current?.scrollTo({ x: width * (itemIndex - 1), animated: true, }); } }); }; useEffect(() => { setStatus(route.params.status); scrollToStatus(); setPage(1); getAllOrders(); }, []); const getStatus = (status: number) => { return status === 0 ? "待付款" : status === 1 ? "待发货" : status === 2 ? "待收货" : status === 3 ? "已完成" : status === 4 ? "已取消" : status === 5 ? "已退款" : "未知状态"; }; // const handleImagePress = (imageUrl: string) => { // setImages([imageUrl]); // setCurrentImageIndex(0); // setImageViewerVisible(true); // }; const changeStatus = async (status: number) => { setLoading(true); setPage(1); const data: PaginatedOrderRequest = { page: page, page_size: pageSize, }; if (status) { data.status = status; } try { const response = await ordersApi.getAllOrders(data); setOrderList((prev) => ({ ...response, items: page === 1 ? response.items : [...(prev?.items || []), ...response.items], })); // 滚动状态列表到选中项 } finally { setLoading(false); } }; const handleOrderDetailsPress = (orderId: number) => { navigation.navigate("OrderDetails", { orderId }); }; return ( navigation.goBack()}> 订单状态 {statusList.map((item, index) => ( { setStatus(item.status as number); changeStatus(item.status as number); }} > {item.text} ))} {loading && page === 1 ? ( ) : ( { const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent; const isAtBottom = contentOffset.y + layoutMeasurement.height >= contentSize.height; if (isAtBottom) { setLoading(true); setPage(page + 1); getAllOrders(); } }} > {orderList?.items.map((item, index) => ( {item.order_id} {getStatus(item.order_status)} {item.items.map((item, index) => ( {item.product_name} {item.sku_attributes?.map((attr, index) => ( {attr.attribute_name}:{attr.attribute_value} ))} ))} 商品总价: {item.actual_amount} handleOrderDetailsPress(item.order_id)} > View Details ))} {loading && page > 1 && ( )} )} {/* ({ uri }))} imageIndex={currentImageIndex} visible={imageViewerVisible} onRequestClose={() => setImageViewerVisible(false)} swipeToCloseEnabled={true} doubleTapToZoomEnabled={true} /> */} ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: "#f3f3f3", }, statusHeader: { width: "100%", backgroundColor: "white", padding: 16, justifyContent: "space-between", flexDirection: "row", alignItems: "center", }, statusTitle: { fontSize: fontSize(16), fontWeight: "600", }, statusList: { width: "100%", borderTopWidth: 1, borderColor: "#f5f5f5", }, statusListScr: { width: "100%", }, statusItem: { width: widthUtils(100,100).width, padding: 16, backgroundColor: "white", }, statusItemText: { fontSize: fontSize(16), textAlign: "center", }, statusItemTextActive: { color: "#f77f3a", borderBottomWidth: 1, borderColor: "#f77f3a", }, statusItemActive: { borderBottomWidth: 2, borderColor: "#f77f3a", }, statusItemActiveText: { color: "#f77f3a", }, orderContent: { padding: 20, flex: 1, }, orderItem: { width: "100%", backgroundColor: "white", borderRadius: 10, marginBottom: 10, }, orderStatus: { width: "100%", padding: 10, borderBottomWidth: 1, flexDirection: "row", borderColor: "#f5f5f5", justifyContent: "space-between", }, orderStatusOrderText: { fontSize: fontSize(16), fontWeight: "600", }, orderStatusText: { color: "#f77f3a", }, orderProductList: { width: "100%", padding: 10, }, orderProductItem: { flexDirection: "row", paddingBottom: 10, paddingTop: 10, borderBottomWidth: 1, borderColor: "#f5f5f5", }, orderProductItemImage: { width: widthUtils(30,30).width, height: widthUtils(30,30).height, marginRight: 10, }, orderProductItemInfo: { flex: 1, }, orderProductItemInfoName: { fontSize: fontSize(16), fontWeight: "600", }, orderProductItemInfoPrice: { fontSize: fontSize(14), color: "#666", }, orderProductPrice: { padding: 10, flexDirection: "row", justifyContent: "space-between", }, orderProductView: { padding: 5, borderRadius: 8, borderWidth: 1, borderColor: "#f77f3a", }, orderProductViewText: { color: "#f77f3a", fontSize: fontSize(14), }, orderProductPriceText: { fontSize: fontSize(16), fontWeight: "600", color: "#f77f3a", }, orderProductTotalText: { fontSize: fontSize(16), fontWeight: "600", }, orderProductPriceItem: { flexDirection: "row", }, loadingContainer: { flex: 1, justifyContent: "center", alignItems: "center", }, loadingMoreContainer: { paddingVertical: 10, alignItems: "center", }, });