fix: parseImages支持数组输入 — Pydantic序列化后images已是数组非字符串
This commit is contained in:
@ -22,7 +22,12 @@ function ArrowRight({ color = "#9ca3af" }: { color?: string }) {
|
|||||||
function ArrowLeft({ color = "#9ca3af" }: { color?: string }) {
|
function ArrowLeft({ color = "#9ca3af" }: { color?: string }) {
|
||||||
return <svg className="h-3 w-3 shrink-0" viewBox="0 0 8 8"><polygon points="8,0 0,4 8,8" fill={color} /></svg>;
|
return <svg className="h-3 w-3 shrink-0" viewBox="0 0 8 8"><polygon points="8,0 0,4 8,8" fill={color} /></svg>;
|
||||||
}
|
}
|
||||||
function parseImages(s: string | null | undefined): string[] { if (!s) return []; try { return JSON.parse(s); } catch { return []; } }
|
function parseImages(s: any): string[] {
|
||||||
|
if (!s) return [];
|
||||||
|
if (Array.isArray(s)) return s; // Pydantic 序列化后的数组
|
||||||
|
if (typeof s === "string") { try { return JSON.parse(s); } catch { return []; } }
|
||||||
|
return [];
|
||||||
|
}
|
||||||
function imageUrl(u: string) { if (!u) return ""; return u.startsWith("http") ? u : import.meta.env.VITE_API_BASE_URL + (u.startsWith("/") ? u : "/" + u); }
|
function imageUrl(u: string) { if (!u) return ""; return u.startsWith("http") ? u : import.meta.env.VITE_API_BASE_URL + (u.startsWith("/") ? u : "/" + u); }
|
||||||
|
|
||||||
const ALL_TASKS = new Set<TaskResponse>();
|
const ALL_TASKS = new Set<TaskResponse>();
|
||||||
@ -218,7 +223,7 @@ export const TaskFlowView = memo(function TaskFlowView({ tasks, onAction, curren
|
|||||||
<div className={`mt-1.5 h-2 w-2 shrink-0 rounded-full ${i === 0 ? "bg-blue-500" : "bg-gray-300"}`} />
|
<div className={`mt-1.5 h-2 w-2 shrink-0 rounded-full ${i === 0 ? "bg-blue-500" : "bg-gray-300"}`} />
|
||||||
<div className="flex-1 rounded bg-gray-50 px-3 py-2"><p className="text-[10px] text-gray-400">{fmtTime(r.created_at)}</p>
|
<div className="flex-1 rounded bg-gray-50 px-3 py-2"><p className="text-[10px] text-gray-400">{fmtTime(r.created_at)}</p>
|
||||||
{(r.note || r.remark) && <p className="mt-0.5 text-xs text-gray-700">{r.note || r.remark}</p>}
|
{(r.note || r.remark) && <p className="mt-0.5 text-xs text-gray-700">{r.note || r.remark}</p>}
|
||||||
{(() => { const imgs = parseImages((r as any).images); if (!imgs.length) return null; return <div className="mt-1 flex gap-1">{imgs.map((img, j) => <img key={j} src={imageUrl(img)} className="h-12 w-12 rounded border object-cover cursor-pointer" onClick={() => window.open(imageUrl(img))} />)}</div>; })()}
|
{(() => { const imgs = parseImages(r.images); if (!imgs.length) return null; return <div className="mt-1 flex gap-1 flex-wrap">{imgs.map((img, j) => <img key={j} src={imageUrl(img)} className="h-14 w-14 rounded border object-cover cursor-pointer hover:opacity-80 transition-opacity" onClick={() => window.open(imageUrl(img))} />)}</div>; })()}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}</div>}
|
))}</div>}
|
||||||
|
|||||||
Reference in New Issue
Block a user