Extremely bad support for "temporary widgets"

This commit is contained in:
Travis Ralston 2020-09-21 14:36:16 -06:00
parent c1d9d96702
commit 342f1d5b43
7 changed files with 287 additions and 6 deletions

View file

@ -39,6 +39,12 @@ export enum KnownWidgetActions {
SetAlwaysOnScreen = "set_always_on_screen",
ClientReady = "im.vector.ready",
Terminate = "im.vector.terminate",
OpenTempWidget = "io.element.start_temp",
UpdateThemeInfo = "io.element.theme_info",
SendWidgetConfig = "io.element.widget_config",
CloseWidget = "io.element.exit",
ClosedWidgetResponse = "io.element.exit_response",
}
export type WidgetAction = KnownWidgetActions | string;
@ -134,6 +140,19 @@ export class WidgetApi extends EventEmitter {
// Save OpenID credentials
this.setOpenIDCredentials(<ToWidgetRequest>payload);
this.replyToRequest(<ToWidgetRequest>payload, {});
} else if (payload.action === KnownWidgetActions.UpdateThemeInfo
|| payload.action === KnownWidgetActions.SendWidgetConfig
|| payload.action === KnownWidgetActions.ClosedWidgetResponse) {
// Finalization needs to be async, so postpone with a promise
let finalizePromise = Promise.resolve();
const wait = (promise) => {
finalizePromise = finalizePromise.then(() => promise);
};
this.emit(payload.action, payload, wait);
Promise.resolve(finalizePromise).then(() => {
// Acknowledge that we're shut down now
this.replyToRequest(<ToWidgetRequest>payload, {});
});
} else {
console.warn(`[WidgetAPI] Got unexpected action: ${payload.action}`);
}
@ -203,9 +222,8 @@ export class WidgetApi extends EventEmitter {
response: {}, // Not used at this layer - it's used when the client responds
};
if (callback) {
this.inFlightRequests[request.requestId] = callback;
}
if (!callback) callback = () => {}; // noop
this.inFlightRequests[request.requestId] = callback;
console.log(`[WidgetAPI] Sending request: `, request);
window.parent.postMessage(request, "*");
@ -217,4 +235,18 @@ export class WidgetApi extends EventEmitter {
resolve(); // SetAlwaysOnScreen is currently fire-and-forget, but that could change.
});
}
public closeWidget(exitData: any): Promise<any> {
return new Promise<any>(resolve => {
this.callAction(KnownWidgetActions.CloseWidget, exitData, null);
resolve();
});
}
public openTempWidget(url: string, data: any): Promise<any> {
return new Promise<any>(resolve => {
this.callAction(KnownWidgetActions.OpenTempWidget, {url, data}, null);
resolve();
});
}
}