refactor: sync clonePersistence types, extract WatermarkToolPage
This commit is contained in:
@@ -60,10 +60,13 @@ export interface CloneSavedSetting {
|
||||
requirement: string;
|
||||
}
|
||||
|
||||
export interface EcommerceHistoryRecord {
|
||||
export type EcommerceHistoryStatus = "generating" | "done" | "failed";
|
||||
|
||||
export interface EcommerceHistoryTurn {
|
||||
id: string;
|
||||
title: string;
|
||||
createdAt: number;
|
||||
status: EcommerceHistoryStatus;
|
||||
errorMessage?: string;
|
||||
output: CloneOutputKey;
|
||||
platform: string;
|
||||
market: string;
|
||||
@@ -80,6 +83,29 @@ export interface EcommerceHistoryRecord {
|
||||
replicateLevel: CloneReplicateLevelKey;
|
||||
}
|
||||
|
||||
export interface EcommerceHistoryRecord {
|
||||
id: string;
|
||||
title: string;
|
||||
createdAt: number;
|
||||
status?: EcommerceHistoryStatus;
|
||||
errorMessage?: string;
|
||||
output: CloneOutputKey;
|
||||
platform: string;
|
||||
market: string;
|
||||
language: string;
|
||||
ratio: string;
|
||||
requirement: string;
|
||||
productImages: CloneImageItem[];
|
||||
results: CloneResult[];
|
||||
setResultImages: string[];
|
||||
setCounts: Record<CloneSetCountKey, number>;
|
||||
detailModules: string[];
|
||||
modelScenes: string[];
|
||||
referenceImages: CloneImageItem[];
|
||||
replicateLevel: CloneReplicateLevelKey;
|
||||
turns?: EcommerceHistoryTurn[];
|
||||
}
|
||||
|
||||
export const cloneLatestSettingStorageKey = "omniai.clone-ai.latest-setting";
|
||||
export const ecommerceHistoryStorageKey = "omniai.ecommerce.history.records";
|
||||
|
||||
@@ -148,9 +174,67 @@ export function removeFilePayloadFromImages(images: CloneImageItem[]): CloneImag
|
||||
}));
|
||||
}
|
||||
|
||||
export function normalizeEcommerceHistoryRecord(record: EcommerceHistoryRecord): EcommerceHistoryRecord {
|
||||
export function getTurnResults(turn: EcommerceHistoryTurn): CloneResult[] {
|
||||
if (turn.results?.length) return turn.results.filter((item) => item.src);
|
||||
if (turn.output !== "set") return [];
|
||||
return (turn.setResultImages ?? [])
|
||||
.filter(Boolean)
|
||||
.map((src, index) => ({ id: `${turn.id}-set-${index}`, src, label: `套图 ${index + 1}` }));
|
||||
}
|
||||
|
||||
export function buildHistoryTurnFromRecord(record: EcommerceHistoryRecord): EcommerceHistoryTurn {
|
||||
return {
|
||||
id: `${record.id}-turn-initial`,
|
||||
createdAt: record.createdAt,
|
||||
status: record.status ?? "done",
|
||||
errorMessage: record.status === "failed" ? record.errorMessage : undefined,
|
||||
output: record.output,
|
||||
platform: record.platform,
|
||||
market: record.market,
|
||||
language: record.language,
|
||||
ratio: record.ratio,
|
||||
requirement: record.requirement,
|
||||
productImages: record.productImages ?? [],
|
||||
results: record.results ?? [],
|
||||
setResultImages: record.setResultImages ?? [],
|
||||
setCounts: record.setCounts ?? defaultCloneSetCounts,
|
||||
detailModules: record.detailModules ?? defaultCloneDetailModuleIds,
|
||||
modelScenes: record.modelScenes ?? [],
|
||||
referenceImages: record.referenceImages ?? [],
|
||||
replicateLevel: record.replicateLevel ?? "high",
|
||||
};
|
||||
}
|
||||
|
||||
export function normalizeEcommerceHistoryTurn(turn: EcommerceHistoryTurn, fallback: EcommerceHistoryRecord, index: number): EcommerceHistoryTurn {
|
||||
const status = turn.status ?? fallback.status ?? "done";
|
||||
return {
|
||||
id: typeof turn.id === "string" && turn.id ? turn.id : `${fallback.id}-turn-${index + 1}`,
|
||||
createdAt: typeof turn.createdAt === "number" ? turn.createdAt : fallback.createdAt,
|
||||
status,
|
||||
errorMessage: status === "failed" ? turn.errorMessage ?? fallback.errorMessage : undefined,
|
||||
output: turn.output ?? fallback.output,
|
||||
platform: turn.platform ?? fallback.platform,
|
||||
market: turn.market ?? fallback.market,
|
||||
language: turn.language ?? fallback.language,
|
||||
ratio: turn.ratio ?? fallback.ratio,
|
||||
requirement: turn.requirement ?? fallback.requirement,
|
||||
productImages: removeFilePayloadFromImages(Array.isArray(turn.productImages) ? turn.productImages : fallback.productImages),
|
||||
results: Array.isArray(turn.results) ? turn.results.filter(isCloneResult) : [],
|
||||
setResultImages: Array.isArray(turn.setResultImages) ? turn.setResultImages.filter(Boolean) : [],
|
||||
setCounts: turn.setCounts ?? fallback.setCounts ?? defaultCloneSetCounts,
|
||||
detailModules: turn.detailModules ?? fallback.detailModules ?? defaultCloneDetailModuleIds,
|
||||
modelScenes: turn.modelScenes ?? fallback.modelScenes ?? [],
|
||||
referenceImages: removeFilePayloadFromImages(Array.isArray(turn.referenceImages) ? turn.referenceImages : fallback.referenceImages ?? []),
|
||||
replicateLevel: turn.replicateLevel ?? fallback.replicateLevel ?? "high",
|
||||
};
|
||||
}
|
||||
|
||||
export function normalizeEcommerceHistoryRecord(record: EcommerceHistoryRecord): EcommerceHistoryRecord {
|
||||
const status = record.status ?? "done";
|
||||
const baseRecord = {
|
||||
...record,
|
||||
status,
|
||||
errorMessage: status === "failed" ? record.errorMessage : undefined,
|
||||
productImages: removeFilePayloadFromImages(record.productImages),
|
||||
referenceImages: removeFilePayloadFromImages(record.referenceImages ?? []),
|
||||
results: record.results ?? [],
|
||||
@@ -160,6 +244,14 @@ export function normalizeEcommerceHistoryRecord(record: EcommerceHistoryRecord):
|
||||
modelScenes: record.modelScenes ?? [],
|
||||
replicateLevel: record.replicateLevel ?? "high",
|
||||
};
|
||||
const rawTurns = Array.isArray(record.turns) && record.turns.length
|
||||
? record.turns
|
||||
: [buildHistoryTurnFromRecord(baseRecord)];
|
||||
const turns = rawTurns.map((turn, index) => normalizeEcommerceHistoryTurn(turn, baseRecord, index));
|
||||
return {
|
||||
...baseRecord,
|
||||
turns,
|
||||
};
|
||||
}
|
||||
|
||||
export function readCloneLatestSetting(): CloneSavedSetting | null {
|
||||
|
||||
Reference in New Issue
Block a user