Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 37a527c

Browse files
committed
Convert several internal maps to real maps
1 parent aace3a8 commit 37a527c

File tree

2 files changed

+71
-63
lines changed

2 files changed

+71
-63
lines changed

src/components/views/messages/MessageEvent.tsx

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,30 @@ export interface IOperableEventTile {
5959
getEventTileOps(): IEventTileOps;
6060
}
6161

62+
const baseBodyTypes = new Map<string, typeof React.Component>([
63+
[MsgType.Text, TextualBody],
64+
[MsgType.Notice, TextualBody],
65+
[MsgType.Emote, TextualBody],
66+
[MsgType.Image, MImageBody],
67+
[MsgType.File, MFileBody],
68+
[MsgType.Audio, MVoiceOrAudioBody],
69+
[MsgType.Video, MVideoBody],
70+
]);
71+
const baseEvTypes = new Map<string, React.ComponentType<Partial<IBodyProps>>>([
72+
[EventType.Sticker, MStickerBody],
73+
[M_POLL_START.name, MPollBody],
74+
[M_POLL_START.altName, MPollBody],
75+
[M_BEACON_INFO.name, MBeaconBody],
76+
[M_BEACON_INFO.altName, MBeaconBody],
77+
]);
78+
6279
export default class MessageEvent extends React.Component<IProps> implements IMediaBody, IOperableEventTile {
6380
private body: React.RefObject<React.Component | IOperableEventTile> = createRef();
6481
private mediaHelper: MediaEventHelper;
82+
private bodyTypes = new Map<string, typeof React.Component>(baseBodyTypes.entries());
83+
private evTypes = new Map<string, React.ComponentType<Partial<IBodyProps>>>(baseEvTypes.entries());
6584

66-
static contextType = MatrixClientContext;
85+
public static contextType = MatrixClientContext;
6786
public context!: React.ContextType<typeof MatrixClientContext>;
6887

6988
public constructor(props: IProps, context: React.ContextType<typeof MatrixClientContext>) {
@@ -72,6 +91,8 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
7291
if (MediaEventHelper.isEligible(this.props.mxEvent)) {
7392
this.mediaHelper = new MediaEventHelper(this.props.mxEvent);
7493
}
94+
95+
this.updateComponentMaps();
7596
}
7697

7798
public componentDidMount(): void {
@@ -88,32 +109,20 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
88109
this.mediaHelper?.destroy();
89110
this.mediaHelper = new MediaEventHelper(this.props.mxEvent);
90111
}
91-
}
92112

93-
private get bodyTypes(): Record<string, typeof React.Component> {
94-
return {
95-
[MsgType.Text]: TextualBody,
96-
[MsgType.Notice]: TextualBody,
97-
[MsgType.Emote]: TextualBody,
98-
[MsgType.Image]: MImageBody,
99-
[MsgType.File]: MFileBody,
100-
[MsgType.Audio]: MVoiceOrAudioBody,
101-
[MsgType.Video]: MVideoBody,
102-
103-
...(this.props.overrideBodyTypes || {}),
104-
};
113+
this.updateComponentMaps();
105114
}
106115

