feat: show upload progress for project saving and model imports
Build and Deploy / build-and-push (push) Failing after 28s

This commit is contained in:
AI Bot
2026-09-02 09:59:32 +05:30
parent 324b93d898
commit 35c688ba47
3 changed files with 18 additions and 8 deletions
+10 -4
View File
@@ -274,6 +274,7 @@ export default function Editor() {
const [blobURLs, setBlobURLs] = useState<string[]>([]);
const [projectName, setProjectName] = useState<string>('');
const [saveStatus, setSaveStatus] = useState<'saved' | 'saving' | 'unsaved' | 'offline'>('saved');
const [saveProgress, setSaveProgress] = useState(0);
const [isOffline, setIsOffline] = useState(!navigator.onLine);
useEffect(() => {
@@ -738,8 +739,11 @@ export default function Editor() {
}
// Upload to Cloud
setSaveProgress(0);
const file = new File([blob], `${projectNameStr.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.titanscene`, { type: 'application/octet-stream' });
const fileUrl = await api.uploadAsset(file);
const fileUrl = await api.uploadAsset(file, (progress) => {
setSaveProgress(progress);
});
const result = await api.saveProject({
id: projectId && projectId !== 'new' ? projectId : undefined,
@@ -1492,8 +1496,10 @@ export default function Editor() {
if (object) {
// Save model data for scene persistence
const modelBlob = await fetch(rootFile.url).then(r => r.blob());
setImportStatus("Uploading to cloud storage...");
const cloudUrl = await uploadAssetToStorage(modelBlob, 'assets', `models/${user?.id || 'guest'}_${Date.now()}_${rootFile.name}`);
setImportStatus("Uploading to cloud storage... 0%");
const cloudUrl = await uploadAssetToStorage(modelBlob, 'assets', `models/${user?.id || 'guest'}_${Date.now()}_${rootFile.name}`, (prog) => {
setImportStatus(`Uploading to cloud storage... ${prog}%`);
});
setModelData({ name: rootFile.name, data: cloudUrl, extension: extension || '' });
setImportStatus("Optimizing geometry...");
@@ -2126,7 +2132,7 @@ export default function Editor() {
<div className={`flex items-center gap-1 transition-colors ${saveStatus === 'saved' ? 'text-green-500' : saveStatus === 'saving' ? 'text-blue-400' : 'text-zinc-500'}`}>
{saveStatus === 'saving' && <Loader2 size={10} className="animate-spin" />}
{saveStatus === 'saved' && <Save size={10} />}
<span>{saveStatus === 'saved' ? 'Saved' : saveStatus === 'saving' ? 'Saving...' : 'Unsaved changes'}</span>
<span>{saveStatus === 'saved' ? 'Saved' : saveStatus === 'saving' ? (saveProgress > 0 && saveProgress < 100 ? `Saving... ${saveProgress}%` : 'Saving...') : 'Unsaved changes'}</span>
</div>
) : null}
<div className="flex items-center gap-1 bg-white dark:bg-zinc-800 px-2 py-0.5 rounded">