完善 AI 设计资产预览与视频首帧选择

需求:生成图片需要支持大图查看和本地下载;制作视频时需要从当前项目作品选择首帧,或上传本地图片。

实现:新增首帧选择弹窗、JPEG/PNG/WebP 有界上传、附件 Asset ID 透传、Main 到服务端 multipart 转发,并保留上传失败重试与私有图片下载链路。

验证:相关 57 项单测、TypeScript 类型检查、目标 ESLint 和 Vite 生产构建全部通过。
This commit is contained in:
2026-08-06 11:31:47 +08:00
parent 2a3c9850d1
commit 15b17775cb
11 changed files with 1149 additions and 31 deletions

View File

@@ -60,7 +60,7 @@ type ImageWorkspaceState = {
refreshTasks: () => Promise<DesignGenerationTask[]>;
connectTaskStream: () => void;
disconnectTaskStream: () => void;
sendMessage: (message: string) => Promise<DesignWorkspace>;
sendMessage: (message: string, attachmentAssetIds?: string[]) => Promise<DesignWorkspace>;
confirmGeneration: (quoteId: string) => Promise<DesignWorkspace>;
reset: () => void;
};
@@ -635,19 +635,27 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
disconnectTaskStream: stopTaskStream,
sendMessage: async (message) => {
sendMessage: async (message, attachmentAssetIds = []) => {
const workspace = get().workspace;
const userText = message.trim();
const clientTurnId = createImageWorkspaceTurnId();
if (!workspace) throw new Error('请先选择设计项目');
try {
set({ pendingTurn: createPendingTurn(workspace, clientTurnId, userText), error: null });
const updated = await sendImageWorkspaceMessage(
workspace.workspaceId,
workspace.turnRevision,
userText,
clientTurnId,
);
const updated = attachmentAssetIds.length > 0
? await sendImageWorkspaceMessage(
workspace.workspaceId,
workspace.turnRevision,
userText,
clientTurnId,
attachmentAssetIds,
)
: await sendImageWorkspaceMessage(
workspace.workspaceId,
workspace.turnRevision,
userText,
clientTurnId,
);
if (get().activeWorkspaceId === workspace.workspaceId) {
applyWorkspace(updated);
await get().refreshTasks().catch(() => []);