22 lines
848 B
TypeScript
22 lines
848 B
TypeScript
|
|
import { Room } from 'matrix-js-sdk';
|
||
|
|
import { useMemo } from 'react';
|
||
|
|
import { Widget, WidgetParser, IStateEvent } from 'matrix-widget-api';
|
||
|
|
import { StateEvent } from '../../../../types/matrix/room';
|
||
|
|
import { useRoomState } from '../../../hooks/useRoomState';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* All valid `im.vector.modular.widgets` room widgets, reactive on room state.
|
||
|
|
* `WidgetParser` drops empty/removed (`{}`) and malformed entries.
|
||
|
|
*/
|
||
|
|
export const useRoomWidgets = (room: Room): Widget[] => {
|
||
|
|
const state = useRoomState(room);
|
||
|
|
return useMemo(() => {
|
||
|
|
const widgetEvents = state.get(StateEvent.Widget);
|
||
|
|
if (!widgetEvents) return [];
|
||
|
|
const stateEvents = Array.from(widgetEvents.values()).map(
|
||
|
|
(event) => event.getEffectiveEvent() as unknown as IStateEvent,
|
||
|
|
);
|
||
|
|
return WidgetParser.parseWidgetsFromRoomState(stateEvents);
|
||
|
|
}, [state]);
|
||
|
|
};
|