feat: show upload progress for project saving and model imports
Build and Deploy / build-and-push (push) Failing after 28s
Build and Deploy / build-and-push (push) Failing after 28s
This commit is contained in:
+10
-4
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user