diff --git a/src/Modal.tsx b/src/Modal.tsx index 1e84078ddb..a802e36d96 100644 --- a/src/Modal.tsx +++ b/src/Modal.tsx @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import ReactDOM from 'react-dom'; import classNames from 'classnames'; -import { defer } from "matrix-js-sdk/src/utils"; +import { defer, sleep } from "matrix-js-sdk/src/utils"; import Analytics from './Analytics'; import dis from './dispatcher/dispatcher'; @@ -332,7 +332,10 @@ export class ModalManager { return this.priorityModal ? this.priorityModal : (this.modals[0] || this.staticModal); } - private reRender() { + private async reRender() { + // await next tick because sometimes ReactDOM can race with itself and cause the modal to wrongly stick around + await sleep(0); + if (this.modals.length === 0 && !this.priorityModal && !this.staticModal) { // If there is no modal to render, make all of Element available // to screen reader users again diff --git a/src/Terms.ts b/src/Terms.ts index 86d006c832..218ad8ab6f 100644 --- a/src/Terms.ts +++ b/src/Terms.ts @@ -181,7 +181,7 @@ export async function startTermsFlow( return Promise.all(agreePromises); } -export function dialogTermsInteractionCallback( +export async function dialogTermsInteractionCallback( policiesAndServicePairs: { service: Service; policies: { [policy: string]: Policy }; @@ -189,21 +189,18 @@ export function dialogTermsInteractionCallback( agreedUrls: string[], extraClassNames?: string, ): Promise { - return new Promise((resolve, reject) => { - logger.log("Terms that need agreement", policiesAndServicePairs); - // FIXME: Using an import will result in test failures - const TermsDialog = sdk.getComponent("views.dialogs.TermsDialog"); + logger.log("Terms that need agreement", policiesAndServicePairs); + // FIXME: Using an import will result in test failures + const TermsDialog = sdk.getComponent("views.dialogs.TermsDialog"); - Modal.createTrackedDialog('Terms of Service', '', TermsDialog, { - policiesAndServicePairs, - agreedUrls, - onFinished: (done, agreedUrls) => { - if (!done) { - reject(new TermsNotSignedError()); - return; - } - resolve(agreedUrls); - }, - }, classNames("mx_TermsDialog", extraClassNames)); - }); + const { finished } = Modal.createTrackedDialog<[boolean, string[]]>('Terms of Service', '', TermsDialog, { + policiesAndServicePairs, + agreedUrls, + }, classNames("mx_TermsDialog", extraClassNames)); + + const [done, _agreedUrls] = await finished; + if (!done) { + throw new TermsNotSignedError(); + } + return _agreedUrls; }