diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 40e985a5aa..9a57ab5bce 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -235,6 +235,7 @@ const SdkConfig = require('./SdkConfig'); const MatrixClientPeg = require("./MatrixClientPeg"); const MatrixEvent = require("matrix-js-sdk").MatrixEvent; const dis = require("./dispatcher"); +const Widgets = require('./utils/widgets'); import { _t } from './languageHandler'; function sendResponse(event, res) { @@ -405,10 +406,8 @@ function getWidgets(event, roomId) { } // Add user widgets (not linked to a specific room) - const userWidgets = client.getAccountData('m.widgets').getContent() || {}; - const userWidgetArray = Object.keys(userWidgets).map((key) => userWidgets[key]); - widgetStateEvents = widgetStateEvents.concat(userWidgetArray); - console.warn('Sending user widgets', userWidgetArray); + const userWidgets = Widgets.getUserWidgets(); + widgetStateEvents = widgetStateEvents.concat(userWidgets); sendResponse(event, widgetStateEvents); } diff --git a/src/utils/widgets.js b/src/utils/widgets.js new file mode 100644 index 0000000000..4e26fa6ceb --- /dev/null +++ b/src/utils/widgets.js @@ -0,0 +1,56 @@ +import MatrixClientPeg from '../MatrixClientPeg'; + +/** + * Get all widgets (user and room) for the current user + * @param {object} room The room to get widgets for + * @return {[object]} Array containing current / active room and user widget state events + */ +function getWidgets(room) { + const widgets = getRoomWidgets(room); + widgets.concat(getUserWidgets()); + return widgets; +} + +/** + * Get room specific widgets + * @param {object} room The room to get widgets force + * @return {[object]} Array containing current / active room widgets + */ +function getRoomWidgets(room) { + const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); + if (!appsStateEvents) { + return []; + } + + return appsStateEvents.filter((ev) => { + return ev.getContent().type && ev.getContent().url; + }); +} + +/** + * Get user specific widgets (not linked to a specific room) + * @return {[object]} Array containing current / active user widgets + */ +function getUserWidgets() { + const client = MatrixClientPeg.get(); + if (!client) { + throw new Error('User not logged in'); + } + const userWidgets = client.getAccountData('m.widgets').getContent() || {}; + return Object.keys(userWidgets).map((key) => userWidgets[key]); +} + +/** + * Get active stickerpack widgets (stickerpacks are user widgets by nature) + * @return {[object]} Array containing current / active stickerpack widgets + */ +function getStickerpackWidgets() { + return getUserWidgets().filter((widget) => widget.type='stickerpack'); +} + +export default { + getWidgets, + getRoomWidgets, + getUserWidgets, + getStickerpackWidgets, +};