diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 2211e513c3..9be7730c3a 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -239,6 +239,7 @@ import WidgetUtils from './utils/WidgetUtils'; import RoomViewStore from './stores/RoomViewStore'; import { _t } from './languageHandler'; import {IntegrationManagers} from "./integrations/IntegrationManagers"; +import {WidgetType} from "./widgets/WidgetType"; function sendResponse(event, res) { const data = JSON.parse(JSON.stringify(event.data)); @@ -290,7 +291,7 @@ function inviteUser(event, roomId, userId) { function setWidget(event, roomId) { const widgetId = event.data.widget_id; - const widgetType = event.data.type; + let widgetType = event.data.type; const widgetUrl = event.data.url; const widgetName = event.data.name; // optional const widgetData = event.data.data; // optional @@ -322,6 +323,9 @@ function setWidget(event, roomId) { } } + // convert the widget type to a known widget type + widgetType = WidgetType.fromString(widgetType); + if (userWidget) { WidgetUtils.setUserWidget(widgetId, widgetType, widgetUrl, widgetName, widgetData).then(() => { sendResponse(event, { diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index d60434cf97..0afea63a78 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -35,6 +35,7 @@ import { abbreviateUrl } from './utils/UrlUtils'; import { getDefaultIdentityServerUrl, useDefaultIdentityServer } from './utils/IdentityServerUtils'; import {isPermalinkHost, parsePermalink} from "./utils/permalinks/Permalinks"; import {inviteUsersToRoom} from "./RoomInvite"; +import { WidgetType } from "./widgets/WidgetType"; // XXX: workaround for https://github.com/microsoft/TypeScript/issues/31816 interface HTMLInputEvent extends Event { @@ -775,7 +776,7 @@ export const Commands = [ const nowMs = (new Date()).getTime(); const widgetId = encodeURIComponent(`${roomId}_${userId}_${nowMs}`); return success(WidgetUtils.setRoomWidget( - roomId, widgetId, "m.custom", args, "Custom Widget", {})); + roomId, widgetId, WidgetType.CUSTOM, args, "Custom Widget", {})); } else { return reject(_t("You cannot modify widgets in this room.")); } diff --git a/src/widgets/WidgetType.ts b/src/widgets/WidgetType.ts index 7608819bb9..09c30430dd 100644 --- a/src/widgets/WidgetType.ts +++ b/src/widgets/WidgetType.ts @@ -16,6 +16,7 @@ limitations under the License. export class WidgetType { public static readonly JITSI = new WidgetType("m.jitsi", "jitsi"); + public static readonly CUSTOM = new WidgetType("m.custom", "m.custom"); constructor(public readonly preferred: string, public readonly legacy: string) { } @@ -23,4 +24,14 @@ export class WidgetType { public matches(type: string): boolean { return type === this.preferred || type === this.legacy; } + + static fromString(type: string): WidgetType { + // First try and match it against something we're already aware of + const known = Object.values(WidgetType).filter(v => v instanceof WidgetType); + const knownMatch = known.find(w => w.matches(type)); + if (knownMatch) return knownMatch; + + // If that fails, invent a new widget type + return new WidgetType(type, type); + } }