diff --git a/playwright/pages/client.ts b/playwright/pages/client.ts index 7437ff967d..23b48602e9 100644 --- a/playwright/pages/client.ts +++ b/playwright/pages/client.ts @@ -447,7 +447,7 @@ export class Client { const client = await this.prepareClient(); return client.evaluate( async (client, { type, content }) => { - await client.setAccountData(type, content); + await client.setAccountData(type as T, content as AccountDataEvents[T]); }, { type, content }, ); diff --git a/src/@types/matrix-js-sdk.d.ts b/src/@types/matrix-js-sdk.d.ts index 21299cff30..c45f153701 100644 --- a/src/@types/matrix-js-sdk.d.ts +++ b/src/@types/matrix-js-sdk.d.ts @@ -88,6 +88,23 @@ declare module "matrix-js-sdk/src/types" { }; } + export interface RoomAccountDataEvents { + // Room account data event for pinned events + "im.vector.room.read_pins": { event_ids: string[] }; + + // Room account data event for voip virtual rooms + "im.vector.is_virtual_room": { native_room: string }; + + // Room account data event for MSC2867 mark unread + "m.marked_unread": { unread: boolean }; + "com.famedly.marked_unread": { unread: boolean }; + + // Element settings account data events + "org.matrix.room.preview_urls": { disable: boolean }; + "im.vector.setting.allowed_widgets": { [eventId: string]: boolean }; + "im.vector.web.settings": Record; + } + export interface AudioContent { // MSC1767 + Ideals of MSC2516 as MSC3245 // https://github.com/matrix-org/matrix-doc/pull/3245 diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index a28089c989..39e9104443 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -267,7 +267,7 @@ class TimelinePanel extends React.Component { // XXX: we could track RM per TimelineSet rather than per Room. // but for now we just do it per room for simplicity. if (this.props.manageReadMarkers) { - const readmarker = this.props.timelineSet.room?.getAccountData("m.fully_read"); + const readmarker = this.props.timelineSet.room?.getAccountData(EventType.FullyRead); if (readmarker) { this.initialReadMarkerId = readmarker.getContent().event_id; } else { diff --git a/src/components/views/dialogs/devtools/AccountData.tsx b/src/components/views/dialogs/devtools/AccountData.tsx index 920cab8860..f61f869980 100644 --- a/src/components/views/dialogs/devtools/AccountData.tsx +++ b/src/components/views/dialogs/devtools/AccountData.tsx @@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details. */ import React, { useContext, useMemo, useState } from "react"; -import { AccountDataEvents, IContent, MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { AccountDataEvents, IContent, MatrixEvent, RoomAccountDataEvents } from "matrix-js-sdk/src/matrix"; import BaseTool, { DevtoolsContext, IDevtoolsProps } from "./BaseTool"; import MatrixClientContext from "../../../../contexts/MatrixClientContext"; @@ -35,7 +35,7 @@ export const RoomAccountDataEventEditor: React.FC = ({ mxEvent, on const fields = useMemo(() => [eventTypeField(mxEvent?.getType())], [mxEvent]); - const onSend = async ([eventType]: string[], content?: IContent): Promise => { + const onSend = async ([eventType]: Array, content?: IContent): Promise => { await cli.setRoomAccountData(context.room.roomId, eventType, content || {}); }; diff --git a/src/settings/handlers/RoomAccountSettingsHandler.ts b/src/settings/handlers/RoomAccountSettingsHandler.ts index 7e7242b62b..34a04ec5e6 100644 --- a/src/settings/handlers/RoomAccountSettingsHandler.ts +++ b/src/settings/handlers/RoomAccountSettingsHandler.ts @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import { MatrixClient, MatrixEvent, Room, RoomEvent } from "matrix-js-sdk/src/matrix"; +import { MatrixClient, MatrixEvent, Room, RoomAccountDataEvents, RoomEvent } from "matrix-js-sdk/src/matrix"; import { defer } from "matrix-js-sdk/src/utils"; import MatrixClientBackedSettingsHandler from "./MatrixClientBackedSettingsHandler"; @@ -79,11 +79,14 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin } // helper function to send room account data then await it being echoed back - private async setRoomAccountData( + private async setRoomAccountData< + K extends keyof RoomAccountDataEvents, + F extends null | keyof RoomAccountDataEvents[K], + >( roomId: string, - eventType: string, - field: string | null, - value: any, + eventType: K, + field: F, + value: F extends keyof RoomAccountDataEvents[K] ? RoomAccountDataEvents[K][F] : RoomAccountDataEvents[K], ): Promise { let content: ReturnType; @@ -99,7 +102,7 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin const deferred = defer(); const handler = (event: MatrixEvent, room: Room): void => { if (room.roomId !== roomId || event.getType() !== eventType) return; - if (field !== null && event.getContent()[field] !== value) return; + if (field !== null && event.getContent()[field] !== value) return; this.client.off(RoomEvent.AccountData, handler); deferred.resolve(); }; @@ -132,7 +135,7 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin return this.client && !this.client.isGuest(); } - private getSettings(roomId: string, eventType = DEFAULT_SETTINGS_EVENT_TYPE): any { + private getSettings(roomId: string, eventType: keyof RoomAccountDataEvents = DEFAULT_SETTINGS_EVENT_TYPE): any { // TODO: [TS] Type return const event = this.client.getRoom(roomId)?.getAccountData(eventType); if (!event || !event.getContent()) return null; diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts index 90358f3310..0aa0d1ff8a 100644 --- a/src/stores/spaces/SpaceStore.ts +++ b/src/stores/spaces/SpaceStore.ts @@ -1373,7 +1373,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient { private async setRootSpaceOrder(space: Room, order?: string): Promise { this.spaceOrderLocalEchoMap.set(space.roomId, order); try { - await this.matrixClient?.setRoomAccountData(space.roomId, EventType.SpaceOrder, { order }); + await this.matrixClient?.setRoomAccountData( + space.roomId, + EventType.SpaceOrder, + order !== undefined ? { order } : {}, + ); } catch (e) { logger.warn("Failed to set root space order", e); if (this.spaceOrderLocalEchoMap.get(space.roomId) === order) { diff --git a/src/utils/IdentityServerUtils.ts b/src/utils/IdentityServerUtils.ts index 6fb2a100e6..a7bd3d12be 100644 --- a/src/utils/IdentityServerUtils.ts +++ b/src/utils/IdentityServerUtils.ts @@ -20,7 +20,7 @@ export function setToDefaultIdentityServer(matrixClient: MatrixClient): void { const url = getDefaultIdentityServerUrl(); // Account data change will update localstorage, client, etc through dispatcher matrixClient.setAccountData("m.identity_server", { - base_url: url, + base_url: url ?? null, }); }