Separate dir selection from import, better import button text

This allows us to show the 'import in progress' screen only when the
user has successfully selected a directory.

FREEBIE
pull/749/head
Scott Nonnenberg 8 years ago
parent 0fbe43c2dc
commit 413fba80af
No known key found for this signature in database
GPG Key ID: A4931C09644C654B

@ -483,7 +483,7 @@
"description": "One of two choices presented on the screen shown on first launch" "description": "One of two choices presented on the screen shown on first launch"
}, },
"installImport": { "installImport": {
"message": "Set up with exported data", "message": "Set up with Chrome App export",
"description": "One of two choices presented on the screen shown on first launch" "description": "One of two choices presented on the screen shown on first launch"
}, },
"installGetStartedButton": { "installGetStartedButton": {

@ -709,20 +709,23 @@
return moment().format('YYYY MMM Do [at] h.mm.ss a'); return moment().format('YYYY MMM Do [at] h.mm.ss a');
} }
// directories returned and taken by backup/import are all string paths
Whisper.Backup = { Whisper.Backup = {
clearDatabase: function() { clearDatabase: function() {
return openDatabase().then(function(idb_db) { return openDatabase().then(function(idb_db) {
return clearAllStores(idb_db); return clearAllStores(idb_db);
}); });
}, },
backupToDirectory: function() { getDirectoryForExport: function() {
var options = { var options = {
title: i18n('exportChooserTitle'), title: i18n('exportChooserTitle'),
buttonLabel: i18n('exportButton'), buttonLabel: i18n('exportButton'),
}; };
return getDirectory(options).then(function(directory) { return getDirectory(options);
var idb; },
backupToDirectory: function(directory) {
var dir; var dir;
var idb;
return openDatabase().then(function(idb_db) { return openDatabase().then(function(idb_db) {
idb = idb_db; idb = idb_db;
var name = 'Signal Export ' + getTimestamp(); var name = 'Signal Export ' + getTimestamp();
@ -734,7 +737,6 @@
return exportConversations(idb, dir); return exportConversations(idb, dir);
}).then(function() { }).then(function() {
return dir; return dir;
});
}).then(function(path) { }).then(function(path) {
console.log('done backing up!'); console.log('done backing up!');
return path; return path;
@ -746,12 +748,14 @@
return Promise.reject(error); return Promise.reject(error);
}); });
}, },
importFromDirectory: function() { getDirectoryForImport: function() {
var options = { var options = {
title: i18n('importChooserTitle'), title: i18n('importChooserTitle'),
buttonLabel: i18n('importButton'), buttonLabel: i18n('importButton'),
}; };
return getDirectory(options).then(function(directory) { return getDirectory(options);
},
importFromDirectory: function(directory) {
var idb; var idb;
return openDatabase().then(function(idb_db) { return openDatabase().then(function(idb_db) {
idb = idb_db; idb = idb_db;
@ -760,7 +764,6 @@
return importConversations(idb, directory); return importConversations(idb, directory);
}).then(function() { }).then(function() {
return directory; return directory;
});
}).then(function(path) { }).then(function(path) {
console.log('done restoring from backup!'); console.log('done restoring from backup!');
return path; return path;

@ -99,54 +99,52 @@
this.trigger('cancel'); this.trigger('cancel');
}, },
onImport: function() { onImport: function() {
Whisper.Backup.getDirectoryForImport().then(function(directory) {
this.doImport(directory);
}.bind(this), function(error) {
if (error.name !== 'ChooseError') {
console.log('Error choosing directory:', error && error.stack ? error.stack : error);
}
});
},
doImport: function(directory) {
this.error = null; this.error = null;
this.state = State.IMPORTING; this.state = State.IMPORTING;
this.render(); this.render();
var importLocation;
// Wait for prior database interaction to complete // Wait for prior database interaction to complete
this.pending = this.pending.then(function() { this.pending = this.pending.then(function() {
// For resilience to interruptions, clear database both before import and after // For resilience to interruptions, clear database both before import and after
return Whisper.Backup.clearDatabase(); return Whisper.Backup.clearDatabase();
}).then(function() { }).then(function() {
Whisper.Import.start(); Whisper.Import.start();
return Whisper.Backup.importFromDirectory(); return Whisper.Backup.importFromDirectory(directory);
}).then(function(directory) { }).then(function() {
importLocation = directory;
// Catching in-memory cache up with what's in indexeddb now... // Catching in-memory cache up with what's in indexeddb now...
// NOTE: this fires storage.onready, listened to across the app. We'll restart // NOTE: this fires storage.onready, listened to across the app. We'll restart
// to complete the install to start up cleanly with everything now in the DB. // to complete the install to start up cleanly with everything now in the DB.
return storage.fetch(); return storage.fetch();
}).then(function() { }).then(function() {
// Clearing any migration-related state inherited from the Chome App // Clearing any migration-related state inherited from the Chrome App
storage.remove('migrationState'); storage.remove('migrationState');
storage.remove('migrationEnabled'); storage.remove('migrationEnabled');
storage.remove('migrationEverCompleted'); storage.remove('migrationEverCompleted');
storage.remove('migrationStorageLocation'); storage.remove('migrationStorageLocation');
if (importLocation) { Whisper.Import.saveLocation(directory);
Whisper.Import.saveLocation(importLocation);
}
Whisper.Import.complete(); Whisper.Import.complete();
this.state = State.COMPLETE; this.state = State.COMPLETE;
this.render(); this.render();
}.bind(this)).catch(function(error) { }.bind(this)).catch(function(error) {
if (error.name !== 'ChooseError') {
this.error = error.message;
console.log('Error importing:', error && error.stack ? error.stack : error); console.log('Error importing:', error && error.stack ? error.stack : error);
}
this.error = error.message;
this.state = null; this.state = null;
this.render(); this.render();
if (this.error) {
return Whisper.Backup.clearDatabase(); return Whisper.Backup.clearDatabase();
}
}.bind(this)); }.bind(this));
} }
}); });

Loading…
Cancel
Save