-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Expand file tree
/
Copy pathProjectStorage.js
More file actions
260 lines (208 loc) · 41.8 KB
/
ProjectStorage.js
File metadata and controls
260 lines (208 loc) · 41.8 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
// Copyright (c) 2017 Euan Ong
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the The GNU Affero General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// You should have received a copy of the GNU Affero General Public
// License along with this library; if not, write to the Free Software
// Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
/*
global
_, localforage
*/
/*
exported
ProjectStorage
*/
class ProjectStorage {
constructor(Planet) {
this.Planet = Planet;
this.defaultProjectName = _("My Project");
this.LocalStorage = null;
this.data = null;
this.LocalStorageKey = "ProjectData";
this.VersionKey = "StorageVersion";
this.Version = "v2";
this.TimeLastSaved = -1;
this.ImageDataURL =
"data:image/png;base64,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";
// eslint-disable-next-line no-unused-vars
this.dataLoaded = new Promise((resolve, reject) => {
this.fireDataLoaded = resolve;
});
this.dataLoaded.then(() => {
// eslint-disable-next-line no-console
console.debug("DATA LOADED");
});
}
generateID() {
const n = Date.now();
const prefix = n.toString();
let suffix = "";
for (let i = 0; i < 3; i++) suffix += Math.floor(Math.random() * 10).toString();
return prefix + suffix;
}
saveLocally(data, image) {
if (this.data.CurrentProject === undefined) this.initialiseNewProject();
const c = this.data.CurrentProject;
if (this.data.Projects[c] === undefined) {
this.data.Projects[c] = {};
this.data.Projects[c].ProjectName = this.defaultProjectName;
this.data.Projects[c].ProjectData = null;
this.data.Projects[c].ProjectImage = null;
this.data.Projects[c].PublishedData = null;
this.data.Projects[c].DateLastModified = Date.now();
}
this.data.Projects[c].ProjectData = data;
this.data.Projects[c].ProjectImage = image;
this.data.Projects[c].DateLastModified = Date.now();
this.save();
}
async getCurrentProjectData() {
await this.dataLoaded;
const c = this.data.CurrentProject;
return this.data.Projects[c]?.ProjectData ?? null;
}
getCurrentProjectName() {
const c = this.data.CurrentProject;
return this.data.Projects[c]?.ProjectName ?? this.defaultProjectName;
}
getCurrentProjectDescription() {
const c = this.data.CurrentProject;
if (this.data.Projects[c] != undefined && this.data.Projects[c].PublishedData !== null)
return this.data.Projects[c].PublishedData.ProjectDescription;
return null;
}
getCurrentProjectImage() {
const c = this.data.CurrentProject;
if (this.data.Projects[c] !== undefined && this.data.Projects[c].ProjectImage !== null)
return this.data.Projects[c].ProjectImage;
return this.ImageDataURL;
}
initialiseNewProject(name, data, image) {
name = name ?? this.defaultProjectName;
data = data ?? null;
image = image ?? null;
const c = this.generateID();
this.data.CurrentProject = c;
this.data.Projects[c] = {};
this.data.Projects[c].ProjectName = name;
this.data.Projects[c].ProjectData = data;
this.data.Projects[c].ProjectImage = image;
this.data.Projects[c].PublishedData = null;
this.data.Projects[c].DateLastModified = Date.now();
this.save();
}
renameProject(id, name) {
this.data.Projects[id].ProjectName = name;
this.save();
}
addPublishedData(id, data) {
this.data.Projects[id].PublishedData = data;
this.save();
}
deleteProject(id) {
delete this.data.Projects[id];
this.save();
this.Planet.LocalPlanet.updateProjects();
}
getCurrentProjectID() {
return this.data.CurrentProject;
}
setCurrentProjectID(id) {
this.data.CurrentProject = id;
}
encodeTB(tb) {
return window.btoa(encodeURIComponent(tb));
}
decodeTB(tb) {
return decodeURIComponent(window.atob(tb));
}
isLiked(id) {
return this.data.LikedProjects[id] === true;
}
like(id, like) {
this.data.LikedProjects[id] = like;
this.save();
}
isReported(id) {
return this.data.ReportedProjects[id] === true;
}
report(id, report) {
this.data.ReportedProjects[id] = report;
this.save();
}
// Ancillary Functions
async set(key, obj) {
const jsonobj = JSON.stringify(obj);
await this.LocalStorage.setItem(key, jsonobj);
const savedjsonobj = await this.LocalStorage.getItem(key);
// prevent unnecessary crashing
if (savedjsonobj == null) throw new Error("Failed to save project data");
}
async get(key) {
const jsonobj = await this.LocalStorage.getItem(key);
if (jsonobj === null || jsonobj === "") return null;
try {
return JSON.parse(jsonobj);
} catch (error) {
console.error(`ProjectStorage: Failed to parse JSON data for key "${key}":`, error);
return null;
}
}
async save() {
this.TimeLastSaved = Date.now();
await this.set(this.LocalStorageKey, this.data);
}
async restore() {
const currentData = await this.get(this.LocalStorageKey);
try {
this.data = typeof currentData === "string" ? JSON.parse(currentData) : currentData;
} catch (error) {
console.error("ProjectStorage: Critical failure during storage state restoration.", error);
return null;
}
}
async initialiseStorage() {
if (this.data === null || this.data === undefined) {
this.data = {};
}
if (this.data.Projects === null || this.data.Projects === undefined) {
this.data.Projects = {};
}
if (this.data.LikedProjects === null || this.data.LikedProjects === undefined) {
this.data.LikedProjects = {};
}
if (this.data.ReportedProjects === null || this.data.ReportedProjects === undefined) {
this.data.ReportedProjects = {};
}
if (this.data.DefaultCreatorName === null || this.data.DefaultCreatorName === undefined) {
this.data.DefaultCreatorName = _("anonymous");
}
this.fireDataLoaded();
await this.save();
}
getDefaultCreatorName() {
return this.data.DefaultCreatorName;
}
async port() {
const oldProjectData = localStorage.getItem(this.LocalStorageKey);
const isPortedAlready = await this.get(this.VersionKey);
if (isPortedAlready !== this.Version) {
// port
// eslint-disable-next-line no-console
console.debug("Porting ProjectStorage to V2...");
await this.set(this.LocalStorageKey, oldProjectData);
await this.set(this.VersionKey, this.Version);
}
}
async init() {
// don't use Planet's localStorage, use IndexedDB if available to allow bigger projects.
this.LocalStorage = localforage;
await this.port();
await this.restore();
await this.initialiseStorage();
}
}