-
Notifications
You must be signed in to change notification settings - Fork 288
Expand file tree
/
Copy pathsave.tsx
More file actions
121 lines (94 loc) · 3.14 KB
/
save.tsx
File metadata and controls
121 lines (94 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { dirname } from "path/posix";
import { writeJSON } from "fs-extra";
import { ipcRenderer } from "electron";
import { toast } from "sonner";
import packageJson from "../../../package.json";
import { Editor } from "../../editor/main";
import { IEditorProject } from "../typings";
import { exportProject } from "../export/export";
import { projectsKey } from "../../tools/project";
import { onProjectSavedObservable } from "../../tools/observables";
import { getBase64SceneScreenshot } from "../../tools/scene/screenshot";
import { tryGetProjectsFromLocalStorage } from "../../tools/local-storage";
import { saveScene } from "./scene";
import { EditorSaveProjectProgressComponent } from "./progress";
let saving = false;
export async function saveProject(editor: Editor): Promise<void> {
if (saving) {
return;
}
saving = true;
try {
await _saveProject(editor);
} catch (e) {
if (e instanceof Error) {
editor.layout.console.error(`Error saving project:\n ${e.message}`);
toast.error("Error saving project");
}
} finally {
saving = false;
}
}
export async function saveProjectConfiguration(editor: Editor) {
const project: Partial<IEditorProject> = {
plugins: editor.state.plugins.map((plugin) => ({
nameOrPath: plugin,
})),
version: packageJson.version,
packageManager: editor.state.packageManager,
lastOpenedScene: editor.state.lastOpenedScenePath?.replace(dirname(editor.state.projectPath!), ""),
compressedTexturesEnabled: editor.state.compressedTexturesEnabled,
compressedTexturesEnabledInPreview: editor.state.compressedTexturesEnabledInPreview,
gizmoSnap: editor.layout.preview?.state.gizmoSnap,
};
if (!editor.props.editedScenePath) {
await writeJSON(editor.state.projectPath!, project, {
spaces: 4,
});
}
return project;
}
async function _saveProject(editor: Editor) {
if (!editor.state.projectPath) {
return;
}
const toastId = toast(<EditorSaveProjectProgressComponent />, {
duration: Infinity,
dismissible: false,
});
const directory = dirname(editor.state.projectPath);
const project = await saveProjectConfiguration(editor);
if (editor.state.lastOpenedScenePath) {
editor.layout.console.log(`Saving project "${project.lastOpenedScene}"`);
await saveScene(editor, directory, editor.state.lastOpenedScenePath);
editor.layout.console.log(`Project "${project.lastOpenedScene}" saved.`);
}
editor.layout.preview.setRenderScene(true);
toast.dismiss(toastId);
toast.success("Project saved");
if (!editor.props.editedScenePath) {
try {
const base64 = await getBase64SceneScreenshot(editor.layout.preview.scene);
const projects = tryGetProjectsFromLocalStorage();
const project = projects.find((project) => project.absolutePath === editor.state.projectPath);
if (project) {
project.preview = base64;
project.updatedAt = new Date();
localStorage.setItem(projectsKey, JSON.stringify(projects));
ipcRenderer.send("dashboard:update-projects");
}
} catch (e) {
// Catch silently.
}
}
try {
onProjectSavedObservable.notifyObservers();
} catch (e) {
// Catch silently.
}
exportProject(editor, {
optimize: false,
noProgress: true,
noDialog: false,
});
}