Merge pull request #1907 from matrix-org/dbkr/wait_for_widget_delete

Wait for deletion of widgets as well addition
This commit is contained in:
David Baker 2018-05-15 17:39:53 +01:00 committed by GitHub
commit 9dd90fb63f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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,