ai-chatbot/lib/canvas/psd-template-launch.ts
Your Name 21a2254428
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: expand canvas batch and image workflows
2026-05-08 16:24:28 +08:00

99 lines
2.6 KiB
TypeScript

export type CanvasPsdTemplatePendingImage = {
id: string;
imageUrl: string;
title?: string | null;
};
export type CanvasPsdTemplateLaunchPayload = {
brandName: string;
pendingImages: CanvasPsdTemplatePendingImage[];
activeImageId?: string | null;
returnTo?: string | null;
templateMode?: "main" | "sku" | null;
createdAt: number;
};
const STORAGE_PREFIX = "canvas-psd-template-launch:";
export function getCanvasPsdTemplateLaunchStorageKey(token: string) {
return `${STORAGE_PREFIX}${token}`;
}
export function createCanvasPsdTemplateLaunchToken() {
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
return crypto.randomUUID();
}
return `launch-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
}
export function saveCanvasPsdTemplateLaunchPayload(
token: string,
payload: CanvasPsdTemplateLaunchPayload
) {
if (typeof window === "undefined") {
return;
}
window.sessionStorage.setItem(
getCanvasPsdTemplateLaunchStorageKey(token),
JSON.stringify(payload)
);
}
export function readCanvasPsdTemplateLaunchPayload(
token: string
): CanvasPsdTemplateLaunchPayload | null {
if (typeof window === "undefined") {
return null;
}
const raw = window.sessionStorage.getItem(
getCanvasPsdTemplateLaunchStorageKey(token)
);
if (!raw) {
return null;
}
try {
const parsed = JSON.parse(raw) as Partial<CanvasPsdTemplateLaunchPayload> | null;
const pendingImages = Array.isArray(parsed?.pendingImages)
? parsed.pendingImages
.map((item) => ({
id: String(item?.id || "").trim(),
imageUrl: String(item?.imageUrl || "").trim(),
title: String(item?.title || "").trim() || null,
}))
.filter((item) => item.id && item.imageUrl)
: [];
const brandName = String(parsed?.brandName || "").trim();
if (!brandName || pendingImages.length === 0) {
return null;
}
return {
brandName,
pendingImages,
activeImageId: String(parsed?.activeImageId || "").trim() || pendingImages[0]?.id || null,
returnTo: String(parsed?.returnTo || "").trim() || null,
templateMode:
parsed?.templateMode === "sku" ? "sku" : parsed?.templateMode === "main" ? "main" : null,
createdAt:
typeof parsed?.createdAt === "number" && Number.isFinite(parsed.createdAt)
? parsed.createdAt
: Date.now(),
};
} catch {
return null;
}
}
export function removeCanvasPsdTemplateLaunchPayload(token: string) {
if (typeof window === "undefined") {
return;
}
window.sessionStorage.removeItem(getCanvasPsdTemplateLaunchStorageKey(token));
}