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

Commit 7ff850d

Browse files
authored
Merge pull request #4253 from matrix-org/travis/room-list-2
Rewrite the room list store
2 parents d0451fc + e3c0b47 commit 7ff850d

31 files changed

+2272
-43
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
},
5656
"dependencies": {
5757
"@babel/runtime": "^7.8.3",
58+
"await-lock": "^2.0.1",
5859
"blueimp-canvas-to-blob": "^3.5.0",
5960
"browser-encrypt-attachment": "^0.3.0",
6061
"browser-request": "^0.3.3",

src/actions/RoomListActions.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ limitations under the License.
1616
*/
1717

1818
import { asyncAction } from './actionCreators';
19-
import RoomListStore, { TAG_DM } from '../stores/RoomListStore';
19+
import { TAG_DM } from '../stores/RoomListStore';
2020
import Modal from '../Modal';
2121
import * as Rooms from '../Rooms';
2222
import { _t } from '../languageHandler';
2323
import * as sdk from '../index';
2424
import { MatrixClient } from "matrix-js-sdk/src/client";
2525
import { Room } from "matrix-js-sdk/src/models/room";
2626
import { AsyncActionPayload } from "../dispatcher/payloads";
27+
import { RoomListStoreTempProxy } from "../stores/room-list/RoomListStoreTempProxy";
2728

2829
export default class RoomListActions {
2930
/**
@@ -51,7 +52,7 @@ export default class RoomListActions {
5152

5253
// Is the tag ordered manually?
5354
if (newTag && !newTag.match(/^(m\.lowpriority|im\.vector\.fake\.(invite|recent|direct|archived))$/)) {
54-
const lists = RoomListStore.getRoomLists();
55+
const lists = RoomListStoreTempProxy.getRoomLists();
5556
const newList = [...lists[newTag]];
5657

5758
newList.sort((a, b) => a.tags[newTag].order - b.tags[newTag].order);

src/components/structures/LeftPanel.js

+25-9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import * as VectorConferenceHandler from '../../VectorConferenceHandler';
2626
import SettingsStore from '../../settings/SettingsStore';
2727
import {_t} from "../../languageHandler";
2828
import Analytics from "../../Analytics";
29+
import RoomList2 from "../views/rooms/RoomList2";
2930

3031

3132
const LeftPanel = createReactClass({
@@ -273,6 +274,29 @@ const LeftPanel = createReactClass({
273274
breadcrumbs = (<RoomBreadcrumbs collapsed={this.props.collapsed} />);
274275
}
275276

277+
let roomList = null;
278+
if (SettingsStore.isFeatureEnabled("feature_new_room_list")) {
279+
roomList = <RoomList2
280+
onKeyDown={this._onKeyDown}
281+
resizeNotifier={this.props.resizeNotifier}
282+
collapsed={this.props.collapsed}
283+
searchFilter={this.state.searchFilter}
284+
ref={this.collectRoomList}
285+
onFocus={this._onFocus}
286+
onBlur={this._onBlur}
287+
/>;
288+
} else {
289+
roomList = <RoomList
290+
onKeyDown={this._onKeyDown}
291+
onFocus={this._onFocus}
292+
onBlur={this._onBlur}
293+
ref={this.collectRoomList}
294+
resizeNotifier={this.props.resizeNotifier}
295+
collapsed={this.props.collapsed}
296+
searchFilter={this.state.searchFilter}
297+
ConferenceHandler={VectorConferenceHandler} />;
298+
}
299+
276300
return (
277301
<div className={containerClasses}>
278302
{ tagPanelContainer }
@@ -284,15 +308,7 @@ const LeftPanel = createReactClass({
284308
{ exploreButton }
285309
{ searchBox }
286310
</div>
287-
<RoomList
288-
onKeyDown={this._onKeyDown}
289-
onFocus={this._onFocus}
290-
onBlur={this._onBlur}
291-
ref={this.collectRoomList}
292-
resizeNotifier={this.props.resizeNotifier}
293-
collapsed={this.props.collapsed}
294-
searchFilter={this.state.searchFilter}
295-
ConferenceHandler={VectorConferenceHandler} />
311+
{roomList}
296312
</aside>
297313
</div>
298314
);

src/components/structures/LoggedInView.tsx

+7-6
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import dis from '../../dispatcher/dispatcher';
3131
import sessionStore from '../../stores/SessionStore';
3232
import {MatrixClientPeg, MatrixClientCreds} from '../../MatrixClientPeg';
3333
import SettingsStore from "../../settings/SettingsStore";
34-
import RoomListStore from "../../stores/RoomListStore";
3534

3635
import TagOrderActions from '../../actions/TagOrderActions';
3736
import RoomListActions from '../../actions/RoomListActions';
@@ -42,6 +41,8 @@ import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts";
4241
import HomePage from "./HomePage";
4342
import ResizeNotifier from "../../utils/ResizeNotifier";
4443
import PlatformPeg from "../../PlatformPeg";
44+
import { RoomListStoreTempProxy } from "../../stores/room-list/RoomListStoreTempProxy";
45+
import { DefaultTagID } from "../../stores/room-list/models";
4546
// We need to fetch each pinned message individually (if we don't already have it)
4647
// so each pinned message may trigger a request. Limit the number per room for sanity.
4748
// NB. this is just for server notices rather than pinned messages in general.
@@ -297,18 +298,18 @@ class LoggedInView extends React.PureComponent<IProps, IState> {
297298
};
298299

299300
onRoomStateEvents = (ev, state) => {
300-
const roomLists = RoomListStore.getRoomLists();
301-
if (roomLists['m.server_notice'] && roomLists['m.server_notice'].some(r => r.roomId === ev.getRoomId())) {
301+
const roomLists = RoomListStoreTempProxy.getRoomLists();
302+
if (roomLists[DefaultTagID.ServerNotice] && roomLists[DefaultTagID.ServerNotice].some(r => r.roomId === ev.getRoomId())) {
302303
this._updateServerNoticeEvents();
303304
}
304305
};
305306

306307
_updateServerNoticeEvents = async () => {
307-
const roomLists = RoomListStore.getRoomLists();
308-
if (!roomLists['m.server_notice']) return [];
308+
const roomLists = RoomListStoreTempProxy.getRoomLists();
309+
if (!roomLists[DefaultTagID.ServerNotice]) return [];
309310

310311
const pinnedEvents = [];
311-
for (const room of roomLists['m.server_notice']) {
312+
for (const room of roomLists[DefaultTagID.ServerNotice]) {
312313
const pinStateEvent = room.currentState.getStateEvents("m.room.pinned_events", "");
313314

314315
if (!pinStateEvent || !pinStateEvent.getContent().pinned) continue;

src/components/views/dialogs/InviteDialog.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ import {humanizeTime} from "../../../utils/humanize";
3434
import createRoom, {canEncryptToAllUsers} from "../../../createRoom";
3535
import {inviteMultipleToRoom} from "../../../RoomInvite";
3636
import SettingsStore from '../../../settings/SettingsStore';
37-
import RoomListStore, {TAG_DM} from "../../../stores/RoomListStore";
3837
import {Key} from "../../../Keyboard";
3938
import {Action} from "../../../dispatcher/actions";
39+
import {RoomListStoreTempProxy} from "../../../stores/room-list/RoomListStoreTempProxy";
40+
import {DefaultTagID} from "../../../stores/room-list/models";
4041

4142
export const KIND_DM = "dm";
4243
export const KIND_INVITE = "invite";
@@ -344,10 +345,10 @@ export default class InviteDialog extends React.PureComponent {
344345
_buildRecents(excludedTargetIds: Set<string>): {userId: string, user: RoomMember, lastActive: number} {
345346
const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room
346347

347-
// Also pull in all the rooms tagged as TAG_DM so we don't miss anything. Sometimes the
348+
// Also pull in all the rooms tagged as DefaultTagID.DM so we don't miss anything. Sometimes the
348349
// room list doesn't tag the room for the DMRoomMap, but does for the room list.
349-
const taggedRooms = RoomListStore.getRoomLists();
350-
const dmTaggedRooms = taggedRooms[TAG_DM];
350+
const taggedRooms = RoomListStoreTempProxy.getRoomLists();
351+
const dmTaggedRooms = taggedRooms[DefaultTagID.DM];
351352
const myUserId = MatrixClientPeg.get().getUserId();
352353
for (const dmRoom of dmTaggedRooms) {
353354
const otherMembers = dmRoom.getJoinedMembers().filter(u => u.userId !== myUserId);

src/components/views/rooms/RoomList.js

+8-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import rate_limited_func from "../../../ratelimitedfunc";
2929
import * as Rooms from '../../../Rooms';
3030
import DMRoomMap from '../../../utils/DMRoomMap';
3131
import TagOrderStore from '../../../stores/TagOrderStore';
32-
import RoomListStore, {TAG_DM} from '../../../stores/RoomListStore';
3332
import CustomRoomTagStore from '../../../stores/CustomRoomTagStore';
3433
import GroupStore from '../../../stores/GroupStore';
3534
import RoomSubList from '../../structures/RoomSubList';
@@ -41,6 +40,8 @@ import * as Receipt from "../../../utils/Receipt";
4140
import {Resizer} from '../../../resizer';
4241
import {Layout, Distributor} from '../../../resizer/distributors/roomsublist2';
4342
import {RovingTabIndexProvider} from "../../../accessibility/RovingTabIndex";
43+
import {RoomListStoreTempProxy} from "../../../stores/room-list/RoomListStoreTempProxy";
44+
import {DefaultTagID} from "../../../stores/room-list/models";
4445
import * as Unread from "../../../Unread";
4546
import RoomViewStore from "../../../stores/RoomViewStore";
4647

@@ -161,7 +162,7 @@ export default createReactClass({
161162
this.updateVisibleRooms();
162163
});
163164

164-
this._roomListStoreToken = RoomListStore.addListener(() => {
165+
this._roomListStoreToken = RoomListStoreTempProxy.addListener(() => {
165166
this._delayedRefreshRoomList();
166167
});
167168

@@ -521,7 +522,7 @@ export default createReactClass({
521522
},
522523

523524
getTagNameForRoomId: function(roomId) {
524-
const lists = RoomListStore.getRoomLists();
525+
const lists = RoomListStoreTempProxy.getRoomLists();
525526
for (const tagName of Object.keys(lists)) {
526527
for (const room of lists[tagName]) {
527528
// Should be impossible, but guard anyways.
@@ -541,7 +542,7 @@ export default createReactClass({
541542
},
542543

543544
getRoomLists: function() {
544-
const lists = RoomListStore.getRoomLists();
545+
const lists = RoomListStoreTempProxy.getRoomLists();
545546

546547
const filteredLists = {};
547548

@@ -773,10 +774,10 @@ export default createReactClass({
773774
incomingCall: incomingCallIfTaggedAs('m.favourite'),
774775
},
775776
{
776-
list: this.state.lists[TAG_DM],
777+
list: this.state.lists[DefaultTagID.DM],
777778
label: _t('Direct Messages'),
778-
tagName: TAG_DM,
779-
incomingCall: incomingCallIfTaggedAs(TAG_DM),
779+
tagName: DefaultTagID.DM,
780+
incomingCall: incomingCallIfTaggedAs(DefaultTagID.DM),
780781
onAddRoom: () => {dis.dispatch({action: 'view_create_chat'});},
781782
addRoomLabel: _t("Start chat"),
782783
},

0 commit comments

Comments
 (0)