fix(*): 素材库与画布 - 修复批量删除刷新、选择布局及工具引用

This commit is contained in:
ddCat
2026-09-21 20:14:05 +08:00
parent 4e0b0a9256
commit 0146a232a7
27 changed files with 852 additions and 109 deletions

View File

@@ -1,6 +1,6 @@
import { getMediaBlob } from "@/services/file-storage";
import { getImageBlob } from "@/services/image-storage";
import { deleteRemoteAsset, deleteRemoteCanvasProject, getRemoteAsset, getRemoteAssetsByIds, getRemoteCanvasProject, getRemoteUserDataSnapshot, listRemoteAssetsPage, restoreRemoteCanvasHistory, upsertRemoteAsset, upsertRemoteCanvasProject } from "@/services/api/user-data";
import { deleteRemoteAssets, deleteRemoteCanvasProject, getRemoteAsset, getRemoteAssetsByIds, getRemoteCanvasProject, getRemoteUserDataSnapshot, listRemoteAssetsPage, restoreRemoteCanvasHistory, upsertRemoteAsset, upsertRemoteCanvasProject } from "@/services/api/user-data";
import { ApiError } from "@/services/api/request";
import { canvasContentHash, sameCanvasContent } from "@/lib/canvas/canvas-content";
import { getActiveUserScope } from "@/lib/user-scope";
@@ -438,19 +438,34 @@ export async function createCanvasProjectWithRemoteSync(title: string, projectId
}
export async function deleteAssetWithRemoteSync(id: string) {
return deleteAssetsWithRemoteSync([id]);
}
export async function deleteAssetsWithRemoteSync(ids: string[]) {
const epoch = sessionEpoch;
const assetId = id.trim();
if (!assetId) throw new Error("素材 ID 不能为空");
if (!ids.length || ids.length > 1000) throw new Error("每次请选择 1–1000 个素材删除");
const assetIds = [...new Set(ids.map((id) => id.trim()))];
if (assetIds.some((id) => !id)) throw new Error("素材 ID 不能为空");
await withRemoteUserDataSyncExclusive(async () => {
if (epoch !== sessionEpoch) throw new Error("账号已切换,请重新选择要删除的素材");
if (activeRemoteUserId) {
requireRemoteUserDataBaseline();
await deleteRemoteAsset(assetId);
acknowledgedAssets.delete(assetId);
await deleteRemoteAssets(assetIds);
if (epoch !== sessionEpoch) throw new Error("账号已切换,请刷新原账号素材库确认删除结果");
for (const id of assetIds) acknowledgedAssets.delete(id);
}
await useAssetStore.getState().removeAsset(assetId);
await useAssetStore.getState().removeAssets(assetIds);
await flushAssetStorePersistence();
});
if (epoch !== sessionEpoch) throw new Error("账号已切换,请刷新原账号素材库确认删除结果");
// 列表查询也会进入同步队列,必须在退出删除队列后触发,不能在队列内等待刷新。
// 刷新慢或失败不应阻塞确认弹窗关闭,也不能把已完成的删除报告为失败。
void Promise.all([
appQueryClient.invalidateQueries({ queryKey: ["asset-library"] }, { throwOnError: true }),
appQueryClient.invalidateQueries({ queryKey: ["asset-picker"] }, { throwOnError: true }),
]).catch((error) => {
console.warn("素材删除后列表刷新失败", error);
});
}
export async function deleteCanvasProjectsWithRemoteSync(ids: string[]) {