107-
private get evTypes(): Record<string, React.ComponentType<Partial<IBodyProps>>> {
108-
return {
109-
[EventType.Sticker]: MStickerBody,
110-
[M_POLL_START.name]: MPollBody,
111-
[M_POLL_START.altName]: MPollBody,
112-
[M_BEACON_INFO.name]: MBeaconBody,
113-
[M_BEACON_INFO.altName]: MBeaconBody,
116+
private updateComponentMaps() {
117+
this.bodyTypes = new Map<string, typeof React.Component>(baseBodyTypes.entries());
118+
for (const [bodyType, bodyComponent] of Object.entries(this.props.overrideBodyTypes ?? {})) {
119+
this.bodyTypes.set(bodyType, bodyComponent);
120+
}
114121

115-
...(this.props.overrideEventTypes || {}),
116-
};
122+
this.evTypes = new Map<string, React.ComponentType<Partial<IBodyProps>>>(baseEvTypes.entries());
123+
for (const [evType, evComponent] of Object.entries(this.props.overrideEventTypes ?? {})) {
124+
this.evTypes.set(evType, evComponent);
125+
}
117126
}
118127

119128
public getEventTileOps = () => {
@@ -143,13 +152,13 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
143152
let BodyType: React.ComponentType<Partial<IBodyProps>> | ReactAnyComponent = RedactedBody;
144153
if (!this.props.mxEvent.isRedacted()) {
145154
// only resolve BodyType if event is not redacted
146-
if (type && this.evTypes[type]) {
147-
BodyType = this.evTypes[type];
148-
} else if (msgtype && this.bodyTypes[msgtype]) {
149-
BodyType = this.bodyTypes[msgtype];
155+
if (type && this.evTypes.has(type)) {
156+
BodyType = this.evTypes.get(type);
157+
} else if (msgtype && this.bodyTypes.has(msgtype)) {
158+
BodyType = this.bodyTypes.get(msgtype);
150159
} else if (content.url) {
151160
// Fallback to MFileBody if there's a content URL
152-
BodyType = this.bodyTypes[MsgType.File];
161+
BodyType = this.bodyTypes.get(MsgType.File);
153162
} else {
154163
// Fallback to UnknownBody otherwise if not redacted
155164
BodyType = UnknownBody;

src/events/EventTileFactory.tsx

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ export interface EventTileTypeProps {
6767

6868
type FactoryProps = Omit<EventTileTypeProps, "ref">;
6969
type Factory<X = FactoryProps> = (ref: Optional<React.RefObject<any>>, props: X) => JSX.Element;
70-
type FactoryMap = Record<string, Factory>;
7170

7271
const MessageEventFactory: Factory = (ref, props) => <MessageEvent ref={ref} {...props} />;
7372
const KeyVerificationConclFactory: Factory = (ref, props) => <MKeyVerificationConclusion ref={ref} {...props} />;
@@ -82,40 +81,40 @@ const HiddenEventFactory: Factory = (ref, props) => <HiddenBody ref={ref} {...pr
8281
export const JitsiEventFactory: Factory = (ref, props) => <MJitsiWidgetEvent ref={ref} {...props} />;
8382
export const JSONEventFactory: Factory = (ref, props) => <ViewSourceEvent ref={ref} {...props} />;
8483

85-
const EVENT_TILE_TYPES: FactoryMap = {
86-
[EventType.RoomMessage]: MessageEventFactory, // note that verification requests are handled in pickFactory()
87-
[EventType.Sticker]: MessageEventFactory,
88-
[M_POLL_START.name]: MessageEventFactory,
89-
[M_POLL_START.altName]: MessageEventFactory,
90-
[EventType.KeyVerificationCancel]: KeyVerificationConclFactory,
91-
[EventType.KeyVerificationDone]: KeyVerificationConclFactory,
92-
[EventType.CallInvite]: CallEventFactory, // note that this requires a special factory type
93-
};
94-
95-
const STATE_EVENT_TILE_TYPES: FactoryMap = {
96-
[EventType.RoomEncryption]: (ref, props) => <EncryptionEvent ref={ref} {...props} />,
97-
[EventType.RoomCanonicalAlias]: TextualEventFactory,
98-
[EventType.RoomCreate]: (ref, props) => <RoomCreate ref={ref} {...props} />,
99-
[EventType.RoomMember]: TextualEventFactory,
100-
[EventType.RoomName]: TextualEventFactory,
101-
[EventType.RoomAvatar]: (ref, props) => <RoomAvatarEvent ref={ref} {...props} />,
102-
[EventType.RoomThirdPartyInvite]: TextualEventFactory,
103-
[EventType.RoomHistoryVisibility]: TextualEventFactory,
104-
[EventType.RoomTopic]: TextualEventFactory,
105-
[EventType.RoomPowerLevels]: TextualEventFactory,
106-
[EventType.RoomPinnedEvents]: TextualEventFactory,
107-
[EventType.RoomServerAcl]: TextualEventFactory,
84+
const EVENT_TILE_TYPES = new Map<string, Factory>([
85+
[EventType.RoomMessage, MessageEventFactory], // note that verification requests are handled in pickFactory()
86+
[EventType.Sticker, MessageEventFactory],
87+
[M_POLL_START.name, MessageEventFactory],
88+
[M_POLL_START.altName, MessageEventFactory],
89+
[EventType.KeyVerificationCancel, KeyVerificationConclFactory],
90+
[EventType.KeyVerificationDone, KeyVerificationConclFactory],
91+
[EventType.CallInvite, CallEventFactory], // note that this requires a special factory type
92+
]);
93+
94+
const STATE_EVENT_TILE_TYPES = new Map<string, Factory>([
95+
[EventType.RoomEncryption, (ref, props) => <EncryptionEvent ref={ref} {...props} />],
96+
[EventType.RoomCanonicalAlias, TextualEventFactory],
97+
[EventType.RoomCreate, (ref, props) => <RoomCreate ref={ref} {...props} />],
98+
[EventType.RoomMember, TextualEventFactory],
99+
[EventType.RoomName, TextualEventFactory],
100+
[EventType.RoomAvatar, (ref, props) => <RoomAvatarEvent ref={ref} {...props} />],
101+
[EventType.RoomThirdPartyInvite, TextualEventFactory],
102+
[EventType.RoomHistoryVisibility, TextualEventFactory],
103+
[EventType.RoomTopic, TextualEventFactory],
104+
[EventType.RoomPowerLevels, TextualEventFactory],
105+
[EventType.RoomPinnedEvents, TextualEventFactory],
106+
[EventType.RoomServerAcl, TextualEventFactory],
108107
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
109-
'im.vector.modular.widgets': TextualEventFactory, // note that Jitsi widgets are special in pickFactory()
110-
[WIDGET_LAYOUT_EVENT_TYPE]: TextualEventFactory,
111-
[EventType.RoomTombstone]: TextualEventFactory,
112-
[EventType.RoomJoinRules]: TextualEventFactory,
113-
[EventType.RoomGuestAccess]: TextualEventFactory,
114-
};
108+
['im.vector.modular.widgets', TextualEventFactory], // note that Jitsi widgets are special in pickFactory()
109+
[WIDGET_LAYOUT_EVENT_TYPE, TextualEventFactory],
110+
[EventType.RoomTombstone, TextualEventFactory],
111+
[EventType.RoomJoinRules, TextualEventFactory],
112+
[EventType.RoomGuestAccess, TextualEventFactory],
113+
]);
115114

116115
// Add all the Mjolnir stuff to the renderer too
117116
for (const evType of ALL_RULE_TYPES) {
118-
STATE_EVENT_TILE_TYPES[evType] = TextualEventFactory;
117+
STATE_EVENT_TILE_TYPES.set(evType, TextualEventFactory);
119118
}
120119

121120
// These events should be recorded in the STATE_EVENT_TILE_TYPES
@@ -225,11 +224,11 @@ export function pickFactory(
225224
return noEventFactoryFactory(); // improper event type to render
226225
}
227226

228-
if (STATE_EVENT_TILE_TYPES[evType] === TextualEventFactory && !hasText(mxEvent, showHiddenEvents)) {
227+
if (STATE_EVENT_TILE_TYPES.get(evType) === TextualEventFactory && !hasText(mxEvent, showHiddenEvents)) {
229228
return noEventFactoryFactory();
230229
}
231230

232-
return STATE_EVENT_TILE_TYPES[evType] ?? noEventFactoryFactory();
231+
return STATE_EVENT_TILE_TYPES.get(evType) ?? noEventFactoryFactory();
233232
}
234233

235234
// Blanket override for all events. The MessageEvent component handles redacted states for us.
@@ -241,7 +240,7 @@ export function pickFactory(
241240
return noEventFactoryFactory();
242241
}
243242

244-
return EVENT_TILE_TYPES[evType] ?? noEventFactoryFactory();
243+
return EVENT_TILE_TYPES.get(evType) ?? noEventFactoryFactory();
245244
}
246245

247246
/**
@@ -391,7 +390,7 @@ export function haveRendererForEvent(mxEvent: MatrixEvent, showHiddenEvents: boo
391390
if (!handler) return false;
392391
if (handler === TextualEventFactory) {
393392
return hasText(mxEvent, showHiddenEvents);
394-
} else if (handler === STATE_EVENT_TILE_TYPES[EventType.RoomCreate]) {
393+
} else if (handler === STATE_EVENT_TILE_TYPES.get(EventType.RoomCreate)) {
395394
return Boolean(mxEvent.getContent()['predecessor']);
396395
} else if (handler === JSONEventFactory) {
397396
return false;

0 commit comments

Comments
 (0)