2026-05-21-00-43-44 修复ZIP STL导入反馈

This commit is contained in:
2026-05-21 00:54:23 +08:00
parent 14c8eb153d
commit b07b04adeb
6 changed files with 222 additions and 9 deletions

View File

@@ -135,7 +135,8 @@ interface AssetImportProgressState {
totalBytes: number;
loadedBytes: number;
percent: number;
phase: 'uploading' | 'processing' | 'done';
phase: 'uploading' | 'processing' | 'done' | 'failed';
message?: string;
}
function formatFileSize(value: number) {
@@ -953,8 +954,17 @@ export default function ProjectLibrary({
setActionMessage(kind === 'dicom' ? `已导入 ${updated.dicomCount} 张 DICOM 影像` : `已导入 ${updated.modelCount ?? 0} 个 STL 模型`);
window.setTimeout(() => setAssetImportProgress(null), 1800);
} catch (error) {
setActionMessage(error instanceof Error ? error.message : '项目资产导入失败');
window.setTimeout(() => setAssetImportProgress(null), 2400);
const message = error instanceof Error ? error.message : '项目资产导入失败';
setAssetImportProgress((current) => ({
kind,
fileCount: files.length,
totalBytes: current?.totalBytes ?? totalBytes,
loadedBytes: current?.loadedBytes ?? 0,
percent: current?.percent ?? 0,
phase: 'failed',
message,
}));
setActionMessage(message);
} finally {
setAssetImporting(false);
}
@@ -1516,15 +1526,29 @@ export default function ProjectLibrary({
</div>
{assetImportProgress && (
<div className="rounded-2xl border border-blue-100 bg-white px-5 py-3 shadow-sm">
<div className={`rounded-2xl border px-5 py-3 shadow-sm ${
assetImportProgress.phase === 'failed'
? 'border-rose-200 bg-rose-50'
: assetImportProgress.phase === 'done'
? 'border-emerald-100 bg-white'
: 'border-blue-100 bg-white'
}`}>
<div className="mb-2 flex items-center justify-between gap-4">
<div className="flex min-w-0 items-center gap-3">
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-blue-50 text-blue-600">
<FileArchive size={17} />
<div className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-xl ${
assetImportProgress.phase === 'failed'
? 'bg-rose-100 text-rose-600'
: assetImportProgress.phase === 'done'
? 'bg-emerald-50 text-emerald-600'
: 'bg-blue-50 text-blue-600'
}`}>
{assetImportProgress.phase === 'failed' ? <X size={17} /> : <FileArchive size={17} />}
</div>
<div className="min-w-0">
<p className="truncate text-sm font-bold text-slate-800">
{assetImportProgress.phase === 'done'
{assetImportProgress.phase === 'failed'
? `${describeImportKind(assetImportProgress.kind)}导入失败`
: assetImportProgress.phase === 'done'
? `${describeImportKind(assetImportProgress.kind)}导入完成`
: assetImportProgress.phase === 'processing'
? '上传完成,服务器正在解压与解析'
@@ -1533,15 +1557,32 @@ export default function ProjectLibrary({
<p className="mt-0.5 text-[11px] font-bold text-slate-400">
{assetImportProgress.fileCount} · {formatFileSize(assetImportProgress.loadedBytes)} / {formatFileSize(assetImportProgress.totalBytes)}
</p>
{assetImportProgress.phase === 'failed' && assetImportProgress.message && (
<p className="mt-1 whitespace-normal text-[11px] font-bold leading-5 text-rose-700">
{assetImportProgress.message}
</p>
)}
</div>
</div>
<span className="shrink-0 font-mono text-sm font-black text-blue-600">
<span className={`shrink-0 font-mono text-sm font-black ${
assetImportProgress.phase === 'failed'
? 'text-rose-600'
: assetImportProgress.phase === 'done'
? 'text-emerald-600'
: 'text-blue-600'
}`}>
{assetImportProgress.percent}%
</span>
</div>
<div className="h-2 overflow-hidden rounded-full bg-slate-100">
<div
className={`h-full rounded-full transition-all duration-300 ${assetImportProgress.phase === 'done' ? 'bg-emerald-500' : 'bg-blue-600'}`}
className={`h-full rounded-full transition-all duration-300 ${
assetImportProgress.phase === 'failed'
? 'bg-rose-500'
: assetImportProgress.phase === 'done'
? 'bg-emerald-500'
: 'bg-blue-600'
}`}
style={{ width: `${assetImportProgress.percent}%` }}
/>
</div>