Skip to content

Commit 4b9ce13

Browse files
committed
Removed uploadProject from Storage interface.
Removed uploadProject from client_side_storage. In project.ts: Added uploadProject function. Modified processUploadedBlob to return just classNameToModuleContentText. Moved code from processUploadedModule to processUploadedBlob. In Menu.tsx, call storageProject.uploadProject instead of storage.uploadProject.
1 parent 1236397 commit 4b9ce13

File tree

4 files changed

+29
-86
lines changed

4 files changed

+29
-86
lines changed

src/reactComponents/Menu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ export function Component(props: MenuProps): React.JSX.Element {
389389
const file = options.file as RcFile;
390390
const uploadProjectName = storageProject.makeUploadProjectName(file.name, existingProjectNames);
391391
if (props.storage) {
392-
props.storage.uploadProject(uploadProjectName, dataUrl);
392+
storageProject.uploadProject(props.storage, uploadProjectName, dataUrl);
393393
}
394394
};
395395
reader.onerror = (_error) => {

src/storage/client_side_storage.ts

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222
import * as commonStorage from './common_storage';
2323
import * as storageModuleContent from './module_content';
24-
import * as storageNames from './names';
25-
import * as storageProject from './project';
2624

2725
// Functions for saving blocks modules to client side storage.
2826

@@ -259,61 +257,4 @@ class ClientSideStorage implements commonStorage.Storage {
259257
};
260258
});
261259
}
262-
263-
async uploadProject(projectName: string, blobUrl: string): Promise<void> {
264-
return new Promise(async (resolve, reject) => {
265-
// Process the uploaded blob to get the module types and contents.
266-
let classNameToModuleType: {[className: string]: string}; // key is class name, value is module type
267-
let classNameToModuleContentText: {[className: string]: string}; // key is class name, value is module content
268-
try {
269-
[classNameToModuleType, classNameToModuleContentText] = await storageProject.processUploadedBlob(
270-
blobUrl);
271-
} catch (e) {
272-
console.log('storageProject.processUploadedBlob failed.');
273-
reject(new Error('storageProject.processUploadedBlob failed.'));
274-
return;
275-
}
276-
277-
// Save each module.
278-
const transaction = this.db.transaction([MODULES_STORE_NAME], 'readwrite');
279-
transaction.oncomplete = () => {
280-
resolve();
281-
};
282-
transaction.onabort = () => {
283-
console.log('IndexedDB transaction aborted.');
284-
reject(new Error('IndexedDB transaction aborted.'));
285-
};
286-
const modulesObjectStore = transaction.objectStore(MODULES_STORE_NAME);
287-
288-
for (const className in classNameToModuleType) {
289-
const moduleType = classNameToModuleType[className];
290-
const moduleContentText = classNameToModuleContentText[className];
291-
const modulePath = storageNames.makeModulePath(projectName, className);
292-
const getRequest = modulesObjectStore.get(modulePath);
293-
getRequest.onerror = () => {
294-
console.log('IndexedDB get request failed. getRequest.error is...');
295-
console.log(getRequest.error);
296-
throw new Error('IndexedDB get request failed.');
297-
};
298-
getRequest.onsuccess = () => {
299-
if (getRequest.result !== undefined) {
300-
// The module already exists. That is not expected!
301-
console.log('IndexedDB get request succeeded, but the module already exists.');
302-
throw new Error('IndexedDB get request succeeded, but the module already exists.');
303-
}
304-
const value = Object.create(null);
305-
value.path = modulePath;
306-
value.type = moduleType;
307-
value.content = moduleContentText;
308-
value.dateModifiedMillis = Date.now();
309-
const putRequest = modulesObjectStore.put(value);
310-
putRequest.onerror = () => {
311-
console.log('IndexedDB put request failed. putRequest.error is...');
312-
console.log(putRequest.error);
313-
throw new Error('IndexedDB put request failed.');
314-
};
315-
};
316-
}
317-
});
318-
}
319260
}

src/storage/common_storage.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,4 @@ export interface Storage {
3131
fetchModuleContentText(modulePath: string): Promise<string>;
3232
saveModule(modulePath: string, moduleContentText: string): Promise<void>;
3333
deleteModule(modulePath: string): Promise<void>;
34-
uploadProject(projectName: string, blobUrl: string): Promise<void>;
3534
}

src/storage/project.ts

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -435,13 +435,23 @@ export function makeUploadProjectName(
435435
return storageNames.makeUniqueName(preferredName, existingProjectNames);
436436
}
437437

438+
export async function uploadProject(
439+
storage: commonStorage.Storage, projectName: string, blobUrl: string): Promise<void> {
440+
// Process the uploaded blob to get the module types and contents.
441+
const classNameToModuleContentText = await processUploadedBlob(blobUrl);
442+
443+
// Save each module.
444+
for (const className in classNameToModuleContentText) {
445+
const moduleContentText = classNameToModuleContentText[className];
446+
const modulePath = storageNames.makeModulePath(projectName, className);
447+
await storage.saveModule(modulePath, moduleContentText);
448+
}
449+
}
450+
438451
/**
439-
* Process the uploaded blob to get the module types and contents.
440-
* Returns a promise of classNameToModuleType and classNameToModuleContentText.
452+
* Process the uploaded blob to get the module class names and contents.
441453
*/
442-
export async function processUploadedBlob(
443-
blobUrl: string)
444-
: Promise<[{ [className: string]: string }, { [className: string]: string }]> {
454+
async function processUploadedBlob(blobUrl: string): Promise<{ [className: string]: string }> {
445455

446456
const prefix = 'data:application/octet-stream;base64,';
447457
if (!blobUrl.startsWith(prefix)) {
@@ -467,28 +477,21 @@ export async function processUploadedBlob(
467477
);
468478

469479
// Process each module's content.
470-
const classNameToModuleType: { [className: string]: string } = {}; // key is class name, value is module type
471-
const classNameToModuleContentText: { [className: string]: string } = {}; // key is class name, value is module content text
480+
let foundRobot = false;
481+
const classNameToModuleContentText: { [className: string]: string } = {}; // value is module content text
472482
for (const filename in files) {
473-
const uploadedContent = files[filename];
474-
const [className, moduleType, moduleContent] = processUploadedModule(
475-
filename, uploadedContent);
476-
classNameToModuleType[className] = moduleType;
477-
classNameToModuleContentText[className] = moduleContent;
483+
const className = filename;
484+
if (className === storageNames.CLASS_NAME_ROBOT) {
485+
foundRobot = true;
486+
}
487+
// Make sure we can parse the content.
488+
const moduleContent = storageModuleContent.parseModuleContentText(files[filename]);
489+
classNameToModuleContentText[className] = moduleContent.getModuleContentText();
478490
}
479491

480-
return [classNameToModuleType, classNameToModuleContentText];
481-
}
492+
if (!foundRobot) {
493+
throw new Error('Uploaded file did not contain a Robot.');
494+
}
482495

483-
/**
484-
* Processes an uploaded module to get the class name, type, and content text.
485-
*/
486-
function processUploadedModule(
487-
filename: string, uploadedContent: string): [string, string, string] {
488-
489-
const moduleContent = storageModuleContent.parseModuleContentText(uploadedContent);
490-
const moduleType = moduleContent.getModuleType();
491-
const className = filename;
492-
const moduleContentText = moduleContent.getModuleContentText();
493-
return [className, moduleType, moduleContentText];
496+
return classNameToModuleContentText;
494497
}

0 commit comments

Comments
 (0)