diff --git a/src/settings/controllers/MediaPreviewConfigController.ts b/src/settings/controllers/MediaPreviewConfigController.ts index 52ff9e032e..b86c7ad106 100644 --- a/src/settings/controllers/MediaPreviewConfigController.ts +++ b/src/settings/controllers/MediaPreviewConfigController.ts @@ -26,18 +26,14 @@ export default class MediaPreviewConfigController extends MatrixClientBackedCont invite_avatars: MediaPreviewValue.On, }; - private static getValidSettingData(content: IContent): MediaPreviewConfig { + private static getValidSettingData(content: IContent): Partial { const mediaPreviews: MediaPreviewConfig["media_previews"] = content.media_previews; const inviteAvatars: MediaPreviewConfig["invite_avatars"] = content.invite_avatars; const validMediaPreviews = Object.values(MediaPreviewValue); const validInviteAvatars = [MediaPreviewValue.Off, MediaPreviewValue.On]; return { - invite_avatars: validMediaPreviews.includes(inviteAvatars) - ? inviteAvatars - : MediaPreviewConfigController.default.invite_avatars, - media_previews: validInviteAvatars.includes(mediaPreviews) - ? mediaPreviews - : MediaPreviewConfigController.default.media_previews, + invite_avatars: validMediaPreviews.includes(inviteAvatars) ? inviteAvatars : undefined, + media_previews: validInviteAvatars.includes(mediaPreviews) ? mediaPreviews : undefined, }; } @@ -45,15 +41,36 @@ export default class MediaPreviewConfigController extends MatrixClientBackedCont super(); } - private getValue = (roomId?: string): MediaPreviewConfig | null => { + private getValue = (roomId?: string): MediaPreviewConfig => { const source = roomId ? this.client?.getRoom(roomId) : this.client; - const value = source?.getAccountData(MEDIA_PREVIEW_ACCOUNT_DATA_TYPE)?.getContent(); + const accountData = + source?.getAccountData(MEDIA_PREVIEW_ACCOUNT_DATA_TYPE)?.getContent() ?? {}; - if (!value) { - return null; - } else { - return MediaPreviewConfigController.getValidSettingData(value); + const calculatedConfig = MediaPreviewConfigController.getValidSettingData(accountData); + + // Save an account data fetch if we have all the values. + if (calculatedConfig.invite_avatars && calculatedConfig.media_previews) { + return calculatedConfig as MediaPreviewConfig; } + + // We're missing some keys. + if (roomId) { + const globalConfig = this.getValue(); + return { + invite_avatars: + calculatedConfig.invite_avatars ?? + globalConfig.invite_avatars ?? + MediaPreviewConfigController.default.invite_avatars, + media_previews: + calculatedConfig.media_previews ?? + globalConfig.media_previews ?? + MediaPreviewConfigController.default.media_previews, + }; + } + return { + invite_avatars: calculatedConfig.invite_avatars ?? MediaPreviewConfigController.default.invite_avatars, + media_previews: calculatedConfig.media_previews ?? MediaPreviewConfigController.default.media_previews, + }; }; protected async initMatrixClient(): Promise { @@ -61,12 +78,7 @@ export default class MediaPreviewConfigController extends MatrixClientBackedCont } public getValueOverride(_level: SettingLevel, roomId: string | null): MediaPreviewConfig { - const roomConfig = roomId && this.getValue(roomId); - if (roomConfig) { - return roomConfig; - } - // If no room config, or global settings request then return global. - return this.getValue() ?? MediaPreviewConfigController.default; + return this.getValue(roomId ?? undefined); } public get settingDisabled(): false { diff --git a/test/unit-tests/settings/controllers/MediaPreviewConfigController-test.ts b/test/unit-tests/settings/controllers/MediaPreviewConfigController-test.ts index 95d27245b5..ec93afb799 100644 --- a/test/unit-tests/settings/controllers/MediaPreviewConfigController-test.ts +++ b/test/unit-tests/settings/controllers/MediaPreviewConfigController-test.ts @@ -55,7 +55,7 @@ describe("MediaPreviewConfigController", () => { new MatrixEvent({ type: MEDIA_PREVIEW_ACCOUNT_DATA_TYPE, content: { - [key]: MediaPreviewValue.Private, + [key]: MediaPreviewValue.Off, }, }), ), @@ -65,11 +65,11 @@ describe("MediaPreviewConfigController", () => { }); const globalValue = controller.getValueOverride(SettingLevel.ACCOUNT, null); - expect(globalValue[key]).toEqual(MediaPreviewValue.Private); + expect(globalValue[key]).toEqual(MediaPreviewValue.Off); // Should follow the global value. const roomValue = controller.getValueOverride(SettingLevel.ROOM_ACCOUNT, ROOM_ID); - expect(roomValue[key]).toEqual(MediaPreviewValue.Private); + expect(roomValue[key]).toEqual(MediaPreviewValue.Off); }); it.each([["media_previews"], ["invite_avatars"]])("gets the correct value for %s at the room level", (key) => { @@ -83,7 +83,7 @@ describe("MediaPreviewConfigController", () => { new MatrixEvent({ type: MEDIA_PREVIEW_ACCOUNT_DATA_TYPE, content: { - [key]: MediaPreviewValue.Private, + [key]: MediaPreviewValue.Off, }, }), ), @@ -95,7 +95,7 @@ describe("MediaPreviewConfigController", () => { // Should follow the global value. const roomValue = controller.getValueOverride(SettingLevel.ROOM_ACCOUNT, ROOM_ID); - expect(roomValue[key]).toEqual(MediaPreviewValue.Private); + expect(roomValue[key]).toEqual(MediaPreviewValue.Off); }); it.each([["media_previews"], ["invite_avatars"]])( @@ -137,7 +137,7 @@ describe("MediaPreviewConfigController", () => { new MatrixEvent({ type: MEDIA_PREVIEW_ACCOUNT_DATA_TYPE, content: { - [key]: MediaPreviewValue.Private, + [key]: MediaPreviewValue.Off, }, }), ), @@ -154,11 +154,11 @@ describe("MediaPreviewConfigController", () => { }); const globalValue = controller.getValueOverride(SettingLevel.ACCOUNT, null); - expect(globalValue[key]).toEqual(MediaPreviewValue.Private); + expect(globalValue[key]).toEqual(MediaPreviewValue.Off); // Should follow the global value. const roomValue = controller.getValueOverride(SettingLevel.ROOM_ACCOUNT, ROOM_ID); - expect(roomValue[key]).toEqual(MediaPreviewValue.On); + expect(roomValue[key]).toEqual(MediaPreviewValue.Off); }, ); });