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) { | ||||
|     const widgetId = event.data.widget_id; | ||||
|     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(() => { | ||||
|             return widgetAddPromise; | ||||
|         }).then(() => { | ||||
|             sendResponse(event, { | ||||
|                 success: true, | ||||
|             }); | ||||
|  | @ -373,6 +405,7 @@ function setWidget(event, roomId) { | |||
|         // TODO - Room widgets need to be moved to 'm.widget' state events
 | ||||
|         // https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit?usp=sharing
 | ||||
|         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, { | ||||
|                 success: true, | ||||
|             }); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 David Baker
						David Baker