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

Commit ea20e04

Browse files
authored
Merge pull request #6382 from matrix-org/t3chguy/console
2 parents 76022dc + 20e0356 commit ea20e04

File tree

8 files changed

+74
-70
lines changed

8 files changed

+74
-70
lines changed

src/TextForEvent.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
3232
// any text to display at all. For this reason they return deferred values
3333
// to avoid the expense of looking up translations when they're not needed.
3434

35-
function textForMemberEvent(ev): () => string | null {
35+
function textForMemberEvent(ev: MatrixEvent): () => string | null {
3636
// XXX: SYJS-16 "sender is sometimes null for join messages"
3737
const senderName = ev.sender ? ev.sender.name : ev.getSender();
3838
const targetName = ev.target ? ev.target.name : ev.getStateKey();
@@ -127,15 +127,15 @@ function textForMemberEvent(ev): () => string | null {
127127
}
128128
}
129129

130-
function textForTopicEvent(ev): () => string | null {
130+
function textForTopicEvent(ev: MatrixEvent): () => string | null {
131131
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
132132
return () => _t('%(senderDisplayName)s changed the topic to "%(topic)s".', {
133133
senderDisplayName,
134134
topic: ev.getContent().topic,
135135
});
136136
}
137137

138-
function textForRoomNameEvent(ev): () => string | null {
138+
function textForRoomNameEvent(ev: MatrixEvent): () => string | null {
139139
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
140140

141141
if (!ev.getContent().name || ev.getContent().name.trim().length === 0) {
@@ -154,12 +154,12 @@ function textForRoomNameEvent(ev): () => string | null {
154154
});
155155
}
156156

157-
function textForTombstoneEvent(ev): () => string | null {
157+
function textForTombstoneEvent(ev: MatrixEvent): () => string | null {
158158
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
159159
return () => _t('%(senderDisplayName)s upgraded this room.', { senderDisplayName });
160160
}
161161

162-
function textForJoinRulesEvent(ev): () => string | null {
162+
function textForJoinRulesEvent(ev: MatrixEvent): () => string | null {
163163
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
164164
switch (ev.getContent().join_rule) {
165165
case "public":
@@ -179,7 +179,7 @@ function textForJoinRulesEvent(ev): () => string | null {
179179
}
180180
}
181181

182-
function textForGuestAccessEvent(ev): () => string | null {
182+
function textForGuestAccessEvent(ev: MatrixEvent): () => string | null {
183183
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
184184
switch (ev.getContent().guest_access) {
185185
case "can_join":
@@ -195,7 +195,7 @@ function textForGuestAccessEvent(ev): () => string | null {
195195
}
196196
}
197197

198-
function textForRelatedGroupsEvent(ev): () => string | null {
198+
function textForRelatedGroupsEvent(ev: MatrixEvent): () => string | null {
199199
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
200200
const groups = ev.getContent().groups || [];
201201
const prevGroups = ev.getPrevContent().groups || [];
@@ -225,7 +225,7 @@ function textForRelatedGroupsEvent(ev): () => string | null {
225225
}
226226
}
227227

228-
function textForServerACLEvent(ev): () => string | null {
228+
function textForServerACLEvent(ev: MatrixEvent): () => string | null {
229229
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
230230
const prevContent = ev.getPrevContent();
231231
const current = ev.getContent();
@@ -255,7 +255,7 @@ function textForServerACLEvent(ev): () => string | null {
255255
return getText;
256256
}
257257

258-
function textForMessageEvent(ev): () => string | null {
258+
function textForMessageEvent(ev: MatrixEvent): () => string | null {
259259
return () => {
260260
const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
261261
let message = senderDisplayName + ': ' + ev.getContent().body;
@@ -268,7 +268,7 @@ function textForMessageEvent(ev): () => string | null {
268268
};
269269
}
270270

271-
function textForCanonicalAliasEvent(ev): () => string | null {
271+
function textForCanonicalAliasEvent(ev: MatrixEvent): () => string | null {
272272
const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
273273
const oldAlias = ev.getPrevContent().alias;
274274
const oldAltAliases = ev.getPrevContent().alt_aliases || [];
@@ -682,7 +682,7 @@ for (const evType of ALL_RULE_TYPES) {
682682
stateHandlers[evType] = textForMjolnirEvent;
683683
}
684684

685-
export function hasText(ev): boolean {
685+
export function hasText(ev: MatrixEvent): boolean {
686686
const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()];
687687
return Boolean(handler?.(ev));
688688
}

src/components/structures/RoomView.tsx

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,7 @@ export default class RoomView extends React.Component<IProps, IState> {
917917
// called when state.room is first initialised (either at initial load,
918918
// after a successful peek, or after we join the room).
919919
private onRoomLoaded = (room: Room) => {
920+
if (this.unmounted) return;
920921
// Attach a widget store listener only when we get a room
921922
WidgetLayoutStore.instance.on(WidgetLayoutStore.emissionForRoom(room), this.onWidgetLayoutChange);
922923
this.onWidgetLayoutChange(); // provoke an update
@@ -931,9 +932,9 @@ export default class RoomView extends React.Component<IProps, IState> {
931932
};
932933

933934
private async calculateRecommendedVersion(room: Room) {
934-
this.setState({
935-
upgradeRecommendation: await room.getRecommendedVersion(),
936-
});
935+
const upgradeRecommendation = await room.getRecommendedVersion();
936+
if (this.unmounted) return;
937+
this.setState({ upgradeRecommendation });
937938
}
938939

939940
private async loadMembersIfJoined(room: Room) {
@@ -1023,23 +1024,19 @@ export default class RoomView extends React.Component<IProps, IState> {
10231024
};
10241025

10251026
private async updateE2EStatus(room: Room) {
1026-
if (!this.context.isRoomEncrypted(room.roomId)) {
1027-
return;
1028-
}
1029-
if (!this.context.isCryptoEnabled()) {
1030-
// If crypto is not currently enabled, we aren't tracking devices at all,
1031-
// so we don't know what the answer is. Let's error on the safe side and show
1032-
// a warning for this case.
1033-
this.setState({
1034-
e2eStatus: E2EStatus.Warning,
1035-
});
1036-
return;
1027+
if (!this.context.isRoomEncrypted(room.roomId)) return;
1028+
1029+
// If crypto is not currently enabled, we aren't tracking devices at all,
1030+
// so we don't know what the answer is. Let's error on the safe side and show
1031+
// a warning for this case.
1032+
let e2eStatus = E2EStatus.Warning;
1033+
if (this.context.isCryptoEnabled()) {
1034+
/* At this point, the user has encryption on and cross-signing on */
1035+
e2eStatus = await shieldStatusForRoom(this.context, room);
10371036
}
10381037

1039-
/* At this point, the user has encryption on and cross-signing on */
1040-
this.setState({
1041-
e2eStatus: await shieldStatusForRoom(this.context, room),
1042-
});
1038+
if (this.unmounted) return;
1039+
this.setState({ e2eStatus });
10431040
}
10441041

10451042
private onAccountData = (event: MatrixEvent) => {

src/components/structures/TimelinePanel.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,8 @@ class TimelinePanel extends React.Component<IProps, IState> {
10511051
{ windowLimit: this.props.timelineCap });
10521052

10531053
const onLoaded = () => {
1054+
if (this.unmounted) return;
1055+
10541056
// clear the timeline min-height when
10551057
// (re)loading the timeline
10561058
if (this.messagePanel.current) {
@@ -1092,6 +1094,8 @@ class TimelinePanel extends React.Component<IProps, IState> {
10921094
};
10931095

10941096
const onError = (error) => {
1097+
if (this.unmounted) return;
1098+
10951099
this.setState({ timelineLoading: false });
10961100
console.error(
10971101
`Error loading timeline panel at ${eventId}: ${error}`,

src/components/views/messages/SenderProfile.tsx

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
*/
1616

1717
import React from 'react';
18+
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
19+
import { MsgType } from "matrix-js-sdk/src/@types/event";
20+
1821
import Flair from '../elements/Flair';
1922
import FlairStore from '../../../stores/FlairStore';
2023
import { getUserNameColorClass } from '../../../utils/FormattingUtils';
2124
import MatrixClientContext from "../../../contexts/MatrixClientContext";
2225
import { replaceableComponent } from "../../../utils/replaceableComponent";
23-
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
2426

2527
interface IProps {
2628
mxEvent: MatrixEvent;
@@ -36,7 +38,7 @@ interface IState {
3638
@replaceableComponent("views.messages.SenderProfile")
3739
export default class SenderProfile extends React.Component<IProps, IState> {
3840
static contextType = MatrixClientContext;
39-
private unmounted: boolean;
41+
private unmounted = false;
4042

4143
constructor(props: IProps) {
4244
super(props);
@@ -49,8 +51,7 @@ export default class SenderProfile extends React.Component<IProps, IState> {
4951
}
5052

5153
componentDidMount() {
52-
this.unmounted = false;
53-
this._updateRelatedGroups();
54+
this.updateRelatedGroups();
5455

5556
if (this.state.userGroups.length === 0) {
5657
this.getPublicisedGroups();
@@ -64,35 +65,29 @@ export default class SenderProfile extends React.Component<IProps, IState> {
6465
this.context.removeListener('RoomState.events', this.onRoomStateEvents);
6566
}
6667

67-
async getPublicisedGroups() {
68-
if (!this.unmounted) {
69-
const userGroups = await FlairStore.getPublicisedGroupsCached(
70-
this.context, this.props.mxEvent.getSender(),
71-
);
72-
this.setState({ userGroups });
73-
}
68+
private async getPublicisedGroups() {
69+
const userGroups = await FlairStore.getPublicisedGroupsCached(this.context, this.props.mxEvent.getSender());
70+
if (this.unmounted) return;
71+
this.setState({ userGroups });
7472
}
7573

76-
onRoomStateEvents = event => {
77-
if (event.getType() === 'm.room.related_groups' &&
78-
event.getRoomId() === this.props.mxEvent.getRoomId()
79-
) {
80-
this._updateRelatedGroups();
74+
private onRoomStateEvents = (event: MatrixEvent) => {
75+
if (event.getType() === 'm.room.related_groups' && event.getRoomId() === this.props.mxEvent.getRoomId()) {
76+
this.updateRelatedGroups();
8177
}
8278
};
8379

84-
_updateRelatedGroups() {
85-
if (this.unmounted) return;
80+
private updateRelatedGroups() {
8681
const room = this.context.getRoom(this.props.mxEvent.getRoomId());
8782
if (!room) return;
8883

8984
const relatedGroupsEvent = room.currentState.getStateEvents('m.room.related_groups', '');
9085
this.setState({
91-
relatedGroups: relatedGroupsEvent ? relatedGroupsEvent.getContent().groups || [] : [],
86+
relatedGroups: relatedGroupsEvent?.getContent().groups || [],
9287
});
9388
}
9489

95-
_getDisplayedGroups(userGroups, relatedGroups) {
90+
private getDisplayedGroups(userGroups?: string[], relatedGroups?: string[]) {
9691
let displayedGroups = userGroups || [];
9792
if (relatedGroups && relatedGroups.length > 0) {
9893
displayedGroups = relatedGroups.filter((groupId) => {
@@ -113,7 +108,7 @@ export default class SenderProfile extends React.Component<IProps, IState> {
113108
const displayName = mxEvent.sender?.rawDisplayName || mxEvent.getSender() || "";
114109
const mxid = mxEvent.sender?.userId || mxEvent.getSender() || "";
115110

116-
if (msgtype === 'm.emote') {
111+
if (msgtype === MsgType.Emote) {
117112
return null; // emote message must include the name so don't duplicate it
118113
}
119114

@@ -128,7 +123,7 @@ export default class SenderProfile extends React.Component<IProps, IState> {
128123

129124
let flair;
130125
if (this.props.enableFlair) {
131-
const displayedGroups = this._getDisplayedGroups(
126+
const displayedGroups = this.getDisplayedGroups(
132127
this.state.userGroups, this.state.relatedGroups,
133128
);
134129

src/components/views/rooms/EventTile.tsx

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,11 +1152,11 @@ export default class EventTile extends React.Component<IProps, IState> {
11521152
"aria-live": ariaLive,
11531153
"aria-atomic": true,
11541154
"data-scroll-tokens": scrollToken,
1155-
}, [
1156-
ircTimestamp,
1157-
avatar,
1158-
sender,
1159-
ircPadlock,
1155+
}, <>
1156+
{ ircTimestamp }
1157+
{ avatar }
1158+
{ sender }
1159+
{ ircPadlock }
11601160
<div className="mx_EventTile_reply" key="mx_EventTile_reply">
11611161
{ groupTimestamp }
11621162
{ groupPadlock }
@@ -1169,8 +1169,8 @@ export default class EventTile extends React.Component<IProps, IState> {
11691169
replacingEventId={this.props.replacingEventId}
11701170
showUrlPreview={false}
11711171
/>
1172-
</div>,
1173-
]);
1172+
</div>
1173+
</>);
11741174
}
11751175
default: {
11761176
const thread = ReplyThread.makeThread(
@@ -1193,10 +1193,10 @@ export default class EventTile extends React.Component<IProps, IState> {
11931193
"data-scroll-tokens": scrollToken,
11941194
"onMouseEnter": () => this.setState({ hover: true }),
11951195
"onMouseLeave": () => this.setState({ hover: false }),
1196-
}, [
1197-
ircTimestamp,
1198-
sender,
1199-
ircPadlock,
1196+
}, <>
1197+
{ ircTimestamp }
1198+
{ sender }
1199+
{ ircPadlock }
12001200
<div className="mx_EventTile_line" key="mx_EventTile_line">
12011201
{ groupTimestamp }
12021202
{ groupPadlock }
@@ -1214,11 +1214,10 @@ export default class EventTile extends React.Component<IProps, IState> {
12141214
{ keyRequestInfo }
12151215
{ reactionsRow }
12161216
{ actionBar }
1217-
</div>,
1218-
msgOption,
1219-
avatar,
1220-
1221-
])
1217+
</div>
1218+
{ msgOption }
1219+
{ avatar }
1220+
</>)
12221221
);
12231222
}
12241223
}

src/components/views/rooms/LinkPreviewGroup.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@ const LinkPreviewGroup: React.FC<IProps> = ({ links, mxEvent, onCancelClick, onH
4040

4141
const ts = mxEvent.getTs();
4242
const previews = useAsyncMemo<[string, IPreviewUrlResponse][]>(async () => {
43-
return Promise.all<[string, IPreviewUrlResponse] | void>(links.map(link => {
44-
return cli.getUrlPreview(link, ts).then(preview => [link, preview], error => {
43+
return Promise.all<[string, IPreviewUrlResponse] | void>(links.map(async link => {
44+
try {
45+
return [link, await cli.getUrlPreview(link, ts)];
46+
} catch (error) {
4547
console.error("Failed to get URL preview: " + error);
46-
});
48+
}
4749
})).then(a => a.filter(Boolean)) as Promise<[string, IPreviewUrlResponse][]>;
4850
}, [links, ts], []);
4951

src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export default class AppearanceUserSettingsTab extends React.Component<IProps, I
7676
private readonly MESSAGE_PREVIEW_TEXT = _t("Hey you. You're the best!");
7777

7878
private themeTimer: number;
79+
private unmounted = false;
7980

8081
constructor(props: IProps) {
8182
super(props);
@@ -101,6 +102,7 @@ export default class AppearanceUserSettingsTab extends React.Component<IProps, I
101102
const client = MatrixClientPeg.get();
102103
const userId = client.getUserId();
103104
const profileInfo = await client.getProfileInfo(userId);
105+
if (this.unmounted) return;
104106

105107
this.setState({
106108
userId,
@@ -109,6 +111,10 @@ export default class AppearanceUserSettingsTab extends React.Component<IProps, I
109111
});
110112
}
111113

114+
componentWillUnmount() {
115+
this.unmounted = true;
116+
}
117+
112118
private calculateThemeState(): IThemeState {
113119
// We have to mirror the logic from ThemeWatcher.getEffectiveTheme so we
114120
// show the right values for things.

src/stores/room-list/RoomListStore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient<IState> {
7474

7575
constructor() {
7676
super(defaultDispatcher);
77+
this.setMaxListeners(20); // CustomRoomTagStore + RoomList + LeftPanel + 8xRoomSubList + spares
7778
}
7879

7980
private setupWatchers() {

0 commit comments

Comments
 (0)