mirror of https://github.com/vector-im/riot-web
Wait for echo from server when adding user widgets
As hopefully all explained in comments. Fixes https://github.com/vector-im/riot-web/issues/6727pull/21833/head
parent
7bfc50bf42
commit
2956c049d6
|
@ -286,6 +286,30 @@ function inviteUser(event, roomId, userId) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a promise that resolves when a widget with the given
|
||||||
|
* ID has been added as a user widget (ie. the accountData event
|
||||||
|
* arrives) or rejects after a timeout
|
||||||
|
*/
|
||||||
|
function waitForUserWidget(widgetId) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let timerId;
|
||||||
|
function onAccountData(ev) {
|
||||||
|
if (ev.getContent()[widgetId] !== undefined) {
|
||||||
|
MatrixClientPeg.get().removeListener('accountData', onAccountData);
|
||||||
|
clearTimeout(timerId);
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
timerId = setTimeout(() => {
|
||||||
|
console.log("Timed out waiting for widget ID " + widgetId + " to appear");
|
||||||
|
MatrixClientPeg.get().removeListener('accountData', onAccountData);
|
||||||
|
reject();
|
||||||
|
}, 10000);
|
||||||
|
MatrixClientPeg.get().on('accountData', onAccountData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function setWidget(event, roomId) {
|
function setWidget(event, roomId) {
|
||||||
const widgetId = event.data.widget_id;
|
const widgetId = event.data.widget_id;
|
||||||
const widgetType = event.data.type;
|
const widgetType = event.data.type;
|
||||||
|
@ -355,7 +379,15 @@ function setWidget(event, roomId) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This starts listening for when the echo comes back from the server
|
||||||
|
// since the widget won't appear added until this happens. If we don't
|
||||||
|
// wait for this, the action will complete but if the user is fast enough,
|
||||||
|
// the widget still won't actually be there.
|
||||||
|
// start listening now otherwise we could race
|
||||||
|
const widgetAddPromise = waitForUserWidget(widgetId);
|
||||||
client.setAccountData('m.widgets', userWidgets).then(() => {
|
client.setAccountData('m.widgets', userWidgets).then(() => {
|
||||||
|
return widgetAddPromise;
|
||||||
|
}).then(() => {
|
||||||
sendResponse(event, {
|
sendResponse(event, {
|
||||||
success: true,
|
success: true,
|
||||||
});
|
});
|
||||||
|
@ -373,6 +405,7 @@ function setWidget(event, roomId) {
|
||||||
// TODO - Room widgets need to be moved to 'm.widget' state events
|
// TODO - Room widgets need to be moved to 'm.widget' state events
|
||||||
// https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing
|
// https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing
|
||||||
client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).done(() => {
|
client.sendStateEvent(roomId, "im.vector.modular.widgets", content, widgetId).done(() => {
|
||||||
|
// XXX: We should probably wait for the echo of the state event to come back from the server,
|
||||||
sendResponse(event, {
|
sendResponse(event, {
|
||||||
success: true,
|
success: true,
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue