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

Commit 2d38655

Browse files
authored
ensure metaspace changes correctly notify listeners (#8611)
1 parent 9b92eca commit 2d38655

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/stores/spaces/SpaceStore.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,13 +1072,19 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
10721072
?.["m.room_versions"]?.["org.matrix.msc3244.room_capabilities"]?.["restricted"];
10731073
});
10741074

1075+
const oldMetaSpaces = this._enabledMetaSpaces;
10751076
const enabledMetaSpaces = SettingsStore.getValue("Spaces.enabledMetaSpaces");
10761077
this._enabledMetaSpaces = metaSpaceOrder.filter(k => enabledMetaSpaces[k]);
10771078

10781079
this._allRoomsInHome = SettingsStore.getValue("Spaces.allRoomsInHome");
10791080
this.sendUserProperties();
10801081

10811082
this.rebuildSpaceHierarchy(); // trigger an initial update
1083+
// rebuildSpaceHierarchy will only send an update if the spaces have changed.
1084+
// If only the meta spaces have changed, we need to send an update ourselves.
1085+
if (arrayHasDiff(oldMetaSpaces, this._enabledMetaSpaces)) {
1086+
this.emit(UPDATE_TOP_LEVEL_SPACES, this.spacePanelSpaces, this.enabledMetaSpaces);
1087+
}
10821088

10831089
// restore selected state from last session if any and still valid
10841090
const lastSpaceId = window.localStorage.getItem(ACTIVE_SPACE_LS_KEY);

test/stores/SpaceStore-test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17+
import { EventEmitter } from "events";
1718
import { mocked } from 'jest-mock';
1819
import { EventType } from "matrix-js-sdk/src/@types/event";
1920
import { RoomMember } from "matrix-js-sdk/src/models/room-member";
@@ -1221,4 +1222,26 @@ describe("SpaceStore", () => {
12211222
expect(SpaceStore.instance.spacePanelSpaces.map(r => r.roomId)).toStrictEqual([rootSpace.roomId]);
12221223
await prom;
12231224
});
1225+
1226+
it("correctly emits events for metaspace changes during onReady", async () => {
1227+
// similar to useEventEmitterState, but for use inside of tests
1228+
function testEventEmitterState(
1229+
emitter: EventEmitter | undefined,
1230+
eventName: string | symbol,
1231+
callback: (...args: any[]) => void,
1232+
): () => void {
1233+
callback();
1234+
emitter.addListener(eventName, callback);
1235+
return () => emitter.removeListener(eventName, callback);
1236+
}
1237+
1238+
let metaSpaces;
1239+
const removeListener = testEventEmitterState(store, UPDATE_TOP_LEVEL_SPACES, () => {
1240+
metaSpaces = store.enabledMetaSpaces;
1241+
});
1242+
expect(metaSpaces).toEqual(store.enabledMetaSpaces);
1243+
await run();
1244+
expect(metaSpaces).toEqual(store.enabledMetaSpaces);
1245+
removeListener();
1246+
});
12241247
});

0 commit comments

Comments
 (0)