WIP on AppTile2 transformation
This commit is contained in:
parent
96fa34eecf
commit
4ea3376abf
4 changed files with 106 additions and 52 deletions
|
@ -17,6 +17,7 @@ limitations under the License.
|
|||
import EventEmitter from 'events';
|
||||
|
||||
import {MatrixClientPeg} from '../MatrixClientPeg';
|
||||
import {WidgetMessagingStore} from "./widgets/WidgetMessagingStore";
|
||||
|
||||
/**
|
||||
* Stores information about the widgets active in the app right now:
|
||||
|
@ -29,15 +30,6 @@ class ActiveWidgetStore extends EventEmitter {
|
|||
super();
|
||||
this._persistentWidgetId = null;
|
||||
|
||||
// A list of negotiated capabilities for each widget, by ID
|
||||
// {
|
||||
// widgetId: [caps...],
|
||||
// }
|
||||
this._capsByWidgetId = {};
|
||||
|
||||
// A WidgetMessaging instance for each widget ID
|
||||
this._widgetMessagingByWidgetId = {};
|
||||
|
||||
// What room ID each widget is associated with (if it's a room widget)
|
||||
this._roomIdByWidgetId = {};
|
||||
|
||||
|
@ -54,8 +46,6 @@ class ActiveWidgetStore extends EventEmitter {
|
|||
if (MatrixClientPeg.get()) {
|
||||
MatrixClientPeg.get().removeListener('RoomState.events', this.onRoomStateEvents);
|
||||
}
|
||||
this._capsByWidgetId = {};
|
||||
this._widgetMessagingByWidgetId = {};
|
||||
this._roomIdByWidgetId = {};
|
||||
}
|
||||
|
||||
|
@ -76,9 +66,16 @@ class ActiveWidgetStore extends EventEmitter {
|
|||
if (id !== this._persistentWidgetId) return;
|
||||
const toDeleteId = this._persistentWidgetId;
|
||||
|
||||
const result = WidgetMessagingStore.instance.findWidgetById(id);
|
||||
if (result) {
|
||||
if (result.room) {
|
||||
WidgetMessagingStore.instance.stopMessagingForRoomWidget(result.room, result.widget);
|
||||
} else {
|
||||
WidgetMessagingStore.instance.stopMessagingForAccountWidget(result.widget);
|
||||
}
|
||||
}
|
||||
|
||||
this.setWidgetPersistence(toDeleteId, false);
|
||||
this.delWidgetMessaging(toDeleteId);
|
||||
this.delWidgetCapabilities(toDeleteId);
|
||||
this.delRoomId(toDeleteId);
|
||||
}
|
||||
|
||||
|
@ -99,43 +96,6 @@ class ActiveWidgetStore extends EventEmitter {
|
|||
return this._persistentWidgetId;
|
||||
}
|
||||
|
||||
setWidgetCapabilities(widgetId, caps) {
|
||||
this._capsByWidgetId[widgetId] = caps;
|
||||
this.emit('update');
|
||||
}
|
||||
|
||||
widgetHasCapability(widgetId, cap) {
|
||||
return this._capsByWidgetId[widgetId] && this._capsByWidgetId[widgetId].includes(cap);
|
||||
}
|
||||
|
||||
delWidgetCapabilities(widgetId) {
|
||||
delete this._capsByWidgetId[widgetId];
|
||||
this.emit('update');
|
||||
}
|
||||
|
||||
setWidgetMessaging(widgetId, wm) {
|
||||
// Stop any existing widget messaging first
|
||||
this.delWidgetMessaging(widgetId);
|
||||
this._widgetMessagingByWidgetId[widgetId] = wm;
|
||||
this.emit('update');
|
||||
}
|
||||
|
||||
getWidgetMessaging(widgetId) {
|
||||
return this._widgetMessagingByWidgetId[widgetId];
|
||||
}
|
||||
|
||||
delWidgetMessaging(widgetId) {
|
||||
if (this._widgetMessagingByWidgetId[widgetId]) {
|
||||
try {
|
||||
this._widgetMessagingByWidgetId[widgetId].stop();
|
||||
} catch (e) {
|
||||
console.error('Failed to stop listening for widgetMessaging events', e.message);
|
||||
}
|
||||
delete this._widgetMessagingByWidgetId[widgetId];
|
||||
this.emit('update');
|
||||
}
|
||||
}
|
||||
|
||||
getRoomId(widgetId) {
|
||||
return this._roomIdByWidgetId[widgetId];
|
||||
}
|
||||
|
|
|
@ -51,6 +51,25 @@ export class WidgetMessagingStore extends AsyncStoreWithClient<unknown> {
|
|||
this.widgetMap.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a widget by ID. Not guaranteed to return an accurate result.
|
||||
* @param {string} id The widget ID.
|
||||
* @returns {{widget, room}} The widget and possible room ID, or a falsey value
|
||||
* if not found.
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
public findWidgetById(id: string): { widget: Widget, room?: Room } {
|
||||
for (const key of this.widgetMap.keys()) {
|
||||
for (const [entityId, surrogate] of this.widgetMap.get(key).entries()) {
|
||||
if (surrogate.definition.id === id) {
|
||||
const room: Room = this.matrixClient?.getRoom(entityId); // will be null for non-rooms
|
||||
return {room, widget: surrogate.definition};
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the messaging instance for the widget. Returns a falsey value if none
|
||||
* is present.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue