fix(mini-user): polish logistics detail page layout and timeline order (v3.4.13)
Use custom navigation bar, remove delivery status section, and show newest track nodes first. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -46,9 +46,20 @@ export function formatTrackNodeTime(node: OrderTrackNode) {
|
||||
return formatShanghaiDateTime(node.createTime || node.createdAt);
|
||||
}
|
||||
|
||||
export function sortTrackNodesNewestFirst(nodes: OrderTrackNode[]): OrderTrackNode[] {
|
||||
return [...nodes].sort((a, b) => {
|
||||
const ta = new Date(a.createTime || a.createdAt || 0).getTime();
|
||||
const tb = new Date(b.createTime || b.createdAt || 0).getTime();
|
||||
if (Number.isNaN(ta) && Number.isNaN(tb)) return 0;
|
||||
if (Number.isNaN(ta)) return 1;
|
||||
if (Number.isNaN(tb)) return -1;
|
||||
return tb - ta;
|
||||
});
|
||||
}
|
||||
|
||||
export function latestTrackNode(nodes: OrderTrackNode[]) {
|
||||
if (nodes.length === 0) return null;
|
||||
return nodes[0];
|
||||
const sorted = sortTrackNodesNewestFirst(nodes);
|
||||
return sorted[0] ?? null;
|
||||
}
|
||||
|
||||
export async function fetchOrderTrack(orderId: string) {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
export default definePageConfig({
|
||||
navigationBarTitleText: '物流追踪',
|
||||
navigationStyle: 'custom',
|
||||
navigationBarTitleText: '物流详情',
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { View, Text } from '@tarojs/components';
|
||||
import Taro, { useRouter } from '@tarojs/taro';
|
||||
import PageShell from '../../components/PageShell';
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
fetchOrderTrack,
|
||||
formatTrackNodeTime,
|
||||
shouldLoadOrderTrack,
|
||||
sortTrackNodesNewestFirst,
|
||||
type OrderDelivery,
|
||||
type OrderTrackNode,
|
||||
} from '../../lib/order-logistics';
|
||||
@@ -21,16 +22,6 @@ type OrderDetail = {
|
||||
delivery?: OrderDelivery | null;
|
||||
};
|
||||
|
||||
const STATUS_LABELS: Record<string, string> = {
|
||||
PENDING_SHIP: '待发货',
|
||||
OUT_WAREHOUSE: '出库中',
|
||||
SHIPPING: '配送中',
|
||||
SHIPPED: '配送中',
|
||||
PENDING_RECEIVE: '待签收',
|
||||
DELIVERED: '待签收',
|
||||
COMPLETED: '已完成',
|
||||
};
|
||||
|
||||
export default function OrderLogisticsPage() {
|
||||
const router = useRouter();
|
||||
const orderId = router.params.id ?? '';
|
||||
@@ -39,6 +30,8 @@ export default function OrderLogisticsPage() {
|
||||
const [trackNodes, setTrackNodes] = useState<OrderTrackNode[]>([]);
|
||||
const [trackLoading, setTrackLoading] = useState(false);
|
||||
|
||||
const sortedTrackNodes = useMemo(() => sortTrackNodesNewestFirst(trackNodes), [trackNodes]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!orderId) return;
|
||||
let cancelled = false;
|
||||
@@ -89,19 +82,12 @@ export default function OrderLogisticsPage() {
|
||||
return (
|
||||
<PageShell variant="sub" className="order-logistics-page">
|
||||
<SubPageHeader title="物流详情" />
|
||||
<View className="sub-page-body">
|
||||
<View className="sub-page-body order-logistics-body">
|
||||
{!order ? (
|
||||
<View className="u-empty">加载中…</View>
|
||||
) : (
|
||||
<>
|
||||
<View className="order-card">
|
||||
<Text className="order-card-title">配送状态</Text>
|
||||
<Text className="order-list-status">
|
||||
{STATUS_LABELS[order.status || ''] || order.status || '处理中'}
|
||||
</Text>
|
||||
</View>
|
||||
|
||||
<View className="order-card">
|
||||
<View className="order-card order-logistics-info-card">
|
||||
<Text className="order-card-title">物流信息</Text>
|
||||
<View className="order-row">
|
||||
<Text className="order-row-label">配送方式</Text>
|
||||
@@ -133,11 +119,11 @@ export default function OrderLogisticsPage() {
|
||||
<Text className="order-card-title">物流动态</Text>
|
||||
<Text className="u-muted">加载中…</Text>
|
||||
</View>
|
||||
) : trackNodes.length > 0 ? (
|
||||
) : sortedTrackNodes.length > 0 ? (
|
||||
<View className="order-card">
|
||||
<Text className="order-card-title">物流动态</Text>
|
||||
<View className="order-logistics-timeline">
|
||||
{trackNodes.map((node, index) => (
|
||||
{sortedTrackNodes.map((node, index) => (
|
||||
<View
|
||||
key={`${node.trackInfo}-${node.createTime}-${index}`}
|
||||
className={`order-logistics-timeline-item${index === 0 ? ' order-logistics-timeline-item--latest' : ''}`}
|
||||
|
||||
@@ -494,6 +494,14 @@
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.order-logistics-body {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.order-logistics-info-card {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.order-logistics-link {
|
||||
display: inline-block;
|
||||
margin-top: 8px;
|
||||
|
||||
Reference in New Issue
Block a user