import { Card, CardContent, CardDescription, CardEyebrow, CardHeader, CardTitle } from "@/components/ui/card"; import { EmptyState } from "@/components/ui/empty-state"; import { StatusBadge } from "@/components/ui/status-badge"; import type { AssetViewModel, OrderDetailVM } from "@/lib/types/view-models"; type ReviewImagePanelProps = { error: string | null; isLoading: boolean; order: OrderDetailVM | null; selectedAssetId: number | null; onSelectAsset: (assetId: number) => void; }; function joinClasses(...values: Array) { return values.filter(Boolean).join(" "); } function collectAssets(order: OrderDetailVM): AssetViewModel[] { const uniqueAssets = new Map(); if (order.finalAsset) { uniqueAssets.set(order.finalAsset.id, order.finalAsset); } for (const asset of order.assets) { uniqueAssets.set(asset.id, asset); } return Array.from(uniqueAssets.values()); } export function ReviewImagePanel({ error, isLoading, order, selectedAssetId, onSelectAsset, }: ReviewImagePanelProps) { if (isLoading) { return ( 正在加载订单详情与预览资产… ); } if (error) { return (
{error}
); } if (!order) { return ( ); } const assets = collectAssets(order); const selectedAsset = assets.find((asset) => asset.id === selectedAssetId) ?? order.finalAsset ?? assets[0] ?? null; const emptyStateTitle = order.finalAssetState.kind === "business-empty" ? order.finalAssetState.title : "暂无可用预览"; const emptyStateDescription = order.finalAssetState.kind === "business-empty" ? order.finalAssetState.description : "当前订单还没有能用于审核的结果图或过程资产。"; return (
Review target
订单 #{order.orderId} 当前服务模式为 {order.serviceMode},步骤停留在 {order.currentStepLabel}。
{selectedAsset ? (

{selectedAsset.isMock ? "Mock preview asset" : "Preview asset"}

{selectedAsset.label}

当前阶段优先保证审核流程可用,因此预览面板直接展示资产信息卡;真实图片 URI 可在后续 Task 7 的详情页复用。

{selectedAsset.uri}
) : ( )} {order.hasMockAssets ? (
当前订单包含 mock 资产,审核结论仅用于前后台联调,不代表真实生产结果。
) : null} {assets.length ? (
{assets.map((asset) => { const isSelected = asset.id === selectedAsset?.id; return ( ); })}
) : null}
); }