From 413fba80afeb1628c994b5153342fa3373fbc264 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Mon, 7 Aug 2017 18:34:33 -0700 Subject: [PATCH] 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 --- _locales/en/messages.json | 2 +- js/backup.js | 57 ++++++++++++++++++++------------------- js/views/import_view.js | 34 +++++++++++------------ 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index ef98423ed..baa5a7794 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -483,7 +483,7 @@ "description": "One of two choices presented on the screen shown on first launch" }, "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" }, "installGetStartedButton": { diff --git a/js/backup.js b/js/backup.js index 48cee70b4..997e0254c 100644 --- a/js/backup.js +++ b/js/backup.js @@ -709,32 +709,34 @@ return moment().format('YYYY MMM Do [at] h.mm.ss a'); } + // directories returned and taken by backup/import are all string paths Whisper.Backup = { clearDatabase: function() { return openDatabase().then(function(idb_db) { return clearAllStores(idb_db); }); }, - backupToDirectory: function() { + getDirectoryForExport: function() { var options = { title: i18n('exportChooserTitle'), buttonLabel: i18n('exportButton'), }; - return getDirectory(options).then(function(directory) { - var idb; - var dir; - return openDatabase().then(function(idb_db) { - idb = idb_db; - var name = 'Signal Export ' + getTimestamp(); - return createDirectory(directory, name); - }).then(function(created) { - dir = created; - return exportNonMessages(idb, dir); - }).then(function() { - return exportConversations(idb, dir); - }).then(function() { - return dir; - }); + return getDirectory(options); + }, + backupToDirectory: function(directory) { + var dir; + var idb; + return openDatabase().then(function(idb_db) { + idb = idb_db; + var name = 'Signal Export ' + getTimestamp(); + return createDirectory(directory, name); + }).then(function(created) { + dir = created; + return exportNonMessages(idb, dir); + }).then(function() { + return exportConversations(idb, dir); + }).then(function() { + return dir; }).then(function(path) { console.log('done backing up!'); return path; @@ -746,21 +748,22 @@ return Promise.reject(error); }); }, - importFromDirectory: function() { + getDirectoryForImport: function() { var options = { title: i18n('importChooserTitle'), buttonLabel: i18n('importButton'), }; - return getDirectory(options).then(function(directory) { - var idb; - return openDatabase().then(function(idb_db) { - idb = idb_db; - return importNonMessages(idb_db, directory); - }).then(function() { - return importConversations(idb, directory); - }).then(function() { - return directory; - }); + return getDirectory(options); + }, + importFromDirectory: function(directory) { + var idb; + return openDatabase().then(function(idb_db) { + idb = idb_db; + return importNonMessages(idb_db, directory); + }).then(function() { + return importConversations(idb, directory); + }).then(function() { + return directory; }).then(function(path) { console.log('done restoring from backup!'); return path; diff --git a/js/views/import_view.js b/js/views/import_view.js index 8d43ab658..dd1ca7bb0 100644 --- a/js/views/import_view.js +++ b/js/views/import_view.js @@ -99,54 +99,52 @@ this.trigger('cancel'); }, 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.state = State.IMPORTING; this.render(); - var importLocation; - // Wait for prior database interaction to complete this.pending = this.pending.then(function() { // For resilience to interruptions, clear database both before import and after return Whisper.Backup.clearDatabase(); }).then(function() { Whisper.Import.start(); - return Whisper.Backup.importFromDirectory(); - }).then(function(directory) { - importLocation = directory; - + return Whisper.Backup.importFromDirectory(directory); + }).then(function() { // Catching in-memory cache up with what's in indexeddb now... // 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. return storage.fetch(); }).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('migrationEnabled'); storage.remove('migrationEverCompleted'); storage.remove('migrationStorageLocation'); - if (importLocation) { - Whisper.Import.saveLocation(importLocation); - } - + Whisper.Import.saveLocation(directory); Whisper.Import.complete(); this.state = State.COMPLETE; this.render(); }.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.render(); - if (this.error) { - return Whisper.Backup.clearDatabase(); - } + return Whisper.Backup.clearDatabase(); }.bind(this)); } });