fix: show regenerating state for style batch results
This commit is contained in:
parent
caf9eb7290
commit
f69e2d07a2
@ -119,6 +119,20 @@ interface ProcessItem {
|
||||
};
|
||||
}
|
||||
|
||||
function markProcessItemRegenerating(
|
||||
item: ProcessItem,
|
||||
status: Extract<ItemStatus, "pending" | "processing">
|
||||
): ProcessItem {
|
||||
return {
|
||||
...item,
|
||||
status,
|
||||
result: undefined,
|
||||
originalUrl: undefined,
|
||||
queueStatus: undefined,
|
||||
error: undefined,
|
||||
};
|
||||
}
|
||||
|
||||
interface SceneFusionViewProps {
|
||||
initialProductImage?: string | null;
|
||||
initialProductName?: string;
|
||||
@ -1081,11 +1095,12 @@ export function SceneFusionView({
|
||||
setBatchItems((prev) =>
|
||||
prev.map((item) =>
|
||||
ids.includes(item.id)
|
||||
? {
|
||||
...item,
|
||||
status,
|
||||
error: status === "processing" ? undefined : item.error,
|
||||
}
|
||||
? status === "pending" || status === "processing"
|
||||
? markProcessItemRegenerating(item, status)
|
||||
: {
|
||||
...item,
|
||||
status,
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1099,11 +1114,12 @@ export function SceneFusionView({
|
||||
setter((prev) =>
|
||||
prev.map((item) =>
|
||||
ids.includes(item.id)
|
||||
? {
|
||||
...item,
|
||||
status,
|
||||
error: status === "processing" ? undefined : item.error,
|
||||
}
|
||||
? status === "pending" || status === "processing"
|
||||
? markProcessItemRegenerating(item, status)
|
||||
: {
|
||||
...item,
|
||||
status,
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1217,12 +1233,17 @@ export function SceneFusionView({
|
||||
setter((prev) =>
|
||||
prev.map((item) =>
|
||||
item.id === data.id
|
||||
? {
|
||||
...item,
|
||||
status: data.status,
|
||||
queueStatus: data.queueStatus || undefined,
|
||||
error: data.status === "failed" ? item.error : undefined,
|
||||
}
|
||||
? data.status === "pending" || data.status === "processing"
|
||||
? {
|
||||
...markProcessItemRegenerating(item, data.status),
|
||||
queueStatus: data.queueStatus || undefined,
|
||||
}
|
||||
: {
|
||||
...item,
|
||||
status: data.status,
|
||||
queueStatus: data.queueStatus || undefined,
|
||||
error: data.status === "failed" ? item.error : undefined,
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1454,12 +1475,21 @@ export function SceneFusionView({
|
||||
setMultiProductItems((prev) =>
|
||||
prev.map((item) =>
|
||||
item.id === params.itemId
|
||||
? {
|
||||
...item,
|
||||
status: msg.data?.status || item.status,
|
||||
queueStatus: msg.data?.queueStatus || undefined,
|
||||
error: undefined,
|
||||
}
|
||||
? msg.data?.status === "pending" ||
|
||||
msg.data?.status === "processing"
|
||||
? {
|
||||
...markProcessItemRegenerating(
|
||||
item,
|
||||
msg.data.status
|
||||
),
|
||||
queueStatus: msg.data.queueStatus || undefined,
|
||||
}
|
||||
: {
|
||||
...item,
|
||||
status: msg.data?.status || item.status,
|
||||
queueStatus: msg.data?.queueStatus || undefined,
|
||||
error: undefined,
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1556,7 +1586,7 @@ export function SceneFusionView({
|
||||
setMultiProductItems((prev) =>
|
||||
prev.map((item) =>
|
||||
itemsToProcess.some((target) => target.id === item.id)
|
||||
? { ...item, status: "pending", queueStatus: undefined, error: undefined }
|
||||
? markProcessItemRegenerating(item, "pending")
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1577,7 +1607,7 @@ export function SceneFusionView({
|
||||
setMultiProductItems((prev) =>
|
||||
prev.map((item) =>
|
||||
item.id === current.id
|
||||
? { ...item, status: "processing", error: undefined }
|
||||
? markProcessItemRegenerating(item, "processing")
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1743,7 +1773,7 @@ export function SceneFusionView({
|
||||
setBatchItems((prev) =>
|
||||
prev.map((item) =>
|
||||
itemsToProcess.some((target) => target.id === item.id)
|
||||
? { ...item, status: "pending", error: undefined }
|
||||
? markProcessItemRegenerating(item, "pending")
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1763,7 +1793,7 @@ export function SceneFusionView({
|
||||
setBatchItems((prev) =>
|
||||
prev.map((item) =>
|
||||
item.id === current.id
|
||||
? { ...item, status: "processing", error: undefined }
|
||||
? markProcessItemRegenerating(item, "processing")
|
||||
: item
|
||||
)
|
||||
);
|
||||
@ -1825,7 +1855,7 @@ export function SceneFusionView({
|
||||
setBatchItems((prev) =>
|
||||
prev.map((batchItem) =>
|
||||
batchItem.id === item.id
|
||||
? { ...batchItem, status: "processing", error: undefined }
|
||||
? markProcessItemRegenerating(batchItem, "processing")
|
||||
: batchItem
|
||||
)
|
||||
);
|
||||
@ -1955,7 +1985,7 @@ export function SceneFusionView({
|
||||
setMultiProductItems((prev) =>
|
||||
prev.map((productItem) =>
|
||||
productItem.id === item.id
|
||||
? { ...productItem, status: "pending", error: undefined }
|
||||
? markProcessItemRegenerating(productItem, "pending")
|
||||
: productItem
|
||||
)
|
||||
);
|
||||
@ -2915,6 +2945,12 @@ export function SceneFusionView({
|
||||
) : (
|
||||
<div className="grid grid-cols-2 gap-4 md:grid-cols-3 xl:grid-cols-4">
|
||||
{resultItems.map((item, index) => (
|
||||
(() => {
|
||||
const completedResultUrl =
|
||||
item.status === "completed"
|
||||
? item.result || item.originalUrl || ""
|
||||
: "";
|
||||
return (
|
||||
<div
|
||||
className="flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm"
|
||||
key={item.id}
|
||||
@ -2947,15 +2983,12 @@ export function SceneFusionView({
|
||||
<div
|
||||
className={cn(
|
||||
"group relative aspect-[3/4] bg-muted/20",
|
||||
item.status === "completed" &&
|
||||
(item.result || item.originalUrl) &&
|
||||
"cursor-zoom-in"
|
||||
completedResultUrl && "cursor-zoom-in"
|
||||
)}
|
||||
onClick={() => {
|
||||
const previewUrl = item.originalUrl || item.result;
|
||||
if (item.status === "completed" && previewUrl) {
|
||||
if (completedResultUrl) {
|
||||
openResultPreview(
|
||||
previewUrl,
|
||||
completedResultUrl,
|
||||
`任务 ${index + 1} 预览`
|
||||
);
|
||||
}
|
||||
@ -2963,28 +2996,24 @@ export function SceneFusionView({
|
||||
onKeyDown={(event) => {
|
||||
if (event.key !== "Enter" && event.key !== " ")
|
||||
return;
|
||||
const previewUrl = item.originalUrl || item.result;
|
||||
if (item.status === "completed" && previewUrl) {
|
||||
if (completedResultUrl) {
|
||||
event.preventDefault();
|
||||
openResultPreview(
|
||||
previewUrl,
|
||||
completedResultUrl,
|
||||
`任务 ${index + 1} 预览`
|
||||
);
|
||||
}
|
||||
}}
|
||||
role="button"
|
||||
tabIndex={
|
||||
item.status === "completed" &&
|
||||
(item.result || item.originalUrl)
|
||||
? 0
|
||||
: -1
|
||||
completedResultUrl ? 0 : -1
|
||||
}
|
||||
>
|
||||
{item.result ? (
|
||||
{completedResultUrl ? (
|
||||
<img
|
||||
alt="处理结果"
|
||||
className="h-full w-full object-cover"
|
||||
src={item.result}
|
||||
src={completedResultUrl}
|
||||
/>
|
||||
) : (
|
||||
(() => {
|
||||
@ -3080,7 +3109,7 @@ export function SceneFusionView({
|
||||
})()
|
||||
)}
|
||||
|
||||
{item.status === "completed" && (
|
||||
{completedResultUrl && (
|
||||
<>
|
||||
<button
|
||||
type="button"
|
||||
@ -3107,7 +3136,7 @@ export function SceneFusionView({
|
||||
onClick={(event) => {
|
||||
event.stopPropagation();
|
||||
downloadImage(
|
||||
item.originalUrl || item.result!,
|
||||
completedResultUrl,
|
||||
`batch-${index + 1}.png`
|
||||
);
|
||||
}}
|
||||
@ -3131,6 +3160,8 @@ export function SceneFusionView({
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})()
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user