Convert several internal maps to real maps
This commit is contained in:
parent
aace3a8c28
commit
37a527c61f
2 changed files with 71 additions and 63 deletions
|
@ -59,11 +59,30 @@ export interface IOperableEventTile {
|
|||
getEventTileOps(): IEventTileOps;
|
||||
}
|
||||
|
||||
const baseBodyTypes = new Map<string, typeof React.Component>([
|
||||
[MsgType.Text, TextualBody],
|
||||
[MsgType.Notice, TextualBody],
|
||||
[MsgType.Emote, TextualBody],
|
||||
[MsgType.Image, MImageBody],
|
||||
[MsgType.File, MFileBody],
|
||||
[MsgType.Audio, MVoiceOrAudioBody],
|
||||
[MsgType.Video, MVideoBody],
|
||||
]);
|
||||
const baseEvTypes = new Map<string, React.ComponentType<Partial<IBodyProps>>>([
|
||||
[EventType.Sticker, MStickerBody],
|
||||
[M_POLL_START.name, MPollBody],
|
||||
[M_POLL_START.altName, MPollBody],
|
||||
[M_BEACON_INFO.name, MBeaconBody],
|
||||
[M_BEACON_INFO.altName, MBeaconBody],
|
||||
]);
|
||||
|
||||
export default class MessageEvent extends React.Component<IProps> implements IMediaBody, IOperableEventTile {
|
||||
private body: React.RefObject<React.Component | IOperableEventTile> = createRef();
|
||||
private mediaHelper: MediaEventHelper;
|
||||
private bodyTypes = new Map<string, typeof React.Component>(baseBodyTypes.entries());
|
||||
private evTypes = new Map<string, React.ComponentType<Partial<IBodyProps>>>(baseEvTypes.entries());
|
||||
|
||||
static contextType = MatrixClientContext;
|
||||
public static contextType = MatrixClientContext;
|
||||
public context!: React.ContextType<typeof MatrixClientContext>;
|
||||
|
||||
public constructor(props: IProps, context: React.ContextType<typeof MatrixClientContext>) {
|
||||
|
@ -72,6 +91,8 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
|
|||
if (MediaEventHelper.isEligible(this.props.mxEvent)) {
|
||||
this.mediaHelper = new MediaEventHelper(this.props.mxEvent);
|
||||
}
|
||||
|
||||
this.updateComponentMaps();
|
||||
}
|
||||
|
||||
public componentDidMount(): void {
|
||||
|
@ -88,32 +109,20 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
|
|||
this.mediaHelper?.destroy();
|
||||
this.mediaHelper = new MediaEventHelper(this.props.mxEvent);
|
||||
}
|
||||
|
||||
this.updateComponentMaps();
|
||||
}
|
||||
|
||||
private get bodyTypes(): Record<string, typeof React.Component> {
|
||||
return {
|
||||
[MsgType.Text]: TextualBody,
|
||||
[MsgType.Notice]: TextualBody,
|
||||
[MsgType.Emote]: TextualBody,
|
||||
[MsgType.Image]: MImageBody,
|
||||
[MsgType.File]: MFileBody,
|
||||
[MsgType.Audio]: MVoiceOrAudioBody,
|
||||
[MsgType.Video]: MVideoBody,
|
||||
private updateComponentMaps() {
|
||||
this.bodyTypes = new Map<string, typeof React.Component>(baseBodyTypes.entries());
|
||||
for (const [bodyType, bodyComponent] of Object.entries(this.props.overrideBodyTypes ?? {})) {
|
||||
this.bodyTypes.set(bodyType, bodyComponent);
|
||||
}
|
||||
|
||||
...(this.props.overrideBodyTypes || {}),
|
||||
};
|
||||
}
|
||||
|
||||
private get evTypes(): Record<string, React.ComponentType<Partial<IBodyProps>>> {
|
||||
return {
|
||||
[EventType.Sticker]: MStickerBody,
|
||||
[M_POLL_START.name]: MPollBody,
|
||||
[M_POLL_START.altName]: MPollBody,
|
||||
[M_BEACON_INFO.name]: MBeaconBody,
|
||||
[M_BEACON_INFO.altName]: MBeaconBody,
|
||||
|
||||
...(this.props.overrideEventTypes || {}),
|
||||
};
|
||||
this.evTypes = new Map<string, React.ComponentType<Partial<IBodyProps>>>(baseEvTypes.entries());
|
||||
for (const [evType, evComponent] of Object.entries(this.props.overrideEventTypes ?? {})) {
|
||||
this.evTypes.set(evType, evComponent);
|
||||
}
|
||||
}
|
||||
|
||||
public getEventTileOps = () => {
|
||||
|
@ -143,13 +152,13 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
|
|||
let BodyType: React.ComponentType<Partial<IBodyProps>> | ReactAnyComponent = RedactedBody;
|
||||
if (!this.props.mxEvent.isRedacted()) {
|
||||
// only resolve BodyType if event is not redacted
|
||||
if (type && this.evTypes[type]) {
|
||||
BodyType = this.evTypes[type];
|
||||
} else if (msgtype && this.bodyTypes[msgtype]) {
|
||||
BodyType = this.bodyTypes[msgtype];
|
||||
if (type && this.evTypes.has(type)) {
|
||||
BodyType = this.evTypes.get(type);
|
||||
} else if (msgtype && this.bodyTypes.has(msgtype)) {
|
||||
BodyType = this.bodyTypes.get(msgtype);
|
||||
} else if (content.url) {
|
||||
// Fallback to MFileBody if there's a content URL
|
||||
BodyType = this.bodyTypes[MsgType.File];
|
||||
BodyType = this.bodyTypes.get(MsgType.File);
|
||||
} else {
|
||||
// Fallback to UnknownBody otherwise if not redacted
|
||||
BodyType = UnknownBody;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue