Skip to content

Commit b9b0b09

Browse files
authored
Allow desktop app to expose recent rooms in UI integrations (#16940)
1 parent 50f8be4 commit b9b0b09

2 files changed

Lines changed: 44 additions & 2 deletions

File tree

src/vector/platform/ElectronPlatform.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,21 @@ import ToastStore from "matrix-react-sdk/src/stores/ToastStore";
4040
import GenericExpiringToast from "matrix-react-sdk/src/components/views/toasts/GenericExpiringToast";
4141
import { logger } from "matrix-js-sdk/src/logger";
4242
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
43+
import { BreadcrumbsStore } from "matrix-react-sdk/src/stores/BreadcrumbsStore";
44+
import { UPDATE_EVENT } from "matrix-react-sdk/src/stores/AsyncStore";
45+
import { avatarUrlForRoom, getInitialLetter } from "matrix-react-sdk/src/Avatar";
4346

4447
import VectorBasePlatform from "./VectorBasePlatform";
4548
import { SeshatIndexManager } from "./SeshatIndexManager";
4649
import { IPCManager } from "./IPCManager";
4750

51+
interface SquirrelUpdate {
52+
releaseNotes: string;
53+
releaseName: string;
54+
releaseDate: Date;
55+
updateURL: string;
56+
}
57+
4858
const isMac = navigator.platform.toUpperCase().includes("MAC");
4959

5060
function platformFriendlyName(): string {
@@ -150,13 +160,29 @@ export default class ElectronPlatform extends VectorBasePlatform {
150160
});
151161

152162
this.ipc.call("startSSOFlow", this.ssoID);
163+
164+
BreadcrumbsStore.instance.on(UPDATE_EVENT, this.onBreadcrumbsUpdate);
153165
}
154166

155167
public async getConfig(): Promise<IConfigOptions> {
156168
return this.ipc.call("getConfig");
157169
}
158170

159-
private onUpdateDownloaded = async (ev, { releaseNotes, releaseName }): Promise<void> => {
171+
private onBreadcrumbsUpdate = (): void => {
172+
const rooms = BreadcrumbsStore.instance.rooms.slice(0, 7).map((r) => ({
173+
roomId: r.roomId,
174+
avatarUrl: avatarUrlForRoom(
175+
r,
176+
Math.floor(60 * window.devicePixelRatio),
177+
Math.floor(60 * window.devicePixelRatio),
178+
"crop",
179+
),
180+
initial: getInitialLetter(r.name),
181+
}));
182+
this.ipc.call("breadcrumbs", rooms);
183+
};
184+
185+
private onUpdateDownloaded = async (ev: Event, { releaseNotes, releaseName }: SquirrelUpdate): Promise<void> => {
160186
dis.dispatch<CheckUpdatesPayload>({
161187
action: Action.CheckUpdates,
162188
status: UpdateCheckStatus.Ready,

test/unit-tests/vector/platform/ElectronPlatform-test.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { UpdateCheckStatus } from "matrix-react-sdk/src/BasePlatform";
2020
import { Action } from "matrix-react-sdk/src/dispatcher/actions";
2121
import dispatcher from "matrix-react-sdk/src/dispatcher/dispatcher";
2222
import * as rageshake from "matrix-react-sdk/src/rageshake/rageshake";
23+
import { BreadcrumbsStore } from "matrix-react-sdk/src/stores/BreadcrumbsStore";
2324

2425
import ElectronPlatform from "../../../../src/vector/platform/ElectronPlatform";
2526

@@ -43,7 +44,6 @@ describe("ElectronPlatform", () => {
4344
const userId = "@alice:server.org";
4445
const deviceId = "device-id";
4546

46-
window.electron = mockElectron;
4747
beforeEach(() => {
4848
window.electron = mockElectron;
4949
jest.clearAllMocks();
@@ -260,4 +260,20 @@ describe("ElectronPlatform", () => {
260260
expect(mockElectron.send).toHaveBeenCalledWith("install_update");
261261
});
262262
});
263+
264+
describe("breacrumbs", () => {
265+
it("should send breadcrumb updates over the IPC", () => {
266+
const spy = jest.spyOn(BreadcrumbsStore.instance, "on");
267+
new ElectronPlatform();
268+
const cb = spy.mock.calls[0][1];
269+
cb();
270+
271+
expect(mockElectron.send).toHaveBeenCalledWith(
272+
"ipcCall",
273+
expect.objectContaining({
274+
name: "breadcrumbs",
275+
}),
276+
);
277+
});
278+
});
263279
});

0 commit comments

Comments
 (0)