diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 0c10642cd7..9457e6ccfb 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -292,22 +292,32 @@ function inviteUser(event, roomId, userId) { * arrives) or rejects after a timeout * * @param {string} widgetId The ID of the widget to wait for + * @param {boolean} add True to wait for the widget to be added, + * false to wait for it to be deleted. * @returns {Promise} that resolves when the widget is available */ -function waitForUserWidget(widgetId) { +function waitForUserWidget(widgetId, add) { return new Promise((resolve, reject) => { const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); - if ( - currentAccountDataEvent && - currentAccountDataEvent.getContent() && - currentAccountDataEvent.getContent()[widgetId] !== undefined - ) { + + // Tests an account data event, returning true if it's in the state + // we're waiting for it to be in + function eventInIntendedState(ev) { + if (!ev || !currentAccountDataEvent.getContent()) return false; + if (add) { + return ev.getContent()[widgetId] !== undefined; + } else { + return ev.getContent()[widgetId] === undefined; + } + } + + if (eventInIntendedState(currentAccountDataEvent)) { resolve(); return; } function onAccountData(ev) { - if (ev.getType() === 'm.widgets' && ev.getContent() && ev.getContent()[widgetId] !== undefined) { + if (eventInIntendedState(currentAccountDataEvent)) { MatrixClientPeg.get().removeListener('accountData', onAccountData); clearTimeout(timerId); resolve(); @@ -395,7 +405,7 @@ function setWidget(event, roomId) { // wait for this, the action will complete but if the user is fast enough, // the widget still won't actually be there. client.setAccountData('m.widgets', userWidgets).then(() => { - return waitForUserWidget(widgetId); + return waitForUserWidget(widgetId, widgetUrl !== null); }).then(() => { sendResponse(event, { success: true,