Remove legacy import flow

This commit is contained in:
Scott Nonnenberg 2020-03-03 18:47:01 -08:00
parent 2105b5341a
commit a840e2e5b1
15 changed files with 20 additions and 559 deletions

View file

@ -382,10 +382,7 @@
showStickerPack: async (packId, key) => {
// We can get these events even if the user has never linked this instance.
if (
Whisper.Import.isIncomplete() ||
!window.Signal.Util.Registration.everDone()
) {
if (!window.Signal.Util.Registration.everDone()) {
return;
}
@ -1287,13 +1284,6 @@
});
}
Whisper.events.on('setupWithImport', () => {
const { appView } = window.owsDesktopApp;
if (appView) {
appView.openImporter();
}
});
Whisper.events.on('setupAsNewDevice', () => {
const { appView } = window.owsDesktopApp;
if (appView) {
@ -1382,10 +1372,7 @@
Whisper.ExpiringMessagesListener.init(Whisper.events);
Whisper.TapToViewMessagesListener.init(Whisper.events);
if (Whisper.Import.isIncomplete()) {
window.log.info('Import was interrupted, showing import error screen');
appView.openImporter();
} else if (window.Signal.Util.Registration.everDone()) {
if (window.Signal.Util.Registration.everDone()) {
// listeners
Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion);
window.Signal.RefreshSenderCertificate.initialize({
@ -1399,8 +1386,6 @@
appView.openInbox({
initialLoadComplete,
});
} else if (window.isImportMode()) {
appView.openImporter();
} else {
appView.openInstaller();
}
@ -1513,9 +1498,6 @@
if (!window.Signal.Util.Registration.everDone()) {
return;
}
if (Whisper.Import.isIncomplete()) {
return;
}
if (messageReceiver) {
await messageReceiver.stopProcessing();
@ -1685,17 +1667,6 @@
);
});
}
if (Whisper.Import.isComplete()) {
wrap(
textsecure.messaging.sendRequestConfigurationSyncMessage(sendOptions)
).catch(error => {
window.log.error(
'Import complete, but failed to send sync message',
error && error.stack ? error.stack : error
);
});
}
}
storage.onready(async () => {

View file

@ -866,25 +866,25 @@ async function exportConversations(options) {
window.log.info('Done exporting conversations!');
}
function getDirectory(options = {}) {
return new Promise((resolve, reject) => {
const browserWindow = BrowserWindow.getFocusedWindow();
const dialogOptions = {
title: options.title,
properties: ['openDirectory'],
buttonLabel: options.buttonLabel,
};
async function getDirectory(options = {}) {
const browserWindow = BrowserWindow.getFocusedWindow();
const dialogOptions = {
title: options.title,
properties: ['openDirectory'],
buttonLabel: options.buttonLabel,
};
dialog.showOpenDialog(browserWindow, dialogOptions, directory => {
if (!directory || !directory[0]) {
const error = new Error('Error choosing directory');
error.name = 'ChooseError';
return reject(error);
}
const { canceled, filePaths } = await dialog.showOpenDialog(
browserWindow,
dialogOptions
);
if (canceled || !filePaths || !filePaths[0]) {
const error = new Error('Error choosing directory');
error.name = 'ChooseError';
throw error;
}
return resolve(directory[0]);
});
});
return filePaths[0];
}
function getDirContents(dir) {

View file

@ -66,40 +66,8 @@
this.debugLogView = null;
}
},
openImporter() {
window.addSetupMenuItems();
this.resetViews();
const importView = new Whisper.ImportView();
this.importView = importView;
this.listenTo(
importView,
'light-import',
this.finishLightImport.bind(this)
);
this.openView(this.importView);
},
finishLightImport() {
const options = {
hasExistingData: true,
};
this.openInstaller(options);
},
closeImporter() {
if (this.importView) {
this.importView.remove();
this.importView = null;
}
},
openInstaller(options = {}) {
// If we're in the middle of import, we don't want to show the menu options
// allowing the user to switch to other ways to set up the app. If they
// switched back and forth in the middle of a light import, they'd lose all
// that imported data.
if (!options.hasExistingData) {
window.addSetupMenuItems();
}
window.addSetupMenuItems();
this.resetViews();
const installView = new Whisper.InstallView(options);
@ -129,7 +97,6 @@
},
resetViews() {
this.closeInstaller();
this.closeImporter();
this.closeStandalone();
},
openInbox(options = {}) {

View file

@ -1,212 +0,0 @@
/* global Whisper, storage, i18n, ConversationController */
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
'use strict';
window.Whisper = window.Whisper || {};
const State = {
IMPORTING: 1,
COMPLETE: 2,
LIGHT_COMPLETE: 3,
};
const IMPORT_STARTED = 'importStarted';
const IMPORT_COMPLETE = 'importComplete';
const IMPORT_LOCATION = 'importLocation';
Whisper.Import = {
isStarted() {
return Boolean(storage.get(IMPORT_STARTED));
},
isComplete() {
return Boolean(storage.get(IMPORT_COMPLETE));
},
isIncomplete() {
return this.isStarted() && !this.isComplete();
},
start() {
return storage.put(IMPORT_STARTED, true);
},
complete() {
return storage.put(IMPORT_COMPLETE, true);
},
saveLocation(location) {
return storage.put(IMPORT_LOCATION, location);
},
reset() {
return window.Signal.Data.removeAll();
},
};
Whisper.ImportView = Whisper.View.extend({
templateName: 'import-flow-template',
className: 'full-screen-flow',
events: {
'click .choose': 'onImport',
'click .restart': 'onRestart',
'click .cancel': 'onCancel',
'click .register': 'onRegister',
},
initialize() {
if (Whisper.Import.isIncomplete()) {
this.error = true;
}
this.render();
this.pending = Promise.resolve();
},
render_attributes() {
if (this.error) {
return {
isError: true,
errorHeader: i18n('importErrorHeader'),
errorMessageFirst: i18n('importErrorFirst'),
errorMessageSecond: i18n('importErrorSecond'),
chooseButton: i18n('importAgain'),
};
}
let restartButton = i18n('importCompleteStartButton');
let registerButton = i18n('importCompleteLinkButton');
let step = 'step2';
if (this.state === State.IMPORTING) {
step = 'step3';
} else if (this.state === State.COMPLETE) {
registerButton = null;
step = 'step4';
} else if (this.state === State.LIGHT_COMPLETE) {
restartButton = null;
step = 'step4';
}
return {
isStep2: step === 'step2',
chooseHeader: i18n('loadDataHeader'),
choose: i18n('loadDataDescription'),
chooseButton: i18n('chooseDirectory'),
isStep3: step === 'step3',
importingHeader: i18n('importingHeader'),
isStep4: step === 'step4',
completeHeader: i18n('importCompleteHeader'),
restartButton,
registerButton,
};
},
onRestart() {
return window.restart();
},
onCancel() {
this.trigger('cancel');
},
onImport() {
window.Signal.Backup.getDirectoryForImport().then(
directory => {
this.doImport(directory);
},
error => {
if (error.name !== 'ChooseError') {
window.log.error(
'Error choosing directory:',
error && error.stack ? error.stack : error
);
}
}
);
},
onRegister() {
// AppView listens for this, and opens up InstallView to the QR code step to
// finish setting this device up.
this.trigger('light-import');
},
doImport(directory) {
window.removeSetupMenuItems();
this.error = null;
this.state = State.IMPORTING;
this.render();
// Wait for prior database interaction to complete
this.pending = this.pending
.then(() =>
// For resilience to interruption, clear database both before and on failure
Whisper.Import.reset()
)
.then(() =>
Promise.all([
Whisper.Import.start(),
window.Signal.Backup.importFromDirectory(directory),
])
)
.then(results => {
const importResult = results[1];
// A full import changes so much we need a restart of the app
if (importResult.fullImport) {
return this.finishFullImport(directory);
}
// A light import just brings in contacts, groups, and messages. And we need a
// normal link to finish the process.
return this.finishLightImport(directory);
})
.catch(error => {
window.log.error(
'Error importing:',
error && error.stack ? error.stack : error
);
this.error = error || new Error('Something went wrong!');
this.state = null;
this.render();
return Whisper.Import.reset();
});
},
finishLightImport(directory) {
ConversationController.reset();
return ConversationController.load()
.then(() =>
Promise.all([
Whisper.Import.saveLocation(directory),
Whisper.Import.complete(),
])
)
.then(() => {
this.state = State.LIGHT_COMPLETE;
this.render();
});
},
finishFullImport(directory) {
// 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(() =>
Promise.all([
// Clearing any migration-related state inherited from the Chrome App
storage.remove('migrationState'),
storage.remove('migrationEnabled'),
storage.remove('migrationEverCompleted'),
storage.remove('migrationStorageLocation'),
Whisper.Import.saveLocation(directory),
Whisper.Import.complete(),
])
)
.then(() => {
this.state = State.COMPLETE;
this.render();
});
},
});
})();