diff --git a/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts b/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts index aefc6acc3..9009b84dd 100644 --- a/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts +++ b/src/components/image-editor/useImageCanvasAssetExportWorkflow.ts @@ -50,16 +50,29 @@ function hasReadableLayerExportSource(layer: CanvasLayer) { return hasReadableAssetSource(layer.src, layer.objectKey); } -type CanvasAssetExportFolderName = 'images' | 'media' | '3d_models'; +/** + * 导出目录名。名字在「挑目录」「建目录」「按层分流」三处都要用, + * 只留这一份字面量:写错目录名不会编译报错,只会在 zip 里悄悄换目录。 + */ +const EXPORT_FOLDER = { + images: 'images', + media: 'media', + models: '3d_models', +} as const; + +type CanvasAssetExportFolderName = + (typeof EXPORT_FOLDER)[keyof typeof EXPORT_FOLDER]; /** 导出目录按媒体族分:图片 `images/`、音视频 `media/`、3D 模型 `3d_models/`。 */ function resolveLayerExportFolderName( layer: CanvasLayer, ): CanvasAssetExportFolderName { if (layer.assetKind === 'model3d') { - return '3d_models'; + return EXPORT_FOLDER.models; } - return (layer.mediaType ?? 'image') === 'image' ? 'images' : 'media'; + return (layer.mediaType ?? 'image') === 'image' + ? EXPORT_FOLDER.images + : EXPORT_FOLDER.media; } /** zip 目标目录:三类各一个,模型不进图片目录。 */ @@ -67,10 +80,10 @@ function resolveExportTargetFolder( folderName: CanvasAssetExportFolderName, folders: { imagesFolder: JSZip; mediaFolder: JSZip; modelsFolder: JSZip }, ) { - if (folderName === '3d_models') { + if (folderName === EXPORT_FOLDER.models) { return folders.modelsFolder; } - if (folderName === 'media') { + if (folderName === EXPORT_FOLDER.media) { return folders.mediaFolder; } return folders.imagesFolder; @@ -496,11 +509,14 @@ export function useImageCanvasAssetExportWorkflow({ const rootFolderName = `${projectName}-${archiveLabel}`; const zip = new JSZip(); const rootFolder = zip.folder(rootFolderName) ?? zip; - const imagesFolder = rootFolder.folder('images') ?? rootFolder; - const mediaFolder = rootFolder.folder('media') ?? rootFolder; + const imagesFolder = + rootFolder.folder(EXPORT_FOLDER.images) ?? rootFolder; + const mediaFolder = + rootFolder.folder(EXPORT_FOLDER.media) ?? rootFolder; // 3D 资源导出的是模型本体(.glb/.gltf/.fbx),混进 images/ 会让人以为 // zip 里是坏图片,所以单独一个目录。 - const modelsFolder = rootFolder.folder('3d_models') ?? rootFolder; + const modelsFolder = + rootFolder.folder(EXPORT_FOLDER.models) ?? rootFolder; const imageByKey = new Map(); const usedFileNames = new Map(); const plannedKeys = new Set();