diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index d1458ef39c..991e0c3039 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -19,14 +19,22 @@ limitations under the License. import React from 'react'; import { base32 } from "rfc4648"; -import { MatrixCall, CallErrorCode, CallState, CallEvent, CallParty, CallType } from "matrix-js-sdk/src/webrtc/call"; -import { CallError } from "matrix-js-sdk/src/webrtc/call"; +import { + CallError, + CallErrorCode, + CallEvent, + CallParty, + CallState, + CallType, + MatrixCall, +} from "matrix-js-sdk/src/webrtc/call"; import { logger } from 'matrix-js-sdk/src/logger'; -import { randomUppercaseString, randomLowercaseString } from "matrix-js-sdk/src/randomstring"; +import { randomLowercaseString, randomUppercaseString } from "matrix-js-sdk/src/randomstring"; import EventEmitter from 'events'; import { RuleId, TweakName, Tweaks } from "matrix-js-sdk/src/@types/PushRules"; import { PushProcessor } from 'matrix-js-sdk/src/pushprocessor'; import { SyncState } from "matrix-js-sdk/src/sync"; +import { CallEventHandlerEvent } from "matrix-js-sdk/src/webrtc/callEventHandler"; import { MatrixClientPeg } from './MatrixClientPeg'; import Modal from './Modal'; @@ -50,10 +58,9 @@ import VoipUserMapper from './VoipUserMapper'; import { addManagedHybridWidget, isManagedHybridWidgetEnabled } from './widgets/ManagedHybrid'; import SdkConfig from './SdkConfig'; import { ensureDMExists, findDMForUser } from './createRoom'; -import { WidgetLayoutStore, Container } from './stores/widgets/WidgetLayoutStore'; -import { getIncomingCallToastKey } from './toasts/IncomingCallToast'; +import { Container, WidgetLayoutStore } from './stores/widgets/WidgetLayoutStore'; +import IncomingCallToast, { getIncomingCallToastKey } from './toasts/IncomingCallToast'; import ToastStore from './stores/ToastStore'; -import IncomingCallToast from "./toasts/IncomingCallToast"; import Resend from './Resend'; import { ViewRoomPayload } from "./dispatcher/payloads/ViewRoomPayload"; @@ -172,7 +179,7 @@ export default class CallHandler extends EventEmitter { } if (SettingsStore.getValue(UIFeature.Voip)) { - MatrixClientPeg.get().on('Call.incoming', this.onCallIncoming); + MatrixClientPeg.get().on(CallEventHandlerEvent.Incoming, this.onCallIncoming); } this.checkProtocols(CHECK_PROTOCOLS_ATTEMPTS); @@ -181,7 +188,7 @@ export default class CallHandler extends EventEmitter { public stop(): void { const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener('Call.incoming', this.onCallIncoming); + cli.removeListener(CallEventHandlerEvent.Incoming, this.onCallIncoming); } } diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index 470491ecd5..486cf140aa 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -16,6 +16,8 @@ limitations under the License. import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { logger } from "matrix-js-sdk/src/logger"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; +import { ClientEvent, RoomStateEvent } from "matrix-js-sdk/src/matrix"; import { MatrixClientPeg } from './MatrixClientPeg'; import dis from "./dispatcher/dispatcher"; @@ -32,7 +34,7 @@ import { hideToast as hideUnverifiedSessionsToast, showToast as showUnverifiedSessionsToast, } from "./toasts/UnverifiedSessionToast"; -import { isSecretStorageBeingAccessed, accessSecretStorage } from "./SecurityManager"; +import { accessSecretStorage, isSecretStorageBeingAccessed } from "./SecurityManager"; import { isSecureBackupRequired } from './utils/WellKnownUtils'; import { isLoggedIn } from './components/structures/MatrixChat'; import { ActionPayload } from "./dispatcher/payloads"; @@ -63,28 +65,31 @@ export default class DeviceListener { } start() { - MatrixClientPeg.get().on('crypto.willUpdateDevices', this.onWillUpdateDevices); - MatrixClientPeg.get().on('crypto.devicesUpdated', this.onDevicesUpdated); - MatrixClientPeg.get().on('deviceVerificationChanged', this.onDeviceVerificationChanged); - MatrixClientPeg.get().on('userTrustStatusChanged', this.onUserTrustStatusChanged); - MatrixClientPeg.get().on('crossSigning.keysChanged', this.onCrossSingingKeysChanged); - MatrixClientPeg.get().on('accountData', this.onAccountData); - MatrixClientPeg.get().on('sync', this.onSync); - MatrixClientPeg.get().on('RoomState.events', this.onRoomStateEvents); + MatrixClientPeg.get().on(CryptoEvent.WillUpdateDevices, this.onWillUpdateDevices); + MatrixClientPeg.get().on(CryptoEvent.DevicesUpdated, this.onDevicesUpdated); + MatrixClientPeg.get().on(CryptoEvent.DeviceVerificationChanged, this.onDeviceVerificationChanged); + MatrixClientPeg.get().on(CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); + MatrixClientPeg.get().on(CryptoEvent.KeysChanged, this.onCrossSingingKeysChanged); + MatrixClientPeg.get().on(ClientEvent.AccountData, this.onAccountData); + MatrixClientPeg.get().on(ClientEvent.Sync, this.onSync); + MatrixClientPeg.get().on(RoomStateEvent.Events, this.onRoomStateEvents); this.dispatcherRef = dis.register(this.onAction); this.recheck(); } stop() { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener('crypto.willUpdateDevices', this.onWillUpdateDevices); - MatrixClientPeg.get().removeListener('crypto.devicesUpdated', this.onDevicesUpdated); - MatrixClientPeg.get().removeListener('deviceVerificationChanged', this.onDeviceVerificationChanged); - MatrixClientPeg.get().removeListener('userTrustStatusChanged', this.onUserTrustStatusChanged); - MatrixClientPeg.get().removeListener('crossSigning.keysChanged', this.onCrossSingingKeysChanged); - MatrixClientPeg.get().removeListener('accountData', this.onAccountData); - MatrixClientPeg.get().removeListener('sync', this.onSync); - MatrixClientPeg.get().removeListener('RoomState.events', this.onRoomStateEvents); + MatrixClientPeg.get().removeListener(CryptoEvent.WillUpdateDevices, this.onWillUpdateDevices); + MatrixClientPeg.get().removeListener(CryptoEvent.DevicesUpdated, this.onDevicesUpdated); + MatrixClientPeg.get().removeListener( + CryptoEvent.DeviceVerificationChanged, + this.onDeviceVerificationChanged, + ); + MatrixClientPeg.get().removeListener(CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); + MatrixClientPeg.get().removeListener(CryptoEvent.KeysChanged, this.onCrossSingingKeysChanged); + MatrixClientPeg.get().removeListener(ClientEvent.AccountData, this.onAccountData); + MatrixClientPeg.get().removeListener(ClientEvent.Sync, this.onSync); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, this.onRoomStateEvents); } if (this.dispatcherRef) { dis.unregister(this.dispatcherRef); diff --git a/src/Notifier.ts b/src/Notifier.ts index f5eafba407..c5383488f2 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -17,8 +17,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import { logger } from "matrix-js-sdk/src/logger"; import { MsgType } from "matrix-js-sdk/src/@types/event"; import { LOCATION_EVENT_TYPE } from "matrix-js-sdk/src/@types/location"; @@ -201,20 +202,20 @@ export const Notifier = { this.boundOnRoomReceipt = this.boundOnRoomReceipt || this.onRoomReceipt.bind(this); this.boundOnEventDecrypted = this.boundOnEventDecrypted || this.onEventDecrypted.bind(this); - MatrixClientPeg.get().on('event', this.boundOnEvent); - MatrixClientPeg.get().on('Room.receipt', this.boundOnRoomReceipt); - MatrixClientPeg.get().on('Event.decrypted', this.boundOnEventDecrypted); - MatrixClientPeg.get().on("sync", this.boundOnSyncStateChange); + MatrixClientPeg.get().on(ClientEvent.Event, this.boundOnEvent); + MatrixClientPeg.get().on(RoomEvent.Receipt, this.boundOnRoomReceipt); + MatrixClientPeg.get().on(MatrixEventEvent.Decrypted, this.boundOnEventDecrypted); + MatrixClientPeg.get().on(ClientEvent.Sync, this.boundOnSyncStateChange); this.toolbarHidden = false; this.isSyncing = false; }, stop: function() { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener('Event', this.boundOnEvent); - MatrixClientPeg.get().removeListener('Room.receipt', this.boundOnRoomReceipt); - MatrixClientPeg.get().removeListener('Event.decrypted', this.boundOnEventDecrypted); - MatrixClientPeg.get().removeListener('sync', this.boundOnSyncStateChange); + MatrixClientPeg.get().removeListener(ClientEvent.Event, this.boundOnEvent); + MatrixClientPeg.get().removeListener(RoomEvent.Receipt, this.boundOnRoomReceipt); + MatrixClientPeg.get().removeListener(MatrixEventEvent.Decrypted, this.boundOnEventDecrypted); + MatrixClientPeg.get().removeListener(ClientEvent.Sync, this.boundOnSyncStateChange); } this.isSyncing = false; }, diff --git a/src/actions/MatrixActionCreators.ts b/src/actions/MatrixActionCreators.ts index c17ae3b596..c4d75cc854 100644 --- a/src/actions/MatrixActionCreators.ts +++ b/src/actions/MatrixActionCreators.ts @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixClient } from "matrix-js-sdk/src/client"; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { IRoomTimelineData } from "matrix-js-sdk/src/models/event-timeline-set"; import dis from "../dispatcher/dispatcher"; @@ -274,7 +274,11 @@ let matrixClientListenersStop: Listener[] = []; * when given the MatrixClient as an argument as well as * arguments emitted in the MatrixClient event. */ -function addMatrixClientListener(matrixClient: MatrixClient, eventName: string, actionCreator: ActionCreator): void { +function addMatrixClientListener( + matrixClient: MatrixClient, + eventName: Parameters[0], + actionCreator: ActionCreator, +): void { const listener: Listener = (...args) => { const payload = actionCreator(matrixClient, ...args); if (payload) { @@ -298,15 +302,15 @@ export default { * @param {MatrixClient} matrixClient the MatrixClient to listen to events from */ start(matrixClient: MatrixClient) { - addMatrixClientListener(matrixClient, 'sync', createSyncAction); - addMatrixClientListener(matrixClient, 'accountData', createAccountDataAction); - addMatrixClientListener(matrixClient, 'Room.accountData', createRoomAccountDataAction); - addMatrixClientListener(matrixClient, 'Room', createRoomAction); - addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction); - addMatrixClientListener(matrixClient, 'Room.receipt', createRoomReceiptAction); - addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction); - addMatrixClientListener(matrixClient, 'Room.myMembership', createSelfMembershipAction); - addMatrixClientListener(matrixClient, 'Event.decrypted', createEventDecryptedAction); + addMatrixClientListener(matrixClient, ClientEvent.Sync, createSyncAction); + addMatrixClientListener(matrixClient, ClientEvent.AccountData, createAccountDataAction); + addMatrixClientListener(matrixClient, RoomEvent.AccountData, createRoomAccountDataAction); + addMatrixClientListener(matrixClient, ClientEvent.Room, createRoomAction); + addMatrixClientListener(matrixClient, RoomEvent.Tags, createRoomTagsAction); + addMatrixClientListener(matrixClient, RoomEvent.Receipt, createRoomReceiptAction); + addMatrixClientListener(matrixClient, RoomEvent.Timeline, createRoomTimelineAction); + addMatrixClientListener(matrixClient, RoomEvent.MyMembership, createSelfMembershipAction); + addMatrixClientListener(matrixClient, MatrixEventEvent.Decrypted, createEventDecryptedAction); }, /** diff --git a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx index 3253d7ba33..4bf53a0ce3 100644 --- a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx +++ b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx @@ -22,6 +22,7 @@ import { IKeyBackupInfo } from "matrix-js-sdk/src/crypto/keybackup"; import { TrustInfo } from "matrix-js-sdk/src/crypto/backup"; import { CrossSigningKeys } from "matrix-js-sdk/src"; import { IRecoveryKey } from "matrix-js-sdk/src/crypto/api"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { MatrixClientPeg } from '../../../../MatrixClientPeg'; import { _t, _td } from '../../../../languageHandler'; @@ -145,13 +146,13 @@ export default class CreateSecretStorageDialog extends React.PureComponent { // this could be made more general in the future or the filter logic // could be fixed. if (EventIndexPeg.get() !== null) { - client.on('Room.timeline', this.onRoomTimeline); - client.on('Event.decrypted', this.onEventDecrypted); + client.on(RoomEvent.Timeline, this.onRoomTimeline); + client.on(MatrixEventEvent.Decrypted, this.onEventDecrypted); } } @@ -133,8 +133,8 @@ class FilePanel extends React.Component { if (!MatrixClientPeg.get().isRoomEncrypted(this.props.roomId)) return; if (EventIndexPeg.get() !== null) { - client.removeListener('Room.timeline', this.onRoomTimeline); - client.removeListener('Event.decrypted', this.onEventDecrypted); + client.removeListener(RoomEvent.Timeline, this.onRoomTimeline); + client.removeListener(MatrixEventEvent.Decrypted, this.onEventDecrypted); } } diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index b02d1d0b33..46dee05b21 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -15,12 +15,13 @@ limitations under the License. */ import React, { ClipboardEvent } from 'react'; -import { MatrixClient } from 'matrix-js-sdk/src/client'; +import { ClientEvent, MatrixClient } from 'matrix-js-sdk/src/client'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; import classNames from 'classnames'; import { ISyncStateData, SyncState } from 'matrix-js-sdk/src/sync'; import { IUsageLimit } from 'matrix-js-sdk/src/@types/partials'; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { Key } from '../../Keyboard'; import PageTypes from '../../PageTypes'; @@ -174,15 +175,15 @@ class LoggedInView extends React.Component { this.updateServerNoticeEvents(); - this._matrixClient.on("accountData", this.onAccountData); - this._matrixClient.on("sync", this.onSync); + this._matrixClient.on(ClientEvent.AccountData, this.onAccountData); + this._matrixClient.on(ClientEvent.Sync, this.onSync); // Call `onSync` with the current state as well this.onSync( this._matrixClient.getSyncState(), null, this._matrixClient.getSyncStateData(), ); - this._matrixClient.on("RoomState.events", this.onRoomStateEvents); + this._matrixClient.on(RoomStateEvent.Events, this.onRoomStateEvents); this.layoutWatcherRef = SettingsStore.watchSetting("layout", null, this.onCompactLayoutChanged); this.compactLayoutWatcherRef = SettingsStore.watchSetting( @@ -203,9 +204,9 @@ class LoggedInView extends React.Component { componentWillUnmount() { document.removeEventListener('keydown', this.onNativeKeyDown, false); CallHandler.instance.removeListener(CallHandlerEvent.CallState, this.onCallState); - this._matrixClient.removeListener("accountData", this.onAccountData); - this._matrixClient.removeListener("sync", this.onSync); - this._matrixClient.removeListener("RoomState.events", this.onRoomStateEvents); + this._matrixClient.removeListener(ClientEvent.AccountData, this.onAccountData); + this._matrixClient.removeListener(ClientEvent.Sync, this.onSync); + this._matrixClient.removeListener(RoomStateEvent.Events, this.onRoomStateEvents); OwnProfileStore.instance.off(UPDATE_EVENT, this.refreshBackgroundImage); SettingsStore.unwatchSetting(this.layoutWatcherRef); SettingsStore.unwatchSetting(this.compactLayoutWatcherRef); diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 59d9b97ea5..89ca0b2754 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -15,7 +15,14 @@ limitations under the License. */ import React, { ComponentType, createRef } from 'react'; -import { createClient, EventType, MatrixClient } from 'matrix-js-sdk/src/matrix'; +import { + ClientEvent, + createClient, + EventType, + HttpApiEvent, + MatrixClient, + MatrixEventEvent, +} from 'matrix-js-sdk/src/matrix'; import { ISyncStateData, SyncState } from 'matrix-js-sdk/src/sync'; import { MatrixError } from 'matrix-js-sdk/src/http-api'; import { InvalidStoreError } from "matrix-js-sdk/src/errors"; @@ -23,6 +30,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { defer, IDeferred, QueryDict } from "matrix-js-sdk/src/utils"; import { logger } from "matrix-js-sdk/src/logger"; import { throttle } from "lodash"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; // focus-visible is a Polyfill for the :focus-visible CSS pseudo-attribute used by _AccessibleButton.scss import 'focus-visible'; @@ -1246,10 +1254,10 @@ export default class MatrixChat extends React.PureComponent { const saveWelcomeUser = (ev: MatrixEvent) => { if (ev.getType() === EventType.Direct && ev.getContent()[this.props.config.welcomeUserId]) { MatrixClientPeg.get().store.save(true); - MatrixClientPeg.get().removeListener("accountData", saveWelcomeUser); + MatrixClientPeg.get().removeListener(ClientEvent.AccountData, saveWelcomeUser); } }; - MatrixClientPeg.get().on("accountData", saveWelcomeUser); + MatrixClientPeg.get().on(ClientEvent.AccountData, saveWelcomeUser); return roomId; } @@ -1432,7 +1440,7 @@ export default class MatrixChat extends React.PureComponent { return this.loggedInView.current.canResetTimelineInRoom(roomId); }); - cli.on('sync', (state: SyncState, prevState?: SyncState, data?: ISyncStateData) => { + cli.on(ClientEvent.Sync, (state: SyncState, prevState?: SyncState, data?: ISyncStateData) => { if (state === SyncState.Error || state === SyncState.Reconnecting) { if (data.error instanceof InvalidStoreError) { Lifecycle.handleInvalidStoreError(data.error); @@ -1497,7 +1505,7 @@ export default class MatrixChat extends React.PureComponent { }); }); - cli.on('Session.logged_out', function(errObj) { + cli.on(HttpApiEvent.SessionLoggedOut, function(errObj) { if (Lifecycle.isLoggingOut()) return; // A modal might have been open when we were logged out by the server @@ -1518,7 +1526,7 @@ export default class MatrixChat extends React.PureComponent { action: 'logout', }); }); - cli.on('no_consent', function(message, consentUri) { + cli.on(HttpApiEvent.NoConsent, function(message, consentUri) { Modal.createTrackedDialog('No Consent Dialog', '', QuestionDialog, { title: _t('Terms and Conditions'), description:
@@ -1549,10 +1557,10 @@ export default class MatrixChat extends React.PureComponent { dft.start(); // When logging out, stop tracking failures and destroy state - cli.on("Session.logged_out", () => dft.stop()); - cli.on("Event.decrypted", (e, err) => dft.eventDecrypted(e, err)); + cli.on(HttpApiEvent.SessionLoggedOut, () => dft.stop()); + cli.on(MatrixEventEvent.Decrypted, (e, err) => dft.eventDecrypted(e, err as MatrixError)); - cli.on("Room", (room) => { + cli.on(ClientEvent.Room, (room) => { if (MatrixClientPeg.get().isCryptoEnabled()) { const blacklistEnabled = SettingsStore.getValueAt( SettingLevel.ROOM_DEVICE, @@ -1563,7 +1571,7 @@ export default class MatrixChat extends React.PureComponent { room.setBlacklistUnverifiedDevices(blacklistEnabled); } }); - cli.on("crypto.warning", (type) => { + cli.on(CryptoEvent.Warning, (type) => { switch (type) { case 'CRYPTO_WARNING_OLD_VERSION_DETECTED': Modal.createTrackedDialog('Crypto migrated', '', ErrorDialog, { @@ -1582,7 +1590,7 @@ export default class MatrixChat extends React.PureComponent { break; } }); - cli.on("crypto.keyBackupFailed", async (errcode) => { + cli.on(CryptoEvent.KeyBackupFailed, async (errcode) => { let haveNewVersion; let newVersionInfo; // if key backup is still enabled, there must be a new backup in place @@ -1615,7 +1623,7 @@ export default class MatrixChat extends React.PureComponent { } }); - cli.on("crypto.keySignatureUploadFailure", (failures, source, continuation) => { + cli.on(CryptoEvent.KeySignatureUploadFailure, (failures, source, continuation) => { Modal.createTrackedDialog( 'Failed to upload key signatures', 'Failed to upload key signatures', @@ -1623,7 +1631,7 @@ export default class MatrixChat extends React.PureComponent { { failures, source, continuation }); }); - cli.on("crypto.verification.request", request => { + cli.on(CryptoEvent.VerificationRequest, request => { if (request.verifier) { Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { verifier: request.verifier, diff --git a/src/components/structures/MessagePanel.tsx b/src/components/structures/MessagePanel.tsx index 938e01b8e7..1a1dde847c 100644 --- a/src/components/structures/MessagePanel.tsx +++ b/src/components/structures/MessagePanel.tsx @@ -21,6 +21,7 @@ import { EventType } from 'matrix-js-sdk/src/@types/event'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { Relations } from "matrix-js-sdk/src/models/relations"; import { logger } from 'matrix-js-sdk/src/logger'; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import shouldHideEvent from '../../shouldHideEvent'; import { wantsDateSeparator } from '../../DateUtils'; @@ -274,13 +275,13 @@ export default class MessagePanel extends React.Component { componentDidMount() { this.calculateRoomMembersCount(); - this.props.room?.on("RoomState.members", this.calculateRoomMembersCount); + this.props.room?.currentState.on(RoomStateEvent.Members, this.calculateRoomMembersCount); this.isMounted = true; } componentWillUnmount() { this.isMounted = false; - this.props.room?.off("RoomState.members", this.calculateRoomMembersCount); + this.props.room?.currentState.off(RoomStateEvent.Members, this.calculateRoomMembersCount); SettingsStore.unwatchSetting(this.showTypingNotificationsWatcherRef); } diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index f66842792f..6908159c27 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -153,14 +153,12 @@ export default class ThreadView extends React.Component { thread = this.props.room.createThread(mxEv); } thread.on(ThreadEvent.Update, this.updateLastThreadReply); - thread.once(ThreadEvent.Ready, this.updateThread); this.updateThread(thread); }; private teardownThread = () => { if (this.state.thread) { this.state.thread.removeListener(ThreadEvent.Update, this.updateLastThreadReply); - this.state.thread.removeListener(ThreadEvent.Ready, this.updateThread); } }; diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index 4db1c56c3a..22609bc629 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -16,16 +16,17 @@ limitations under the License. import React, { createRef, ReactNode, SyntheticEvent } from 'react'; import ReactDOM from "react-dom"; -import { NotificationCountType, Room } from "matrix-js-sdk/src/models/room"; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { NotificationCountType, Room, RoomEvent } from "matrix-js-sdk/src/models/room"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; import { EventTimelineSet, IRoomTimelineData } from "matrix-js-sdk/src/models/event-timeline-set"; import { Direction, EventTimeline } from "matrix-js-sdk/src/models/event-timeline"; import { TimelineWindow } from "matrix-js-sdk/src/timeline-window"; import { EventType, RelationType } from 'matrix-js-sdk/src/@types/event'; import { SyncState } from 'matrix-js-sdk/src/sync'; -import { RoomMember } from 'matrix-js-sdk/src/models/room-member'; +import { RoomMember, RoomMemberEvent } from 'matrix-js-sdk/src/models/room-member'; import { debounce } from 'lodash'; import { logger } from "matrix-js-sdk/src/logger"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import SettingsStore from "../../settings/SettingsStore"; import { Layout } from "../../settings/enums/Layout"; @@ -276,22 +277,22 @@ class TimelinePanel extends React.Component { this.dispatcherRef = dis.register(this.onAction); const cli = MatrixClientPeg.get(); - cli.on("Room.timeline", this.onRoomTimeline); - cli.on("Room.timelineReset", this.onRoomTimelineReset); - cli.on("Room.redaction", this.onRoomRedaction); + cli.on(RoomEvent.Timeline, this.onRoomTimeline); + cli.on(RoomEvent.TimelineReset, this.onRoomTimelineReset); + cli.on(RoomEvent.Redaction, this.onRoomRedaction); if (SettingsStore.getValue("feature_msc3531_hide_messages_pending_moderation")) { // Make sure that events are re-rendered when their visibility-pending-moderation changes. - cli.on("Event.visibilityChange", this.onEventVisibilityChange); - cli.on("RoomMember.powerLevel", this.onVisibilityPowerLevelChange); + cli.on(MatrixEventEvent.VisibilityChange, this.onEventVisibilityChange); + cli.on(RoomMemberEvent.PowerLevel, this.onVisibilityPowerLevelChange); } // same event handler as Room.redaction as for both we just do forceUpdate - cli.on("Room.redactionCancelled", this.onRoomRedaction); - cli.on("Room.receipt", this.onRoomReceipt); - cli.on("Room.localEchoUpdated", this.onLocalEchoUpdated); - cli.on("Room.accountData", this.onAccountData); - cli.on("Event.decrypted", this.onEventDecrypted); - cli.on("Event.replaced", this.onEventReplaced); - cli.on("sync", this.onSync); + cli.on(RoomEvent.RedactionCancelled, this.onRoomRedaction); + cli.on(RoomEvent.Receipt, this.onRoomReceipt); + cli.on(RoomEvent.LocalEchoUpdated, this.onLocalEchoUpdated); + cli.on(RoomEvent.AccountData, this.onAccountData); + cli.on(MatrixEventEvent.Decrypted, this.onEventDecrypted); + cli.on(MatrixEventEvent.Replaced, this.onEventReplaced); + cli.on(ClientEvent.Sync, this.onSync); } // TODO: [REACT-WARNING] Move into constructor @@ -353,18 +354,18 @@ class TimelinePanel extends React.Component { const client = MatrixClientPeg.get(); if (client) { - client.removeListener("Room.timeline", this.onRoomTimeline); - client.removeListener("Room.timelineReset", this.onRoomTimelineReset); - client.removeListener("Room.redaction", this.onRoomRedaction); - client.removeListener("Room.redactionCancelled", this.onRoomRedaction); - client.removeListener("Room.receipt", this.onRoomReceipt); - client.removeListener("Room.localEchoUpdated", this.onLocalEchoUpdated); - client.removeListener("Room.accountData", this.onAccountData); - client.removeListener("RoomMember.powerLevel", this.onVisibilityPowerLevelChange); - client.removeListener("Event.decrypted", this.onEventDecrypted); - client.removeListener("Event.replaced", this.onEventReplaced); - client.removeListener("Event.visibilityChange", this.onEventVisibilityChange); - client.removeListener("sync", this.onSync); + client.removeListener(RoomEvent.Timeline, this.onRoomTimeline); + client.removeListener(RoomEvent.TimelineReset, this.onRoomTimelineReset); + client.removeListener(RoomEvent.Redaction, this.onRoomRedaction); + client.removeListener(RoomEvent.RedactionCancelled, this.onRoomRedaction); + client.removeListener(RoomEvent.Receipt, this.onRoomReceipt); + client.removeListener(RoomEvent.LocalEchoUpdated, this.onLocalEchoUpdated); + client.removeListener(RoomEvent.AccountData, this.onAccountData); + client.removeListener(RoomMemberEvent.PowerLevel, this.onVisibilityPowerLevelChange); + client.removeListener(MatrixEventEvent.Decrypted, this.onEventDecrypted); + client.removeListener(MatrixEventEvent.Replaced, this.onEventReplaced); + client.removeListener(MatrixEventEvent.VisibilityChange, this.onEventVisibilityChange); + client.removeListener(ClientEvent.Sync, this.onSync); } } @@ -673,11 +674,11 @@ class TimelinePanel extends React.Component { this.forceUpdate(); }; - private onEventReplaced = (replacedEvent: MatrixEvent, room: Room): void => { + private onEventReplaced = (replacedEvent: MatrixEvent): void => { if (this.unmounted) return; // ignore events for other rooms - if (room !== this.props.timelineSet.room) return; + if (replacedEvent.getRoomId() !== this.props.timelineSet.room.roomId) return; // we could skip an update if the event isn't in our timeline, // but that's probably an early optimisation. diff --git a/src/components/views/avatars/DecoratedRoomAvatar.tsx b/src/components/views/avatars/DecoratedRoomAvatar.tsx index 11aaa40acb..0456a2e634 100644 --- a/src/components/views/avatars/DecoratedRoomAvatar.tsx +++ b/src/components/views/avatars/DecoratedRoomAvatar.tsx @@ -16,8 +16,8 @@ limitations under the License. import React from "react"; import classNames from "classnames"; -import { Room } from "matrix-js-sdk/src/models/room"; -import { User } from "matrix-js-sdk/src/models/user"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; +import { User, UserEvent } from "matrix-js-sdk/src/models/user"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { JoinRule } from "matrix-js-sdk/src/@types/partials"; @@ -89,7 +89,7 @@ export default class DecoratedRoomAvatar extends React.PureComponent { } public componentDidMount() { - MatrixClientPeg.get().on("RoomState.events", this.onRoomStateEvents); + MatrixClientPeg.get().on(RoomStateEvent.Events, this.onRoomStateEvents); } public componentWillUnmount() { const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener("RoomState.events", this.onRoomStateEvents); + cli.removeListener(RoomStateEvent.Events, this.onRoomStateEvents); } } diff --git a/src/components/views/context_menus/MessageContextMenu.tsx b/src/components/views/context_menus/MessageContextMenu.tsx index 0602ea6013..28089fb70f 100644 --- a/src/components/views/context_menus/MessageContextMenu.tsx +++ b/src/components/views/context_menus/MessageContextMenu.tsx @@ -19,6 +19,7 @@ import React, { ReactElement } from 'react'; import { EventStatus, MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { EventType, RelationType } from "matrix-js-sdk/src/@types/event"; import { Relations } from 'matrix-js-sdk/src/models/relations'; +import { RoomMemberEvent } from "matrix-js-sdk/src/models/room-member"; import { LOCATION_EVENT_TYPE } from 'matrix-js-sdk/src/@types/location'; import { M_POLL_START } from "matrix-events-sdk"; @@ -40,7 +41,7 @@ import ViewSource from '../../structures/ViewSource'; import { createRedactEventDialog } from '../dialogs/ConfirmRedactDialog'; import ShareDialog from '../dialogs/ShareDialog'; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; -import { IPosition, ChevronFace } from '../../structures/ContextMenu'; +import { ChevronFace, IPosition } from '../../structures/ContextMenu'; import RoomContext, { TimelineRenderingType } from '../../../contexts/RoomContext'; import { ComposerInsertPayload } from "../../../dispatcher/payloads/ComposerInsertPayload"; import { WidgetLayoutStore } from '../../../stores/widgets/WidgetLayoutStore'; @@ -98,14 +99,14 @@ export default class MessageContextMenu extends React.Component }; componentDidMount() { - MatrixClientPeg.get().on('RoomMember.powerLevel', this.checkPermissions); + MatrixClientPeg.get().on(RoomMemberEvent.PowerLevel, this.checkPermissions); this.checkPermissions(); } componentWillUnmount() { const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener('RoomMember.powerLevel', this.checkPermissions); + cli.removeListener(RoomMemberEvent.PowerLevel, this.checkPermissions); } } diff --git a/src/components/views/dialogs/IncomingSasDialog.tsx b/src/components/views/dialogs/IncomingSasDialog.tsx index fa23ca4245..d856412c67 100644 --- a/src/components/views/dialogs/IncomingSasDialog.tsx +++ b/src/components/views/dialogs/IncomingSasDialog.tsx @@ -15,8 +15,8 @@ limitations under the License. */ import React from 'react'; -import { IGeneratedSas, ISasEvent } from "matrix-js-sdk/src/crypto/verification/SAS"; -import { VerificationBase } from "matrix-js-sdk/src/crypto/verification/Base"; +import { IGeneratedSas, ISasEvent, SasEvent } from "matrix-js-sdk/src/crypto/verification/SAS"; +import { VerificationBase, VerificationEvent } from "matrix-js-sdk/src/crypto/verification/Base"; import { logger } from "matrix-js-sdk/src/logger"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; @@ -39,7 +39,7 @@ const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; interface IProps extends IDialogProps { - verifier: VerificationBase; + verifier: VerificationBase; } interface IState { @@ -75,8 +75,8 @@ export default class IncomingSasDialog extends React.Component { opponentProfileError: null, sas: null, }; - this.props.verifier.on('show_sas', this.onVerifierShowSas); - this.props.verifier.on('cancel', this.onVerifierCancel); + this.props.verifier.on(SasEvent.ShowSas, this.onVerifierShowSas); + this.props.verifier.on(VerificationEvent.Cancel, this.onVerifierCancel); this.fetchOpponentProfile(); } @@ -84,7 +84,7 @@ export default class IncomingSasDialog extends React.Component { if (this.state.phase !== PHASE_CANCELLED && this.state.phase !== PHASE_VERIFIED) { this.props.verifier.cancel(new Error('User cancel')); } - this.props.verifier.removeListener('show_sas', this.onVerifierShowSas); + this.props.verifier.removeListener(SasEvent.ShowSas, this.onVerifierShowSas); } private async fetchOpponentProfile(): Promise { diff --git a/src/components/views/dialogs/RoomSettingsDialog.tsx b/src/components/views/dialogs/RoomSettingsDialog.tsx index dd67e508d2..3806e9288c 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.tsx +++ b/src/components/views/dialogs/RoomSettingsDialog.tsx @@ -16,6 +16,7 @@ limitations under the License. */ import React from 'react'; +import { RoomEvent } from "matrix-js-sdk/src/models/room"; import TabbedView, { Tab } from "../../structures/TabbedView"; import { _t, _td } from "../../../languageHandler"; @@ -61,7 +62,7 @@ export default class RoomSettingsDialog extends React.Component public componentDidMount() { this.dispatcherRef = dis.register(this.onAction); - MatrixClientPeg.get().on("Room.name", this.onRoomName); + MatrixClientPeg.get().on(RoomEvent.Name, this.onRoomName); this.onRoomName(); } @@ -70,7 +71,7 @@ export default class RoomSettingsDialog extends React.Component dis.unregister(this.dispatcherRef); } - MatrixClientPeg.get().removeListener("Room.name", this.onRoomName); + MatrixClientPeg.get().removeListener(RoomEvent.Name, this.onRoomName); } private onAction = (payload): void => { diff --git a/src/components/views/elements/AppTile.tsx b/src/components/views/elements/AppTile.tsx index fda6c732c1..b4fe768164 100644 --- a/src/components/views/elements/AppTile.tsx +++ b/src/components/views/elements/AppTile.tsx @@ -21,7 +21,7 @@ import url from 'url'; import React, { ContextType, createRef } from 'react'; import classNames from 'classnames'; import { MatrixCapabilities } from "matrix-widget-api"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { logger } from "matrix-js-sdk/src/logger"; import AccessibleButton from './AccessibleButton'; @@ -42,7 +42,7 @@ import WidgetAvatar from "../avatars/WidgetAvatar"; import { replaceableComponent } from "../../../utils/replaceableComponent"; import CallHandler from '../../../CallHandler'; import { IApp } from "../../../stores/WidgetStore"; -import { WidgetLayoutStore, Container } from "../../../stores/widgets/WidgetLayoutStore"; +import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore"; import { OwnProfileStore } from '../../../stores/OwnProfileStore'; import { UPDATE_EVENT } from '../../../stores/AsyncStore'; import RoomViewStore from '../../../stores/RoomViewStore'; @@ -269,7 +269,7 @@ export default class AppTile extends React.Component { this.watchUserReady(); if (this.props.room) { - this.context.on("Room.myMembership", this.onMyMembership); + this.context.on(RoomEvent.MyMembership, this.onMyMembership); } this.allowedWidgetsWatchRef = SettingsStore.watchSetting("allowedWidgets", null, this.onAllowedWidgetsChange); @@ -306,7 +306,7 @@ export default class AppTile extends React.Component { if (this.dispatcherRef) dis.unregister(this.dispatcherRef); if (this.props.room) { - this.context.off("Room.myMembership", this.onMyMembership); + this.context.off(RoomEvent.MyMembership, this.onMyMembership); } SettingsStore.unwatchSetting(this.allowedWidgetsWatchRef); diff --git a/src/components/views/location/LocationPicker.tsx b/src/components/views/location/LocationPicker.tsx index 33f91ff731..6683016e0a 100644 --- a/src/components/views/location/LocationPicker.tsx +++ b/src/components/views/location/LocationPicker.tsx @@ -18,7 +18,7 @@ import React, { SyntheticEvent } from 'react'; import maplibregl from 'maplibre-gl'; import { logger } from "matrix-js-sdk/src/logger"; import { RoomMember } from 'matrix-js-sdk/src/models/room-member'; -import { IClientWellKnown } from 'matrix-js-sdk/src/client'; +import { ClientEvent, IClientWellKnown } from 'matrix-js-sdk/src/client'; import DialogButtons from "../elements/DialogButtons"; import { _t } from '../../../languageHandler'; @@ -71,7 +71,7 @@ class LocationPicker extends React.Component { }; componentDidMount() { - this.context.on("WellKnown.client", this.updateStyleUrl); + this.context.on(ClientEvent.ClientWellKnown, this.updateStyleUrl); try { this.map = new maplibregl.Map({ @@ -134,7 +134,7 @@ class LocationPicker extends React.Component { componentWillUnmount() { this.geolocate?.off('geolocate', this.onGeolocate); - this.context.off("WellKnown.client", this.updateStyleUrl); + this.context.off(ClientEvent.ClientWellKnown, this.updateStyleUrl); } private updateStyleUrl = (clientWellKnown: IClientWellKnown) => { diff --git a/src/components/views/location/LocationViewDialog.tsx b/src/components/views/location/LocationViewDialog.tsx index e09e73aded..bc40255c21 100644 --- a/src/components/views/location/LocationViewDialog.tsx +++ b/src/components/views/location/LocationViewDialog.tsx @@ -16,7 +16,7 @@ limitations under the License. import React from 'react'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; -import { IClientWellKnown, MatrixClient } from 'matrix-js-sdk/src/client'; +import { ClientEvent, IClientWellKnown, MatrixClient } from 'matrix-js-sdk/src/client'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import BaseDialog from "../dialogs/BaseDialog"; @@ -53,7 +53,7 @@ export default class LocationViewDialog extends React.Component return; } - this.props.matrixClient.on("WellKnown.client", this.updateStyleUrl); + this.props.matrixClient.on(ClientEvent.ClientWellKnown, this.updateStyleUrl); this.map = createMap( this.coords, @@ -65,7 +65,7 @@ export default class LocationViewDialog extends React.Component } componentWillUnmount() { - this.props.matrixClient.off("WellKnown.client", this.updateStyleUrl); + this.props.matrixClient.off(ClientEvent.ClientWellKnown, this.updateStyleUrl); } private updateStyleUrl = (clientWellKnown: IClientWellKnown) => { diff --git a/src/components/views/messages/EditHistoryMessage.tsx b/src/components/views/messages/EditHistoryMessage.tsx index 01c133efb1..e0edbff046 100644 --- a/src/components/views/messages/EditHistoryMessage.tsx +++ b/src/components/views/messages/EditHistoryMessage.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React, { createRef } from 'react'; -import { EventStatus, MatrixEvent } from 'matrix-js-sdk/src/models/event'; +import { EventStatus, MatrixEvent, MatrixEventEvent } from 'matrix-js-sdk/src/models/event'; import classNames from 'classnames'; import * as HtmlUtils from '../../../HtmlUtils'; @@ -62,7 +62,7 @@ export default class EditHistoryMessage extends React.PureComponent { componentDidMount() { this.unmounted = false; - MatrixClientPeg.get().on('sync', this.onClientSync); + MatrixClientPeg.get().on(ClientEvent.Sync, this.onClientSync); const showImage = this.state.showImage || localStorage.getItem("mx_ShowImage_" + this.props.mxEvent.getId()) === "true"; @@ -329,7 +330,7 @@ export default class MImageBody extends React.Component { componentWillUnmount() { this.unmounted = true; - MatrixClientPeg.get().removeListener('sync', this.onClientSync); + MatrixClientPeg.get().removeListener(ClientEvent.Sync, this.onClientSync); this.clearBlurhashTimeout(); SettingsStore.unwatchSetting(this.sizeWatcher); } diff --git a/src/components/views/messages/MKeyVerificationConclusion.tsx b/src/components/views/messages/MKeyVerificationConclusion.tsx index 1a1d0ccc13..1e5312c4a5 100644 --- a/src/components/views/messages/MKeyVerificationConclusion.tsx +++ b/src/components/views/messages/MKeyVerificationConclusion.tsx @@ -17,8 +17,12 @@ limitations under the License. import React from 'react'; import classNames from 'classnames'; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import { + VerificationRequest, + VerificationRequestEvent, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { EventType } from "matrix-js-sdk/src/@types/event"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; @@ -41,19 +45,19 @@ export default class MKeyVerificationConclusion extends React.Component public componentDidMount(): void { const request = this.props.mxEvent.verificationRequest; if (request) { - request.on("change", this.onRequestChanged); + request.on(VerificationRequestEvent.Change, this.onRequestChanged); } - MatrixClientPeg.get().on("userTrustStatusChanged", this.onTrustChanged); + MatrixClientPeg.get().on(CryptoEvent.UserTrustStatusChanged, this.onTrustChanged); } public componentWillUnmount(): void { const request = this.props.mxEvent.verificationRequest; if (request) { - request.off("change", this.onRequestChanged); + request.off(VerificationRequestEvent.Change, this.onRequestChanged); } const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener("userTrustStatusChanged", this.onTrustChanged); + cli.removeListener(CryptoEvent.UserTrustStatusChanged, this.onTrustChanged); } } diff --git a/src/components/views/messages/MKeyVerificationRequest.tsx b/src/components/views/messages/MKeyVerificationRequest.tsx index 5dccfeec72..1e53acd047 100644 --- a/src/components/views/messages/MKeyVerificationRequest.tsx +++ b/src/components/views/messages/MKeyVerificationRequest.tsx @@ -17,11 +17,11 @@ limitations under the License. import React from 'react'; import { MatrixEvent } from 'matrix-js-sdk/src'; import { logger } from "matrix-js-sdk/src/logger"; +import { VerificationRequestEvent } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; -import { getNameForEventRoom, userLabelForEventRoom } - from '../../../utils/KeyVerificationStateObserver'; +import { getNameForEventRoom, userLabelForEventRoom } from '../../../utils/KeyVerificationStateObserver'; import { RightPanelPhases } from '../../../stores/right-panel/RightPanelStorePhases'; import EventTileBubble from "./EventTileBubble"; import { replaceableComponent } from "../../../utils/replaceableComponent"; @@ -38,14 +38,14 @@ export default class MKeyVerificationRequest extends React.Component { public componentDidMount() { const request = this.props.mxEvent.verificationRequest; if (request) { - request.on("change", this.onRequestChanged); + request.on(VerificationRequestEvent.Change, this.onRequestChanged); } } public componentWillUnmount() { const request = this.props.mxEvent.verificationRequest; if (request) { - request.off("change", this.onRequestChanged); + request.off(VerificationRequestEvent.Change, this.onRequestChanged); } } diff --git a/src/components/views/messages/MLocationBody.tsx b/src/components/views/messages/MLocationBody.tsx index 9d4c2d13c3..6c329d2c50 100644 --- a/src/components/views/messages/MLocationBody.tsx +++ b/src/components/views/messages/MLocationBody.tsx @@ -24,7 +24,7 @@ import { ILocationContent, LOCATION_EVENT_TYPE, } from 'matrix-js-sdk/src/@types/location'; -import { IClientWellKnown } from 'matrix-js-sdk/src/client'; +import { ClientEvent, IClientWellKnown } from 'matrix-js-sdk/src/client'; import SdkConfig from '../../../SdkConfig'; import { replaceableComponent } from "../../../utils/replaceableComponent"; @@ -71,7 +71,7 @@ export default class MLocationBody extends React.Component { return; } - this.context.on("WellKnown.client", this.updateStyleUrl); + this.context.on(ClientEvent.ClientWellKnown, this.updateStyleUrl); this.map = createMap( this.coords, @@ -83,7 +83,7 @@ export default class MLocationBody extends React.Component { } componentWillUnmount() { - this.context.off("WellKnown.client", this.updateStyleUrl); + this.context.off(ClientEvent.ClientWellKnown, this.updateStyleUrl); } private updateStyleUrl = (clientWellKnown: IClientWellKnown) => { diff --git a/src/components/views/messages/MPollBody.tsx b/src/components/views/messages/MPollBody.tsx index 8b754b54b6..3b05c09f7a 100644 --- a/src/components/views/messages/MPollBody.tsx +++ b/src/components/views/messages/MPollBody.tsx @@ -16,8 +16,8 @@ limitations under the License. import React from 'react'; import classNames from 'classnames'; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { Relations } from 'matrix-js-sdk/src/models/relations'; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; +import { Relations, RelationsEvent } from 'matrix-js-sdk/src/models/relations'; import { MatrixClient } from 'matrix-js-sdk/src/matrix'; import { M_POLL_END, @@ -228,37 +228,37 @@ export default class MPollBody extends React.Component { }; this.addListeners(this.state.voteRelations, this.state.endRelations); - this.props.mxEvent.on("Event.relationsCreated", this.onRelationsCreated); + this.props.mxEvent.on(MatrixEventEvent.RelationsCreated, this.onRelationsCreated); } componentWillUnmount() { - this.props.mxEvent.off("Event.relationsCreated", this.onRelationsCreated); + this.props.mxEvent.off(MatrixEventEvent.RelationsCreated, this.onRelationsCreated); this.removeListeners(this.state.voteRelations, this.state.endRelations); } private addListeners(voteRelations?: RelatedRelations, endRelations?: RelatedRelations) { if (voteRelations) { - voteRelations.on("Relations.add", this.onRelationsChange); - voteRelations.on("Relations.remove", this.onRelationsChange); - voteRelations.on("Relations.redaction", this.onRelationsChange); + voteRelations.on(RelationsEvent.Add, this.onRelationsChange); + voteRelations.on(RelationsEvent.Remove, this.onRelationsChange); + voteRelations.on(RelationsEvent.Redaction, this.onRelationsChange); } if (endRelations) { - endRelations.on("Relations.add", this.onRelationsChange); - endRelations.on("Relations.remove", this.onRelationsChange); - endRelations.on("Relations.redaction", this.onRelationsChange); + endRelations.on(RelationsEvent.Add, this.onRelationsChange); + endRelations.on(RelationsEvent.Remove, this.onRelationsChange); + endRelations.on(RelationsEvent.Redaction, this.onRelationsChange); } } private removeListeners(voteRelations?: RelatedRelations, endRelations?: RelatedRelations) { if (voteRelations) { - voteRelations.off("Relations.add", this.onRelationsChange); - voteRelations.off("Relations.remove", this.onRelationsChange); - voteRelations.off("Relations.redaction", this.onRelationsChange); + voteRelations.off(RelationsEvent.Add, this.onRelationsChange); + voteRelations.off(RelationsEvent.Remove, this.onRelationsChange); + voteRelations.off(RelationsEvent.Redaction, this.onRelationsChange); } if (endRelations) { - endRelations.off("Relations.add", this.onRelationsChange); - endRelations.off("Relations.remove", this.onRelationsChange); - endRelations.off("Relations.redaction", this.onRelationsChange); + endRelations.off(RelationsEvent.Add, this.onRelationsChange); + endRelations.off(RelationsEvent.Remove, this.onRelationsChange); + endRelations.off(RelationsEvent.Redaction, this.onRelationsChange); } } @@ -282,8 +282,7 @@ export default class MPollBody extends React.Component { } if (this.voteRelationsReceived && this.endRelationsReceived) { - this.props.mxEvent.removeListener( - "Event.relationsCreated", this.onRelationsCreated); + this.props.mxEvent.removeListener(MatrixEventEvent.RelationsCreated, this.onRelationsCreated); } }; diff --git a/src/components/views/messages/MessageActionBar.tsx b/src/components/views/messages/MessageActionBar.tsx index b842664d1e..d0e259f887 100644 --- a/src/components/views/messages/MessageActionBar.tsx +++ b/src/components/views/messages/MessageActionBar.tsx @@ -17,7 +17,7 @@ limitations under the License. */ import React, { ReactElement, useEffect } from 'react'; -import { EventStatus, MatrixEvent } from 'matrix-js-sdk/src/models/event'; +import { EventStatus, MatrixEvent, MatrixEventEvent } from 'matrix-js-sdk/src/models/event'; import classNames from 'classnames'; import { MsgType } from 'matrix-js-sdk/src/@types/event'; @@ -175,22 +175,22 @@ export default class MessageActionBar extends React.PureComponent { diff --git a/src/components/views/messages/ReactionsRow.tsx b/src/components/views/messages/ReactionsRow.tsx index 3058770c47..7cce3238b7 100644 --- a/src/components/views/messages/ReactionsRow.tsx +++ b/src/components/views/messages/ReactionsRow.tsx @@ -16,8 +16,8 @@ limitations under the License. import React from "react"; import classNames from "classnames"; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { Relations } from "matrix-js-sdk/src/models/relations"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; +import { Relations, RelationsEvent } from "matrix-js-sdk/src/models/relations"; import { _t } from '../../../languageHandler'; import { isContentActionable } from '../../../utils/EventUtils'; @@ -93,33 +93,33 @@ export default class ReactionsRow extends React.PureComponent { const { mxEvent, reactions } = this.props; if (mxEvent.isBeingDecrypted() || mxEvent.shouldAttemptDecryption()) { - mxEvent.once("Event.decrypted", this.onDecrypted); + mxEvent.once(MatrixEventEvent.Decrypted, this.onDecrypted); } if (reactions) { - reactions.on("Relations.add", this.onReactionsChange); - reactions.on("Relations.remove", this.onReactionsChange); - reactions.on("Relations.redaction", this.onReactionsChange); + reactions.on(RelationsEvent.Add, this.onReactionsChange); + reactions.on(RelationsEvent.Remove, this.onReactionsChange); + reactions.on(RelationsEvent.Redaction, this.onReactionsChange); } } componentWillUnmount() { const { mxEvent, reactions } = this.props; - mxEvent.off("Event.decrypted", this.onDecrypted); + mxEvent.off(MatrixEventEvent.Decrypted, this.onDecrypted); if (reactions) { - reactions.off("Relations.add", this.onReactionsChange); - reactions.off("Relations.remove", this.onReactionsChange); - reactions.off("Relations.redaction", this.onReactionsChange); + reactions.off(RelationsEvent.Add, this.onReactionsChange); + reactions.off(RelationsEvent.Remove, this.onReactionsChange); + reactions.off(RelationsEvent.Redaction, this.onReactionsChange); } } componentDidUpdate(prevProps: IProps) { if (prevProps.reactions !== this.props.reactions) { - this.props.reactions.on("Relations.add", this.onReactionsChange); - this.props.reactions.on("Relations.remove", this.onReactionsChange); - this.props.reactions.on("Relations.redaction", this.onReactionsChange); + this.props.reactions.on(RelationsEvent.Add, this.onReactionsChange); + this.props.reactions.on(RelationsEvent.Remove, this.onReactionsChange); + this.props.reactions.on(RelationsEvent.Redaction, this.onReactionsChange); this.onReactionsChange(); } } diff --git a/src/components/views/messages/ViewSourceEvent.tsx b/src/components/views/messages/ViewSourceEvent.tsx index 6385f05e51..8e61b119c4 100644 --- a/src/components/views/messages/ViewSourceEvent.tsx +++ b/src/components/views/messages/ViewSourceEvent.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from 'react'; -import { MatrixEvent } from 'matrix-js-sdk/src'; +import { MatrixEvent, MatrixEventEvent } from 'matrix-js-sdk/src'; import classNames from 'classnames'; import { replaceableComponent } from "../../../utils/replaceableComponent"; @@ -48,7 +48,7 @@ export default class ViewSourceEvent extends React.PureComponent client.decryptEventIfNeeded(mxEvent); if (mxEvent.isBeingDecrypted()) { - mxEvent.once("Event.decrypted", () => this.forceUpdate()); + mxEvent.once(MatrixEventEvent.Decrypted, () => this.forceUpdate()); } } diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx index f6a478ce3e..890a5c3899 100644 --- a/src/components/views/right_panel/UserInfo.tsx +++ b/src/components/views/right_panel/UserInfo.tsx @@ -28,6 +28,7 @@ import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { logger } from "matrix-js-sdk/src/logger"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import dis from '../../../dispatcher/dispatcher'; import Modal from '../../../Modal'; @@ -1275,15 +1276,15 @@ export const useDevices = (userId: string) => { if (_userId !== userId) return; updateDevices(); }; - cli.on("crypto.devicesUpdated", onDevicesUpdated); - cli.on("deviceVerificationChanged", onDeviceVerificationChanged); - cli.on("userTrustStatusChanged", onUserTrustStatusChanged); + cli.on(CryptoEvent.DevicesUpdated, onDevicesUpdated); + cli.on(CryptoEvent.DeviceVerificationChanged, onDeviceVerificationChanged); + cli.on(CryptoEvent.UserTrustStatusChanged, onUserTrustStatusChanged); // Handle being unmounted return () => { cancel = true; - cli.removeListener("crypto.devicesUpdated", onDevicesUpdated); - cli.removeListener("deviceVerificationChanged", onDeviceVerificationChanged); - cli.removeListener("userTrustStatusChanged", onUserTrustStatusChanged); + cli.removeListener(CryptoEvent.DevicesUpdated, onDevicesUpdated); + cli.removeListener(CryptoEvent.DeviceVerificationChanged, onDeviceVerificationChanged); + cli.removeListener(CryptoEvent.UserTrustStatusChanged, onUserTrustStatusChanged); }; }, [cli, userId]); diff --git a/src/components/views/right_panel/VerificationPanel.tsx b/src/components/views/right_panel/VerificationPanel.tsx index 3301db8791..f08c197962 100644 --- a/src/components/views/right_panel/VerificationPanel.tsx +++ b/src/components/views/right_panel/VerificationPanel.tsx @@ -16,11 +16,15 @@ limitations under the License. import React from "react"; import { verificationMethods } from 'matrix-js-sdk/src/crypto'; -import { SCAN_QR_CODE_METHOD, ReciprocateQRCode } from "matrix-js-sdk/src/crypto/verification/QRCode"; -import { VerificationRequest, Phase } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import { QrCodeEvent, ReciprocateQRCode, SCAN_QR_CODE_METHOD } from "matrix-js-sdk/src/crypto/verification/QRCode"; +import { + Phase, + VerificationRequest, + VerificationRequestEvent, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { User } from "matrix-js-sdk/src/models/user"; -import { SAS } from "matrix-js-sdk/src/crypto/verification/SAS"; +import { SAS, SasEvent } from "matrix-js-sdk/src/crypto/verification/SAS"; import { logger } from "matrix-js-sdk/src/logger"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -357,8 +361,8 @@ export default class VerificationPanel extends React.PureComponent { componentDidMount() { const cli = MatrixClientPeg.get(); if (SettingsStore.getValue("feature_state_counters")) { - cli.on("RoomState.events", this.rateLimitedUpdate); + cli.on(RoomStateEvent.Events, this.rateLimitedUpdate); } } componentWillUnmount() { const cli = MatrixClientPeg.get(); if (cli && SettingsStore.getValue("feature_state_counters")) { - cli.removeListener("RoomState.events", this.rateLimitedUpdate); + cli.removeListener(RoomStateEvent.Events, this.rateLimitedUpdate); } } diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index f58140636c..a5ae6c3230 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -18,14 +18,16 @@ limitations under the License. import React, { createRef } from 'react'; import classNames from "classnames"; import { EventType, MsgType, RelationType } from "matrix-js-sdk/src/@types/event"; -import { EventStatus, MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { EventStatus, MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; import { Relations } from "matrix-js-sdk/src/models/relations"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { Thread, ThreadEvent } from 'matrix-js-sdk/src/models/thread'; import { logger } from "matrix-js-sdk/src/logger"; -import { NotificationCountType, Room } from 'matrix-js-sdk/src/models/room'; +import { NotificationCountType, Room, RoomEvent } from 'matrix-js-sdk/src/models/room'; import { CallErrorCode } from "matrix-js-sdk/src/webrtc/call"; import { M_POLL_START } from "matrix-events-sdk"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; +import { UserTrustLevel } from 'matrix-js-sdk/src/crypto/CrossSigning'; import ReplyChain from "../elements/ReplyChain"; import { _t } from '../../../languageHandler'; @@ -488,22 +490,21 @@ export default class EventTile extends React.Component { this.suppressReadReceiptAnimation = false; const client = MatrixClientPeg.get(); if (!this.props.forExport) { - client.on("deviceVerificationChanged", this.onDeviceVerificationChanged); - client.on("userTrustStatusChanged", this.onUserVerificationChanged); - this.props.mxEvent.on("Event.decrypted", this.onDecrypted); + client.on(CryptoEvent.DeviceVerificationChanged, this.onDeviceVerificationChanged); + client.on(CryptoEvent.UserTrustStatusChanged, this.onUserVerificationChanged); + this.props.mxEvent.on(MatrixEventEvent.Decrypted, this.onDecrypted); DecryptionFailureTracker.instance.addVisibleEvent(this.props.mxEvent); if (this.props.showReactions) { - this.props.mxEvent.on("Event.relationsCreated", this.onReactionsCreated); + this.props.mxEvent.on(MatrixEventEvent.RelationsCreated, this.onReactionsCreated); } if (this.shouldShowSentReceipt || this.shouldShowSendingReceipt) { - client.on("Room.receipt", this.onRoomReceipt); + client.on(RoomEvent.Receipt, this.onRoomReceipt); this.isListeningForReceipts = true; } } if (SettingsStore.getValue("feature_thread")) { - this.props.mxEvent.once(ThreadEvent.Ready, this.updateThread); this.props.mxEvent.on(ThreadEvent.Update, this.updateThread); if (this.thread) { @@ -578,16 +579,15 @@ export default class EventTile extends React.Component { componentWillUnmount() { const client = MatrixClientPeg.get(); - client.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); - client.removeListener("userTrustStatusChanged", this.onUserVerificationChanged); - client.removeListener("Room.receipt", this.onRoomReceipt); + client.removeListener(CryptoEvent.DeviceVerificationChanged, this.onDeviceVerificationChanged); + client.removeListener(CryptoEvent.UserTrustStatusChanged, this.onUserVerificationChanged); + client.removeListener(RoomEvent.Receipt, this.onRoomReceipt); this.isListeningForReceipts = false; - this.props.mxEvent.removeListener("Event.decrypted", this.onDecrypted); + this.props.mxEvent.removeListener(MatrixEventEvent.Decrypted, this.onDecrypted); if (this.props.showReactions) { - this.props.mxEvent.removeListener("Event.relationsCreated", this.onReactionsCreated); + this.props.mxEvent.removeListener(MatrixEventEvent.RelationsCreated, this.onReactionsCreated); } if (SettingsStore.getValue("feature_thread")) { - this.props.mxEvent.off(ThreadEvent.Ready, this.updateThread); this.props.mxEvent.off(ThreadEvent.Update, this.updateThread); } @@ -601,7 +601,7 @@ export default class EventTile extends React.Component { componentDidUpdate(prevProps: IProps, prevState: IState, snapshot) { // If we're not listening for receipts and expect to be, register a listener. if (!this.isListeningForReceipts && (this.shouldShowSentReceipt || this.shouldShowSendingReceipt)) { - MatrixClientPeg.get().on("Room.receipt", this.onRoomReceipt); + MatrixClientPeg.get().on(RoomEvent.Receipt, this.onRoomReceipt); this.isListeningForReceipts = true; } } @@ -731,7 +731,7 @@ export default class EventTile extends React.Component { this.forceUpdate(() => { // Per elsewhere in this file, we can remove the listener once we will have no further purpose for it. if (!this.shouldShowSentReceipt && !this.shouldShowSendingReceipt) { - MatrixClientPeg.get().removeListener("Room.receipt", this.onRoomReceipt); + MatrixClientPeg.get().removeListener(RoomEvent.Receipt, this.onRoomReceipt); this.isListeningForReceipts = false; } }); @@ -753,7 +753,7 @@ export default class EventTile extends React.Component { } }; - private onUserVerificationChanged = (userId: string, _trustStatus: string): void => { + private onUserVerificationChanged = (userId: string, _trustStatus: UserTrustLevel): void => { if (userId === this.props.mxEvent.getSender()) { this.verifyEvent(this.props.mxEvent); } diff --git a/src/components/views/rooms/MemberList.tsx b/src/components/views/rooms/MemberList.tsx index 82cba7eb11..14ec20ccd4 100644 --- a/src/components/views/rooms/MemberList.tsx +++ b/src/components/views/rooms/MemberList.tsx @@ -19,12 +19,13 @@ limitations under the License. import React from 'react'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; -import { Room } from 'matrix-js-sdk/src/models/room'; -import { RoomMember } from 'matrix-js-sdk/src/models/room-member'; -import { RoomState } from 'matrix-js-sdk/src/models/room-state'; -import { User } from "matrix-js-sdk/src/models/user"; +import { Room, RoomEvent } from 'matrix-js-sdk/src/models/room'; +import { RoomMember, RoomMemberEvent } from 'matrix-js-sdk/src/models/room-member'; +import { RoomState, RoomStateEvent } from 'matrix-js-sdk/src/models/room-state'; +import { User, UserEvent } from "matrix-js-sdk/src/models/user"; import { throttle } from 'lodash'; import { JoinRule } from "matrix-js-sdk/src/@types/partials"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; @@ -92,7 +93,7 @@ export default class MemberList extends React.Component { this.state = this.getMembersState(this.roomMembers()); } - cli.on("Room", this.onRoom); // invites & joining after peek + cli.on(ClientEvent.Room, this.onRoom); // invites & joining after peek const enablePresenceByHsUrl = SdkConfig.get()["enable_presence_by_hs_url"]; const hsUrl = MatrixClientPeg.get().baseUrl; this.showPresence = enablePresenceByHsUrl?.[hsUrl] ?? true; @@ -104,7 +105,7 @@ export default class MemberList extends React.Component { this.mounted = true; if (cli.hasLazyLoadMembersEnabled()) { this.showMembersAccordingToMembershipWithLL(); - cli.on("Room.myMembership", this.onMyMembership); + cli.on(RoomEvent.MyMembership, this.onMyMembership); } else { this.listenForMembersChanges(); } @@ -112,15 +113,15 @@ export default class MemberList extends React.Component { private listenForMembersChanges(): void { const cli = MatrixClientPeg.get(); - cli.on("RoomState.members", this.onRoomStateMember); - cli.on("RoomMember.name", this.onRoomMemberName); - cli.on("RoomState.events", this.onRoomStateEvent); + cli.on(RoomStateEvent.Members, this.onRoomStateMember); + cli.on(RoomMemberEvent.Name, this.onRoomMemberName); + cli.on(RoomStateEvent.Events, this.onRoomStateEvent); // We listen for changes to the lastPresenceTs which is essentially // listening for all presence events (we display most of not all of // the information contained in presence events). - cli.on("User.lastPresenceTs", this.onUserPresenceChange); - cli.on("User.presence", this.onUserPresenceChange); - cli.on("User.currentlyActive", this.onUserPresenceChange); + cli.on(UserEvent.LastPresenceTs, this.onUserPresenceChange); + cli.on(UserEvent.Presence, this.onUserPresenceChange); + cli.on(UserEvent.CurrentlyActive, this.onUserPresenceChange); // cli.on("Room.timeline", this.onRoomTimeline); } @@ -128,14 +129,14 @@ export default class MemberList extends React.Component { this.mounted = false; const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener("RoomState.members", this.onRoomStateMember); - cli.removeListener("RoomMember.name", this.onRoomMemberName); - cli.removeListener("Room.myMembership", this.onMyMembership); - cli.removeListener("RoomState.events", this.onRoomStateEvent); - cli.removeListener("Room", this.onRoom); - cli.removeListener("User.lastPresenceTs", this.onUserPresenceChange); - cli.removeListener("User.presence", this.onUserPresenceChange); - cli.removeListener("User.currentlyActive", this.onUserPresenceChange); + cli.removeListener(RoomStateEvent.Members, this.onRoomStateMember); + cli.removeListener(RoomMemberEvent.Name, this.onRoomMemberName); + cli.removeListener(RoomEvent.MyMembership, this.onMyMembership); + cli.removeListener(RoomStateEvent.Events, this.onRoomStateEvent); + cli.removeListener(ClientEvent.Room, this.onRoom); + cli.removeListener(UserEvent.LastPresenceTs, this.onUserPresenceChange); + cli.removeListener(UserEvent.Presence, this.onUserPresenceChange); + cli.removeListener(UserEvent.CurrentlyActive, this.onUserPresenceChange); } // cancel any pending calls to the rate_limited_funcs diff --git a/src/components/views/rooms/MemberTile.tsx b/src/components/views/rooms/MemberTile.tsx index bbd2c1411e..36d6555d21 100644 --- a/src/components/views/rooms/MemberTile.tsx +++ b/src/components/views/rooms/MemberTile.tsx @@ -20,6 +20,10 @@ import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; +import { UserEvent } from "matrix-js-sdk/src/models/user"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; +import { UserTrustLevel } from 'matrix-js-sdk/src/crypto/CrossSigning'; import SettingsStore from "../../../settings/SettingsStore"; import dis from "../../../dispatcher/dispatcher"; @@ -67,7 +71,7 @@ export default class MemberTile extends React.Component { if (SettingsStore.getValue("feature_custom_status")) { const { user } = this.props.member; if (user) { - user.on("User.unstable_statusMessage", this.onStatusMessageCommitted); + user.on(UserEvent._UnstableStatusMessage, this.onStatusMessageCommitted); } } @@ -78,12 +82,12 @@ export default class MemberTile extends React.Component { isRoomEncrypted, }); if (isRoomEncrypted) { - cli.on("userTrustStatusChanged", this.onUserTrustStatusChanged); - cli.on("deviceVerificationChanged", this.onDeviceVerificationChanged); + cli.on(CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); + cli.on(CryptoEvent.DeviceVerificationChanged, this.onDeviceVerificationChanged); this.updateE2EStatus(); } else { // Listen for room to become encrypted - cli.on("RoomState.events", this.onRoomStateEvents); + cli.on(RoomStateEvent.Events, this.onRoomStateEvents); } } } @@ -93,16 +97,13 @@ export default class MemberTile extends React.Component { const { user } = this.props.member; if (user) { - user.removeListener( - "User.unstable_statusMessage", - this.onStatusMessageCommitted, - ); + user.removeListener(UserEvent._UnstableStatusMessage, this.onStatusMessageCommitted); } if (cli) { - cli.removeListener("RoomState.events", this.onRoomStateEvents); - cli.removeListener("userTrustStatusChanged", this.onUserTrustStatusChanged); - cli.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); + cli.removeListener(RoomStateEvent.Events, this.onRoomStateEvents); + cli.removeListener(CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); + cli.removeListener(CryptoEvent.DeviceVerificationChanged, this.onDeviceVerificationChanged); } } @@ -113,14 +114,14 @@ export default class MemberTile extends React.Component { // The room is encrypted now. const cli = MatrixClientPeg.get(); - cli.removeListener("RoomState.events", this.onRoomStateEvents); + cli.removeListener(RoomStateEvent.Events, this.onRoomStateEvents); this.setState({ isRoomEncrypted: true, }); this.updateE2EStatus(); }; - private onUserTrustStatusChanged = (userId: string, trustStatus: string): void => { + private onUserTrustStatusChanged = (userId: string, trustStatus: UserTrustLevel): void => { if (userId !== this.props.member.userId) return; this.updateE2EStatus(); }; diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index 721ca46152..4b2a9a3818 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -16,10 +16,11 @@ limitations under the License. import React, { createRef } from 'react'; import classNames from 'classnames'; -import { MatrixEvent, IEventRelation } from "matrix-js-sdk/src/models/event"; +import { IEventRelation, MatrixEvent } from "matrix-js-sdk/src/models/event"; import { Room } from "matrix-js-sdk/src/models/room"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { EventType, RelationType } from 'matrix-js-sdk/src/@types/event'; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { Optional } from "matrix-events-sdk"; import { _t } from '../../../languageHandler'; @@ -155,7 +156,7 @@ export default class MessageComposer extends React.Component { public componentDidMount() { this.dispatcherRef = dis.register(this.onAction); - MatrixClientPeg.get().on("RoomState.events", this.onRoomStateEvents); + MatrixClientPeg.get().on(RoomStateEvent.Events, this.onRoomStateEvents); this.waitForOwnMember(); UIStore.instance.trackElementDimensions(`MessageComposer${this.instanceId}`, this.ref.current); UIStore.instance.on(`MessageComposer${this.instanceId}`, this.onResize); @@ -220,7 +221,7 @@ export default class MessageComposer extends React.Component { public componentWillUnmount() { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, this.onRoomStateEvents); } VoiceRecordingStore.instance.off(UPDATE_EVENT, this.onVoiceStoreUpdate); dis.unregister(this.dispatcherRef); diff --git a/src/components/views/rooms/ReplyTile.tsx b/src/components/views/rooms/ReplyTile.tsx index 8de63c6b19..c64f5126a9 100644 --- a/src/components/views/rooms/ReplyTile.tsx +++ b/src/components/views/rooms/ReplyTile.tsx @@ -16,7 +16,7 @@ limitations under the License. import React, { createRef } from 'react'; import classNames from 'classnames'; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; import { EventType, MsgType } from 'matrix-js-sdk/src/@types/event'; import { logger } from "matrix-js-sdk/src/logger"; import { Relations } from 'matrix-js-sdk/src/models/relations'; @@ -55,15 +55,15 @@ export default class ReplyTile extends React.PureComponent { }; componentDidMount() { - this.props.mxEvent.on("Event.decrypted", this.onDecrypted); - this.props.mxEvent.on("Event.beforeRedaction", this.onEventRequiresUpdate); - this.props.mxEvent.on("Event.replaced", this.onEventRequiresUpdate); + this.props.mxEvent.on(MatrixEventEvent.Decrypted, this.onDecrypted); + this.props.mxEvent.on(MatrixEventEvent.BeforeRedaction, this.onEventRequiresUpdate); + this.props.mxEvent.on(MatrixEventEvent.Replaced, this.onEventRequiresUpdate); } componentWillUnmount() { - this.props.mxEvent.removeListener("Event.decrypted", this.onDecrypted); - this.props.mxEvent.removeListener("Event.beforeRedaction", this.onEventRequiresUpdate); - this.props.mxEvent.removeListener("Event.replaced", this.onEventRequiresUpdate); + this.props.mxEvent.removeListener(MatrixEventEvent.Decrypted, this.onDecrypted); + this.props.mxEvent.removeListener(MatrixEventEvent.BeforeRedaction, this.onEventRequiresUpdate); + this.props.mxEvent.removeListener(MatrixEventEvent.Replaced, this.onEventRequiresUpdate); } private onDecrypted = (): void => { diff --git a/src/components/views/rooms/RoomHeader.tsx b/src/components/views/rooms/RoomHeader.tsx index 92a8321336..c81fd5b77c 100644 --- a/src/components/views/rooms/RoomHeader.tsx +++ b/src/components/views/rooms/RoomHeader.tsx @@ -18,7 +18,7 @@ limitations under the License. import React from 'react'; import classNames from 'classnames'; import { throttle } from 'lodash'; -import { MatrixEvent, Room, RoomState } from 'matrix-js-sdk/src'; +import { MatrixEvent, Room, RoomState, RoomStateEvent } from 'matrix-js-sdk/src'; import { CallType } from "matrix-js-sdk/src/webrtc/call"; import { _t } from '../../../languageHandler'; @@ -82,13 +82,13 @@ export default class RoomHeader extends React.Component { public componentDidMount() { const cli = MatrixClientPeg.get(); - cli.on("RoomState.events", this.onRoomStateEvents); + cli.on(RoomStateEvent.Events, this.onRoomStateEvents); } public componentWillUnmount() { const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener("RoomState.events", this.onRoomStateEvents); + cli.removeListener(RoomStateEvent.Events, this.onRoomStateEvents); } const notiStore = RoomNotificationStateStore.instance.getRoomState(this.props.room); notiStore.removeListener(NotificationStateEvents.Update, this.onNotificationUpdate); diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index 08ae3bf3f1..dc127185af 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -16,7 +16,7 @@ limitations under the License. */ import React, { createRef } from "react"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import classNames from "classnames"; import { logger } from "matrix-js-sdk/src/logger"; @@ -149,8 +149,8 @@ export default class RoomTile extends React.PureComponent { CommunityPrototypeStore.getUpdateEventName(this.props.room?.roomId), this.onCommunityUpdate, ); - prevProps.room?.off("Room.name", this.onRoomNameUpdate); - this.props.room?.on("Room.name", this.onRoomNameUpdate); + prevProps.room?.off(RoomEvent.Name, this.onRoomNameUpdate); + this.props.room?.on(RoomEvent.Name, this.onRoomNameUpdate); } } @@ -168,7 +168,7 @@ export default class RoomTile extends React.PureComponent { ); this.notificationState.on(NotificationStateEvents.Update, this.onNotificationUpdate); this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate); - this.props.room?.on("Room.name", this.onRoomNameUpdate); + this.props.room?.on(RoomEvent.Name, this.onRoomNameUpdate); CommunityPrototypeStore.instance.on( CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), this.onCommunityUpdate, @@ -186,7 +186,7 @@ export default class RoomTile extends React.PureComponent { CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), this.onCommunityUpdate, ); - this.props.room.off("Room.name", this.onRoomNameUpdate); + this.props.room.off(RoomEvent.Name, this.onRoomNameUpdate); } ActiveRoomObserver.removeListener(this.props.room.roomId, this.onActiveRoomUpdate); defaultDispatcher.unregister(this.dispatcherRef); diff --git a/src/components/views/rooms/RoomUpgradeWarningBar.tsx b/src/components/views/rooms/RoomUpgradeWarningBar.tsx index 0add18e917..d316214d5e 100644 --- a/src/components/views/rooms/RoomUpgradeWarningBar.tsx +++ b/src/components/views/rooms/RoomUpgradeWarningBar.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { Room } from 'matrix-js-sdk/src/models/room'; -import { RoomState } from 'matrix-js-sdk/src/models/room-state'; +import { RoomState, RoomStateEvent } from 'matrix-js-sdk/src/models/room-state'; import Modal from '../../../Modal'; import { _t } from '../../../languageHandler'; @@ -49,11 +49,11 @@ export default class RoomUpgradeWarningBar extends React.PureComponent { diff --git a/src/components/views/rooms/Stickerpicker.tsx b/src/components/views/rooms/Stickerpicker.tsx index c63aead5d9..f8d8f95f00 100644 --- a/src/components/views/rooms/Stickerpicker.tsx +++ b/src/components/views/rooms/Stickerpicker.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from 'react'; -import { Room } from 'matrix-js-sdk/src/models/room'; +import { Room, RoomEvent } from 'matrix-js-sdk/src/models/room'; import { logger } from "matrix-js-sdk/src/logger"; import { _t, _td } from '../../../languageHandler'; @@ -133,7 +133,7 @@ export default class Stickerpicker extends React.PureComponent { this.dispatcherRef = dis.register(this.onAction); // Track updates to widget state in account data - MatrixClientPeg.get().on('accountData', this.updateWidget); + MatrixClientPeg.get().on(RoomEvent.AccountData, this.updateWidget); RightPanelStore.instance.on(UPDATE_EVENT, this.onRightPanelStoreUpdate); // Initialise widget state from current account data @@ -142,7 +142,7 @@ export default class Stickerpicker extends React.PureComponent { public componentWillUnmount(): void { const client = MatrixClientPeg.get(); - if (client) client.removeListener('accountData', this.updateWidget); + if (client) client.removeListener(RoomEvent.AccountData, this.updateWidget); RightPanelStore.instance.off(UPDATE_EVENT, this.onRightPanelStoreUpdate); window.removeEventListener('resize', this.onResize); if (this.dispatcherRef) { diff --git a/src/components/views/rooms/ThirdPartyMemberInfo.tsx b/src/components/views/rooms/ThirdPartyMemberInfo.tsx index 04878a2a6a..133fb60638 100644 --- a/src/components/views/rooms/ThirdPartyMemberInfo.tsx +++ b/src/components/views/rooms/ThirdPartyMemberInfo.tsx @@ -18,6 +18,7 @@ import React from 'react'; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { Room } from "matrix-js-sdk/src/models/room"; import { logger } from "matrix-js-sdk/src/logger"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { _t } from "../../../languageHandler"; @@ -71,13 +72,13 @@ export default class ThirdPartyMemberInfo extends React.Component { }; componentDidMount() { - MatrixClientPeg.get().on("RoomMember.typing", this.onRoomMemberTyping); - MatrixClientPeg.get().on("Room.timeline", this.onRoomTimeline); + MatrixClientPeg.get().on(RoomMemberEvent.Typing, this.onRoomMemberTyping); + MatrixClientPeg.get().on(RoomEvent.Timeline, this.onRoomTimeline); } componentDidUpdate(_, prevState) { @@ -77,8 +77,8 @@ export default class WhoIsTypingTile extends React.Component { // we may have entirely lost our client as we're logging out before clicking login on the guest bar... const client = MatrixClientPeg.get(); if (client) { - client.removeListener("RoomMember.typing", this.onRoomMemberTyping); - client.removeListener("Room.timeline", this.onRoomTimeline); + client.removeListener(RoomMemberEvent.Typing, this.onRoomMemberTyping); + client.removeListener(RoomEvent.Timeline, this.onRoomTimeline); } Object.values(this.state.delayedStopTypingTimers).forEach((t) => (t as Timer).abort()); } diff --git a/src/components/views/settings/ChangeAvatar.tsx b/src/components/views/settings/ChangeAvatar.tsx index e46a6d912c..abaf6737fd 100644 --- a/src/components/views/settings/ChangeAvatar.tsx +++ b/src/components/views/settings/ChangeAvatar.tsx @@ -17,6 +17,7 @@ limitations under the License. import React from 'react'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { Room } from 'matrix-js-sdk/src/models/room'; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { _t } from '../../../languageHandler'; @@ -69,7 +70,7 @@ export default class ChangeAvatar extends React.Component { } public componentDidMount(): void { - MatrixClientPeg.get().on("RoomState.events", this.onRoomStateEvents); + MatrixClientPeg.get().on(RoomStateEvent.Events, this.onRoomStateEvents); } // TODO: [REACT-WARNING] Replace with appropriate lifecycle event @@ -86,7 +87,7 @@ export default class ChangeAvatar extends React.Component { public componentWillUnmount(): void { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, this.onRoomStateEvents); } } diff --git a/src/components/views/settings/CrossSigningPanel.tsx b/src/components/views/settings/CrossSigningPanel.tsx index 350a99f6d8..16f4acca7c 100644 --- a/src/components/views/settings/CrossSigningPanel.tsx +++ b/src/components/views/settings/CrossSigningPanel.tsx @@ -15,8 +15,9 @@ limitations under the License. */ import React from 'react'; -import { MatrixEvent } from 'matrix-js-sdk/src'; +import { ClientEvent, MatrixEvent } from 'matrix-js-sdk/src'; import { logger } from "matrix-js-sdk/src/logger"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { _t } from '../../../languageHandler'; @@ -52,9 +53,9 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> { public componentDidMount() { const cli = MatrixClientPeg.get(); - cli.on("accountData", this.onAccountData); - cli.on("userTrustStatusChanged", this.onStatusChanged); - cli.on("crossSigning.keysChanged", this.onStatusChanged); + cli.on(ClientEvent.AccountData, this.onAccountData); + cli.on(CryptoEvent.UserTrustStatusChanged, this.onStatusChanged); + cli.on(CryptoEvent.KeysChanged, this.onStatusChanged); this.getUpdatedStatus(); } @@ -62,9 +63,9 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> { this.unmounted = true; const cli = MatrixClientPeg.get(); if (!cli) return; - cli.removeListener("accountData", this.onAccountData); - cli.removeListener("userTrustStatusChanged", this.onStatusChanged); - cli.removeListener("crossSigning.keysChanged", this.onStatusChanged); + cli.removeListener(ClientEvent.AccountData, this.onAccountData); + cli.removeListener(CryptoEvent.UserTrustStatusChanged, this.onStatusChanged); + cli.removeListener(CryptoEvent.KeysChanged, this.onStatusChanged); } private onAccountData = (event: MatrixEvent): void => { diff --git a/src/components/views/settings/SecureBackupPanel.tsx b/src/components/views/settings/SecureBackupPanel.tsx index 014bb0ffa7..ab489ad0ef 100644 --- a/src/components/views/settings/SecureBackupPanel.tsx +++ b/src/components/views/settings/SecureBackupPanel.tsx @@ -18,6 +18,7 @@ limitations under the License. import React, { ComponentType } from 'react'; import { IKeyBackupInfo } from "matrix-js-sdk/src/crypto/keybackup"; import { TrustInfo } from "matrix-js-sdk/src/crypto/backup"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { logger } from "matrix-js-sdk/src/logger"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; @@ -68,9 +69,9 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> { public componentDidMount(): void { this.checkKeyBackupStatus(); - MatrixClientPeg.get().on('crypto.keyBackupStatus', this.onKeyBackupStatus); + MatrixClientPeg.get().on(CryptoEvent.KeyBackupStatus, this.onKeyBackupStatus); MatrixClientPeg.get().on( - 'crypto.keyBackupSessionsRemaining', + CryptoEvent.KeyBackupSessionsRemaining, this.onKeyBackupSessionsRemaining, ); } @@ -79,9 +80,9 @@ export default class SecureBackupPanel extends React.PureComponent<{}, IState> { this.unmounted = true; if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener('crypto.keyBackupStatus', this.onKeyBackupStatus); + MatrixClientPeg.get().removeListener(CryptoEvent.KeyBackupStatus, this.onKeyBackupStatus); MatrixClientPeg.get().removeListener( - 'crypto.keyBackupSessionsRemaining', + CryptoEvent.KeyBackupSessionsRemaining, this.onKeyBackupSessionsRemaining, ); } diff --git a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx index d14f54fd38..68087cd7b3 100644 --- a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx @@ -18,7 +18,7 @@ import React from 'react'; import { EventType } from "matrix-js-sdk/src/@types/event"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { RoomState } from "matrix-js-sdk/src/models/room-state"; +import { RoomState, RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { logger } from "matrix-js-sdk/src/logger"; import { _t, _td } from "../../../../../languageHandler"; @@ -122,13 +122,13 @@ interface IProps { @replaceableComponent("views.settings.tabs.room.RolesRoomSettingsTab") export default class RolesRoomSettingsTab extends React.Component { componentDidMount() { - MatrixClientPeg.get().on("RoomState.members", this.onRoomMembership); + MatrixClientPeg.get().on(RoomStateEvent.Members, this.onRoomMembership); } componentWillUnmount() { const client = MatrixClientPeg.get(); if (client) { - client.removeListener("RoomState.members", this.onRoomMembership); + client.removeListener(RoomStateEvent.Members, this.onRoomMembership); } } diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 63c08b3248..dde5e616ad 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -17,6 +17,7 @@ limitations under the License. import React from 'react'; import { GuestAccess, HistoryVisibility, JoinRule, RestrictedAllowType } from "matrix-js-sdk/src/@types/partials"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { EventType } from 'matrix-js-sdk/src/@types/event'; import { logger } from "matrix-js-sdk/src/logger"; @@ -71,7 +72,7 @@ export default class SecurityRoomSettingsTab extends React.Component { diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx index f346969df1..288c14ea7d 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import { sleep } from "matrix-js-sdk/src/utils"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { logger } from "matrix-js-sdk/src/logger"; import { _t } from "../../../../../languageHandler"; @@ -105,12 +105,12 @@ export default class SecurityUserSettingsTab extends React.Component { diff --git a/src/components/views/spaces/SpaceTreeLevel.tsx b/src/components/views/spaces/SpaceTreeLevel.tsx index 7fdda26c4c..6acd9845ef 100644 --- a/src/components/views/spaces/SpaceTreeLevel.tsx +++ b/src/components/views/spaces/SpaceTreeLevel.tsx @@ -14,15 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { - createRef, - InputHTMLAttributes, - LegacyRef, - ComponentProps, - ComponentType, -} from "react"; +import React, { ComponentProps, ComponentType, createRef, InputHTMLAttributes, LegacyRef } from "react"; import classNames from "classnames"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { DraggableProvidedDragHandleProps } from "react-beautiful-dnd"; import RoomAvatar from "../avatars/RoomAvatar"; @@ -184,12 +178,12 @@ export class SpaceItem extends React.PureComponent { }; SpaceStore.instance.on(this.props.space.roomId, this.onSpaceUpdate); - this.props.space.on("Room.name", this.onRoomNameChange); + this.props.space.on(RoomEvent.Name, this.onRoomNameChange); } componentWillUnmount() { SpaceStore.instance.off(this.props.space.roomId, this.onSpaceUpdate); - this.props.space.off("Room.name", this.onRoomNameChange); + this.props.space.off(RoomEvent.Name, this.onRoomNameChange); } private onSpaceUpdate = () => { diff --git a/src/components/views/toasts/VerificationRequestToast.tsx b/src/components/views/toasts/VerificationRequestToast.tsx index 54d4348a82..341be988c4 100644 --- a/src/components/views/toasts/VerificationRequestToast.tsx +++ b/src/components/views/toasts/VerificationRequestToast.tsx @@ -15,7 +15,10 @@ limitations under the License. */ import React from "react"; -import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import { + VerificationRequest, + VerificationRequestEvent, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; import { logger } from "matrix-js-sdk/src/logger"; @@ -62,7 +65,7 @@ export default class VerificationRequestToast extends React.PureComponent { diff --git a/src/createRoom.ts b/src/createRoom.ts index 2a1d56e72f..2677075652 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -28,6 +28,7 @@ import { Visibility, } from "matrix-js-sdk/src/@types/partials"; import { logger } from "matrix-js-sdk/src/logger"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { MatrixClientPeg } from './MatrixClientPeg'; import Modal from './Modal'; @@ -332,13 +333,13 @@ export async function waitForMember(client: MatrixClient, roomId: string, userId if (member.roomId !== roomId) return; resolve(true); }; - client.on("RoomState.newMember", handler); + client.on(RoomStateEvent.NewMember, handler); /* We don't want to hang if this goes wrong, so we proceed and hope the other user is already in the megolm session */ setTimeout(resolve, timeout, false); }).finally(() => { - client.removeListener("RoomState.newMember", handler); + client.removeListener(RoomStateEvent.NewMember, handler); }); } diff --git a/src/indexing/EventIndex.ts b/src/indexing/EventIndex.ts index 75a5ede857..85ff7038de 100644 --- a/src/indexing/EventIndex.ts +++ b/src/indexing/EventIndex.ts @@ -17,16 +17,16 @@ limitations under the License. import { EventEmitter } from "events"; import { RoomMember } from 'matrix-js-sdk/src/models/room-member'; import { Direction, EventTimeline } from 'matrix-js-sdk/src/models/event-timeline'; -import { Room } from 'matrix-js-sdk/src/models/room'; +import { Room, RoomEvent } from 'matrix-js-sdk/src/models/room'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { EventTimelineSet, IRoomTimelineData } from 'matrix-js-sdk/src/models/event-timeline-set'; -import { RoomState } from 'matrix-js-sdk/src/models/room-state'; +import { RoomState, RoomStateEvent } from 'matrix-js-sdk/src/models/room-state'; import { TimelineIndex, TimelineWindow } from 'matrix-js-sdk/src/timeline-window'; import { sleep } from "matrix-js-sdk/src/utils"; import { IResultRoomEvents } from "matrix-js-sdk/src/@types/search"; import { logger } from "matrix-js-sdk/src/logger"; import { EventType } from "matrix-js-sdk/src/@types/event"; -import { MatrixClient } from "matrix-js-sdk/src/client"; +import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client"; import PlatformPeg from "../PlatformPeg"; import { MatrixClientPeg } from "../MatrixClientPeg"; @@ -68,10 +68,10 @@ export default class EventIndex extends EventEmitter { public registerListeners() { const client = MatrixClientPeg.get(); - client.on('sync', this.onSync); - client.on('Room.timeline', this.onRoomTimeline); - client.on('Room.timelineReset', this.onTimelineReset); - client.on('RoomState.events', this.onRoomStateEvent); + client.on(ClientEvent.Sync, this.onSync); + client.on(RoomEvent.Timeline, this.onRoomTimeline); + client.on(RoomEvent.TimelineReset, this.onTimelineReset); + client.on(RoomStateEvent.Events, this.onRoomStateEvent); } /** @@ -81,10 +81,10 @@ export default class EventIndex extends EventEmitter { const client = MatrixClientPeg.get(); if (client === null) return; - client.removeListener('sync', this.onSync); - client.removeListener('Room.timeline', this.onRoomTimeline); - client.removeListener('Room.timelineReset', this.onTimelineReset); - client.removeListener('RoomState.events', this.onRoomStateEvent); + client.removeListener(ClientEvent.Sync, this.onSync); + client.removeListener(RoomEvent.Timeline, this.onRoomTimeline); + client.removeListener(RoomEvent.TimelineReset, this.onTimelineReset); + client.removeListener(RoomStateEvent.Events, this.onRoomStateEvent); } /** diff --git a/src/integrations/IntegrationManagers.ts b/src/integrations/IntegrationManagers.ts index 1ac39ff86d..55772a7498 100644 --- a/src/integrations/IntegrationManagers.ts +++ b/src/integrations/IntegrationManagers.ts @@ -16,8 +16,8 @@ limitations under the License. import url from 'url'; import { logger } from "matrix-js-sdk/src/logger"; +import { MatrixClient, ClientEvent } from "matrix-js-sdk/src/client"; -import type { MatrixClient } from "matrix-js-sdk/src/client"; import type { MatrixEvent } from "matrix-js-sdk/src/models/event"; import type { Room } from "matrix-js-sdk/src/models/room"; import SdkConfig from '../SdkConfig'; @@ -59,15 +59,15 @@ export class IntegrationManagers { startWatching(): void { this.stopWatching(); this.client = MatrixClientPeg.get(); - this.client.on("accountData", this.onAccountData); - this.client.on("WellKnown.client", this.setupHomeserverManagers); + this.client.on(ClientEvent.AccountData, this.onAccountData); + this.client.on(ClientEvent.ClientWellKnown, this.setupHomeserverManagers); this.compileManagers(); } stopWatching(): void { if (!this.client) return; - this.client.removeListener("accountData", this.onAccountData); - this.client.removeListener("WellKnown.client", this.setupHomeserverManagers); + this.client.removeListener(ClientEvent.AccountData, this.onAccountData); + this.client.removeListener(ClientEvent.ClientWellKnown, this.setupHomeserverManagers); } private compileManagers() { diff --git a/src/mjolnir/Mjolnir.ts b/src/mjolnir/Mjolnir.ts index 85a32914e3..d1ef954d16 100644 --- a/src/mjolnir/Mjolnir.ts +++ b/src/mjolnir/Mjolnir.ts @@ -17,6 +17,7 @@ limitations under the License. import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { Preset } from "matrix-js-sdk/src/@types/partials"; import { logger } from "matrix-js-sdk/src/logger"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { MatrixClientPeg } from "../MatrixClientPeg"; import { ALL_RULE_TYPES, BanList } from "./BanList"; @@ -66,7 +67,7 @@ export class Mjolnir { setup() { if (!MatrixClientPeg.get()) return; this.updateLists(SettingsStore.getValue("mjolnirRooms")); - MatrixClientPeg.get().on("RoomState.events", this.onEvent); + MatrixClientPeg.get().on(RoomStateEvent.Events, this.onEvent); } stop() { @@ -81,7 +82,7 @@ export class Mjolnir { } if (!MatrixClientPeg.get()) return; - MatrixClientPeg.get().removeListener("RoomState.events", this.onEvent); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, this.onEvent); } async getOrCreatePersonalList(): Promise { diff --git a/src/settings/handlers/AccountSettingsHandler.ts b/src/settings/handlers/AccountSettingsHandler.ts index f03ad19963..2b0c980a1a 100644 --- a/src/settings/handlers/AccountSettingsHandler.ts +++ b/src/settings/handlers/AccountSettingsHandler.ts @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixClient } from "matrix-js-sdk/src/client"; +import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { MatrixClientPeg } from '../../MatrixClientPeg'; @@ -46,10 +46,10 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa public initMatrixClient(oldClient: MatrixClient, newClient: MatrixClient) { if (oldClient) { - oldClient.removeListener("accountData", this.onAccountData); + oldClient.removeListener(ClientEvent.AccountData, this.onAccountData); } - newClient.on("accountData", this.onAccountData); + newClient.on(ClientEvent.AccountData, this.onAccountData); } private onAccountData = (event: MatrixEvent, prevEvent: MatrixEvent) => { diff --git a/src/settings/handlers/RoomAccountSettingsHandler.ts b/src/settings/handlers/RoomAccountSettingsHandler.ts index 14db4024bf..0d50fc053f 100644 --- a/src/settings/handlers/RoomAccountSettingsHandler.ts +++ b/src/settings/handlers/RoomAccountSettingsHandler.ts @@ -17,7 +17,7 @@ limitations under the License. import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { MatrixClientPeg } from '../../MatrixClientPeg'; import MatrixClientBackedSettingsHandler from "./MatrixClientBackedSettingsHandler"; @@ -37,10 +37,10 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin protected initMatrixClient(oldClient: MatrixClient, newClient: MatrixClient) { if (oldClient) { - oldClient.removeListener("Room.accountData", this.onAccountData); + oldClient.removeListener(RoomEvent.AccountData, this.onAccountData); } - newClient.on("Room.accountData", this.onAccountData); + newClient.on(RoomEvent.AccountData, this.onAccountData); } private onAccountData = (event: MatrixEvent, room: Room, prevEvent: MatrixEvent) => { diff --git a/src/settings/handlers/RoomSettingsHandler.ts b/src/settings/handlers/RoomSettingsHandler.ts index 7adabc8f5c..74e57cf6c1 100644 --- a/src/settings/handlers/RoomSettingsHandler.ts +++ b/src/settings/handlers/RoomSettingsHandler.ts @@ -17,7 +17,7 @@ limitations under the License. import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { RoomState } from "matrix-js-sdk/src/models/room-state"; +import { RoomState, RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { MatrixClientPeg } from '../../MatrixClientPeg'; import MatrixClientBackedSettingsHandler from "./MatrixClientBackedSettingsHandler"; @@ -35,10 +35,10 @@ export default class RoomSettingsHandler extends MatrixClientBackedSettingsHandl protected initMatrixClient(oldClient: MatrixClient, newClient: MatrixClient) { if (oldClient) { - oldClient.removeListener("RoomState.events", this.onEvent); + oldClient.removeListener(RoomStateEvent.Events, this.onEvent); } - newClient.on("RoomState.events", this.onEvent); + newClient.on(RoomStateEvent.Events, this.onEvent); } private onEvent = (event: MatrixEvent, state: RoomState, prevEvent: MatrixEvent) => { diff --git a/src/stores/ActiveWidgetStore.ts b/src/stores/ActiveWidgetStore.ts index 81fc6de911..bb81f9c487 100644 --- a/src/stores/ActiveWidgetStore.ts +++ b/src/stores/ActiveWidgetStore.ts @@ -15,7 +15,7 @@ limitations under the License. */ import EventEmitter from 'events'; -import { MatrixEvent } from "matrix-js-sdk/src"; +import { MatrixEvent, RoomStateEvent } from "matrix-js-sdk/src"; import { MatrixClientPeg } from '../MatrixClientPeg'; import { WidgetMessagingStore } from "./widgets/WidgetMessagingStore"; @@ -44,12 +44,12 @@ export default class ActiveWidgetStore extends EventEmitter { } public start(): void { - MatrixClientPeg.get().on('RoomState.events', this.onRoomStateEvents); + MatrixClientPeg.get().on(RoomStateEvent.Events, this.onRoomStateEvents); } public stop(): void { if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener('RoomState.events', this.onRoomStateEvents); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, this.onRoomStateEvents); } this.roomIdByWidgetId.clear(); } diff --git a/src/stores/AutoRageshakeStore.ts b/src/stores/AutoRageshakeStore.ts index 320a1e3817..0ac60dbdf4 100644 --- a/src/stores/AutoRageshakeStore.ts +++ b/src/stores/AutoRageshakeStore.ts @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixEvent } from "matrix-js-sdk/src"; +import { ClientEvent, MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src"; import { sleep } from "matrix-js-sdk/src/utils"; import { ISyncStateData, SyncState } from "matrix-js-sdk/src/sync"; @@ -73,16 +73,17 @@ export default class AutoRageshakeStore extends AsyncStoreWithClient { if (!SettingsStore.getValue("automaticDecryptionErrorReporting")) return; if (this.matrixClient) { - this.matrixClient.on('Event.decrypted', this.onDecryptionAttempt); - this.matrixClient.on('toDeviceEvent', this.onDeviceMessage); - this.matrixClient.on('sync', this.onSyncStateChange); + this.matrixClient.on(MatrixEventEvent.Decrypted, this.onDecryptionAttempt); + this.matrixClient.on(ClientEvent.ToDeviceEvent, this.onDeviceMessage); + this.matrixClient.on(ClientEvent.Sync, this.onSyncStateChange); } } protected async onNotReady() { if (this.matrixClient) { - this.matrixClient.removeListener('toDeviceEvent', this.onDeviceMessage); - this.matrixClient.removeListener('Event.decrypted', this.onDecryptionAttempt); + this.matrixClient.removeListener(ClientEvent.ToDeviceEvent, this.onDeviceMessage); + this.matrixClient.removeListener(MatrixEventEvent.Decrypted, this.onDecryptionAttempt); + this.matrixClient.removeListener(ClientEvent.Sync, this.onSyncStateChange); } } diff --git a/src/stores/BreadcrumbsStore.ts b/src/stores/BreadcrumbsStore.ts index e5eb6be675..cb1018326c 100644 --- a/src/stores/BreadcrumbsStore.ts +++ b/src/stores/BreadcrumbsStore.ts @@ -14,8 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { isNullOrUndefined } from "matrix-js-sdk/src/utils"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import SettingsStore from "../settings/SettingsStore"; import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; @@ -92,13 +93,13 @@ export class BreadcrumbsStore extends AsyncStoreWithClient { await this.updateRooms(); await this.updateState({ enabled: SettingsStore.getValue("breadcrumbs", null) }); - this.matrixClient.on("Room.myMembership", this.onMyMembership); - this.matrixClient.on("Room", this.onRoom); + this.matrixClient.on(RoomEvent.MyMembership, this.onMyMembership); + this.matrixClient.on(ClientEvent.Room, this.onRoom); } protected async onNotReady() { - this.matrixClient.removeListener("Room.myMembership", this.onMyMembership); - this.matrixClient.removeListener("Room", this.onRoom); + this.matrixClient.removeListener(RoomEvent.MyMembership, this.onMyMembership); + this.matrixClient.removeListener(ClientEvent.Room, this.onRoom); } private onMyMembership = async (room: Room) => { diff --git a/src/stores/OwnProfileStore.ts b/src/stores/OwnProfileStore.ts index 5d4ec9d09b..5ddd31783b 100644 --- a/src/stores/OwnProfileStore.ts +++ b/src/stores/OwnProfileStore.ts @@ -15,7 +15,8 @@ limitations under the License. */ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { User } from "matrix-js-sdk/src/models/user"; +import { User, UserEvent } from "matrix-js-sdk/src/models/user"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { throttle } from "lodash"; import { ActionPayload } from "../dispatcher/payloads"; @@ -98,11 +99,11 @@ export class OwnProfileStore extends AsyncStoreWithClient { protected async onNotReady() { if (this.monitoredUser) { - this.monitoredUser.removeListener("User.displayName", this.onProfileUpdate); - this.monitoredUser.removeListener("User.avatarUrl", this.onProfileUpdate); + this.monitoredUser.removeListener(UserEvent.DisplayName, this.onProfileUpdate); + this.monitoredUser.removeListener(UserEvent.AvatarUrl, this.onProfileUpdate); } if (this.matrixClient) { - this.matrixClient.removeListener("RoomState.events", this.onStateEvents); + this.matrixClient.removeListener(RoomStateEvent.Events, this.onStateEvents); } await this.reset({}); } @@ -111,13 +112,13 @@ export class OwnProfileStore extends AsyncStoreWithClient { const myUserId = this.matrixClient.getUserId(); this.monitoredUser = this.matrixClient.getUser(myUserId); if (this.monitoredUser) { - this.monitoredUser.on("User.displayName", this.onProfileUpdate); - this.monitoredUser.on("User.avatarUrl", this.onProfileUpdate); + this.monitoredUser.on(UserEvent.DisplayName, this.onProfileUpdate); + this.monitoredUser.on(UserEvent.AvatarUrl, this.onProfileUpdate); } // We also have to listen for membership events for ourselves as the above User events // are fired only with presence, which matrix.org (and many others) has disabled. - this.matrixClient.on("RoomState.events", this.onStateEvents); + this.matrixClient.on(RoomStateEvent.Events, this.onStateEvents); await this.onProfileUpdate(); // trigger an initial update } diff --git a/src/stores/RoomViewStore.tsx b/src/stores/RoomViewStore.tsx index d17029ae8e..66d045d11d 100644 --- a/src/stores/RoomViewStore.tsx +++ b/src/stores/RoomViewStore.tsx @@ -24,6 +24,7 @@ import { ViewRoom as ViewRoomEvent } from "matrix-analytics-events/types/typescr import { JoinedRoom as JoinedRoomEvent } from "matrix-analytics-events/types/typescript/JoinedRoom"; import { JoinRule } from "matrix-js-sdk/src/@types/partials"; import { Room } from "matrix-js-sdk/src/models/room"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import dis from '../dispatcher/dispatcher'; import { MatrixClientPeg } from '../MatrixClientPeg'; @@ -180,13 +181,13 @@ class RoomViewStore extends Store { isSpace: room.isSpaceRoom(), }); - cli.off("Room", updateMetrics); + cli.off(ClientEvent.Room, updateMetrics); }; if (cli.getRoom(payload.roomId)) { updateMetrics(); } else { - cli.on("Room", updateMetrics); + cli.on(ClientEvent.Room, updateMetrics); } break; diff --git a/src/stores/SetupEncryptionStore.ts b/src/stores/SetupEncryptionStore.ts index 5af39356e7..d134189324 100644 --- a/src/stores/SetupEncryptionStore.ts +++ b/src/stores/SetupEncryptionStore.ts @@ -16,15 +16,17 @@ limitations under the License. import EventEmitter from 'events'; import { - VerificationRequest, PHASE_DONE as VERIF_PHASE_DONE, + VerificationRequest, + VerificationRequestEvent, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { IKeyBackupInfo } from "matrix-js-sdk/src/crypto/keybackup"; import { ISecretStorageKeyInfo } from "matrix-js-sdk/src/crypto/api"; import { logger } from "matrix-js-sdk/src/logger"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { MatrixClientPeg } from '../MatrixClientPeg'; -import { accessSecretStorage, AccessCancelledError } from '../SecurityManager'; +import { AccessCancelledError, accessSecretStorage } from '../SecurityManager'; import Modal from '../Modal'; import InteractiveAuthDialog from '../components/views/dialogs/InteractiveAuthDialog'; import { _t } from '../languageHandler'; @@ -68,8 +70,8 @@ export class SetupEncryptionStore extends EventEmitter { this.keyInfo = null; const cli = MatrixClientPeg.get(); - cli.on("crypto.verification.request", this.onVerificationRequest); - cli.on('userTrustStatusChanged', this.onUserTrustStatusChanged); + cli.on(CryptoEvent.VerificationRequest, this.onVerificationRequest); + cli.on(CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); const requestsInProgress = cli.getVerificationRequestsToDeviceInProgress(cli.getUserId()); if (requestsInProgress.length) { @@ -88,11 +90,11 @@ export class SetupEncryptionStore extends EventEmitter { } this.started = false; if (this.verificationRequest) { - this.verificationRequest.off("change", this.onVerificationRequestChange); + this.verificationRequest.off(VerificationRequestEvent.Change, this.onVerificationRequestChange); } if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("crypto.verification.request", this.onVerificationRequest); - MatrixClientPeg.get().removeListener('userTrustStatusChanged', this.onUserTrustStatusChanged); + MatrixClientPeg.get().removeListener(CryptoEvent.VerificationRequest, this.onVerificationRequest); + MatrixClientPeg.get().removeListener(CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); } } @@ -186,11 +188,11 @@ export class SetupEncryptionStore extends EventEmitter { public onVerificationRequestChange = (): void => { if (this.verificationRequest.cancelled) { - this.verificationRequest.off("change", this.onVerificationRequestChange); + this.verificationRequest.off(VerificationRequestEvent.Change, this.onVerificationRequestChange); this.verificationRequest = null; this.emit("update"); } else if (this.verificationRequest.phase === VERIF_PHASE_DONE) { - this.verificationRequest.off("change", this.onVerificationRequestChange); + this.verificationRequest.off(VerificationRequestEvent.Change, this.onVerificationRequestChange); this.verificationRequest = null; // At this point, the verification has finished, we just need to wait for // cross signing to be ready to use, so wait for the user trust status to @@ -271,11 +273,11 @@ export class SetupEncryptionStore extends EventEmitter { if (request.otherUserId !== MatrixClientPeg.get().getUserId()) return; if (this.verificationRequest) { - this.verificationRequest.off("change", this.onVerificationRequestChange); + this.verificationRequest.off(VerificationRequestEvent.Change, this.onVerificationRequestChange); } this.verificationRequest = request; await request.accept(); - request.on("change", this.onVerificationRequestChange); + request.on(VerificationRequestEvent.Change, this.onVerificationRequestChange); this.emit("update"); } diff --git a/src/stores/WidgetStore.ts b/src/stores/WidgetStore.ts index c1f6cea52c..adec53d9ca 100644 --- a/src/stores/WidgetStore.ts +++ b/src/stores/WidgetStore.ts @@ -18,6 +18,8 @@ import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { IWidget } from "matrix-widget-api"; import { logger } from "matrix-js-sdk/src/logger"; +import { ClientEvent } from "matrix-js-sdk/src/client"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { ActionPayload } from "../dispatcher/payloads"; import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; @@ -73,8 +75,8 @@ export default class WidgetStore extends AsyncStoreWithClient { } protected async onReady(): Promise { - this.matrixClient.on("Room", this.onRoom); - this.matrixClient.on("RoomState.events", this.onRoomStateEvents); + this.matrixClient.on(ClientEvent.Room, this.onRoom); + this.matrixClient.on(RoomStateEvent.Events, this.onRoomStateEvents); this.matrixClient.getRooms().forEach((room: Room) => { this.loadRoomWidgets(room); }); @@ -82,8 +84,8 @@ export default class WidgetStore extends AsyncStoreWithClient { } protected async onNotReady(): Promise { - this.matrixClient.off("Room", this.onRoom); - this.matrixClient.off("RoomState.events", this.onRoomStateEvents); + this.matrixClient.off(ClientEvent.Room, this.onRoom); + this.matrixClient.off(RoomStateEvent.Events, this.onRoomStateEvents); this.widgetMap = new Map(); this.roomMap = new Map(); await this.reset({}); diff --git a/src/stores/notifications/NotificationState.ts b/src/stores/notifications/NotificationState.ts index 52ce0f7439..60f50fad8c 100644 --- a/src/stores/notifications/NotificationState.ts +++ b/src/stores/notifications/NotificationState.ts @@ -29,8 +29,14 @@ export enum NotificationStateEvents { Update = "update", } -export abstract class NotificationState extends TypedEventEmitter +type EventHandlerMap = { + [NotificationStateEvents.Update]: () => void; +}; + +export abstract class NotificationState + extends TypedEventEmitter implements INotificationStateSnapshotParams, IDestroyable { + // protected _symbol: string | null; protected _count: number; protected _color: NotificationColor; diff --git a/src/stores/notifications/RoomNotificationState.ts b/src/stores/notifications/RoomNotificationState.ts index 1b68f3a7b4..517a23fa97 100644 --- a/src/stores/notifications/RoomNotificationState.ts +++ b/src/stores/notifications/RoomNotificationState.ts @@ -14,8 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { NotificationCountType, Room } from "matrix-js-sdk/src/models/room"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; +import { NotificationCountType, Room, RoomEvent } from "matrix-js-sdk/src/models/room"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import { NotificationColor } from "./NotificationColor"; import { IDestroyable } from "../../utils/IDestroyable"; @@ -30,13 +31,13 @@ import { getUnsentMessages } from "../../components/structures/RoomStatusBar"; export class RoomNotificationState extends NotificationState implements IDestroyable { constructor(public readonly room: Room) { super(); - this.room.on("Room.receipt", this.handleReadReceipt); - this.room.on("Room.timeline", this.handleRoomEventUpdate); - this.room.on("Room.redaction", this.handleRoomEventUpdate); - this.room.on("Room.myMembership", this.handleMembershipUpdate); - this.room.on("Room.localEchoUpdated", this.handleLocalEchoUpdated); - MatrixClientPeg.get().on("Event.decrypted", this.onEventDecrypted); - MatrixClientPeg.get().on("accountData", this.handleAccountDataUpdate); + this.room.on(RoomEvent.Receipt, this.handleReadReceipt); + this.room.on(RoomEvent.Timeline, this.handleRoomEventUpdate); + this.room.on(RoomEvent.Redaction, this.handleRoomEventUpdate); + this.room.on(RoomEvent.MyMembership, this.handleMembershipUpdate); + this.room.on(RoomEvent.LocalEchoUpdated, this.handleLocalEchoUpdated); + MatrixClientPeg.get().on(MatrixEventEvent.Decrypted, this.onEventDecrypted); + MatrixClientPeg.get().on(ClientEvent.AccountData, this.handleAccountDataUpdate); this.updateNotificationState(); } @@ -46,14 +47,14 @@ export class RoomNotificationState extends NotificationState implements IDestroy public destroy(): void { super.destroy(); - this.room.removeListener("Room.receipt", this.handleReadReceipt); - this.room.removeListener("Room.timeline", this.handleRoomEventUpdate); - this.room.removeListener("Room.redaction", this.handleRoomEventUpdate); - this.room.removeListener("Room.myMembership", this.handleMembershipUpdate); - this.room.removeListener("Room.localEchoUpdated", this.handleLocalEchoUpdated); + this.room.removeListener(RoomEvent.Receipt, this.handleReadReceipt); + this.room.removeListener(RoomEvent.Timeline, this.handleRoomEventUpdate); + this.room.removeListener(RoomEvent.Redaction, this.handleRoomEventUpdate); + this.room.removeListener(RoomEvent.MyMembership, this.handleMembershipUpdate); + this.room.removeListener(RoomEvent.LocalEchoUpdated, this.handleLocalEchoUpdated); if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("Event.decrypted", this.onEventDecrypted); - MatrixClientPeg.get().removeListener("accountData", this.handleAccountDataUpdate); + MatrixClientPeg.get().removeListener(MatrixEventEvent.Decrypted, this.onEventDecrypted); + MatrixClientPeg.get().removeListener(ClientEvent.AccountData, this.handleAccountDataUpdate); } } diff --git a/src/stores/notifications/RoomNotificationStateStore.ts b/src/stores/notifications/RoomNotificationStateStore.ts index ed032a331d..638b7df096 100644 --- a/src/stores/notifications/RoomNotificationStateStore.ts +++ b/src/stores/notifications/RoomNotificationStateStore.ts @@ -16,6 +16,7 @@ limitations under the License. import { Room } from "matrix-js-sdk/src/models/room"; import { ISyncStateData, SyncState } from "matrix-js-sdk/src/sync"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import { ActionPayload } from "../../dispatcher/payloads"; import { AsyncStoreWithClient } from "../AsyncStoreWithClient"; @@ -130,10 +131,11 @@ export class RoomNotificationStateStore extends AsyncStoreWithClient { }; protected async onReady() { - this.matrixClient.on("sync", this.onSync); + this.matrixClient.on(ClientEvent.Sync, this.onSync); } protected async onNotReady(): Promise { + this.matrixClient?.off(ClientEvent.Sync, this.onSync); for (const roomState of this.roomMap.values()) { roomState.destroy(); } diff --git a/src/stores/right-panel/RightPanelStore.ts b/src/stores/right-panel/RightPanelStore.ts index 71754d2bc6..e092b5cc7b 100644 --- a/src/stores/right-panel/RightPanelStore.ts +++ b/src/stores/right-panel/RightPanelStore.ts @@ -16,6 +16,7 @@ limitations under the License. import { EventSubscription } from 'fbemitter'; import { logger } from "matrix-js-sdk/src/logger"; +import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import defaultDispatcher from '../../dispatcher/dispatcher'; import { pendingVerificationRequestForUser } from '../../verification'; @@ -26,9 +27,9 @@ import { SettingLevel } from "../../settings/SettingLevel"; import { UPDATE_EVENT } from '../AsyncStore'; import { ReadyWatchingStore } from '../ReadyWatchingStore'; import { - IRightPanelCard, convertToStatePanel, convertToStorePanel, + IRightPanelCard, IRightPanelForRoom, } from './RightPanelStoreIPanelState'; import RoomViewStore from '../RoomViewStore'; @@ -70,7 +71,7 @@ export default class RightPanelStore extends ReadyWatchingStore { protected async onReady(): Promise { this.isReady = true; this.roomStoreToken = RoomViewStore.addListener(this.onRoomViewStoreUpdate); - this.matrixClient.on("crypto.verification.request", this.onVerificationRequestUpdate); + this.matrixClient.on(CryptoEvent.VerificationRequest, this.onVerificationRequestUpdate); this.viewedRoomId = RoomViewStore.getRoomId(); this.loadCacheFromSettings(); this.emitAndUpdateSettings(); @@ -84,7 +85,7 @@ export default class RightPanelStore extends ReadyWatchingStore { protected async onNotReady(): Promise { this.isReady = false; - this.matrixClient.off("crypto.verification.request", this.onVerificationRequestUpdate); + this.matrixClient.off(CryptoEvent.VerificationRequest, this.onVerificationRequestUpdate); this.roomStoreToken.remove(); } diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts index 15b1362f76..aca68a2339 100644 --- a/src/stores/spaces/SpaceStore.ts +++ b/src/stores/spaces/SpaceStore.ts @@ -16,11 +16,12 @@ limitations under the License. import { ListIteratee, Many, sortBy, throttle } from "lodash"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; -import { Room } from "matrix-js-sdk/src/models/room"; +import { Room, RoomEvent } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { IRoomCapability } from "matrix-js-sdk/src/client"; +import { ClientEvent, IRoomCapability } from "matrix-js-sdk/src/client"; import { logger } from "matrix-js-sdk/src/logger"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { AsyncStoreWithClient } from "../AsyncStoreWithClient"; import defaultDispatcher from "../../dispatcher/dispatcher"; @@ -1048,24 +1049,24 @@ export class SpaceStoreClass extends AsyncStoreWithClient { protected async onNotReady() { if (!SpaceStore.spacesEnabled) return; if (this.matrixClient) { - this.matrixClient.removeListener("Room", this.onRoom); - this.matrixClient.removeListener("Room.myMembership", this.onRoom); - this.matrixClient.removeListener("Room.accountData", this.onRoomAccountData); - this.matrixClient.removeListener("RoomState.events", this.onRoomState); - this.matrixClient.removeListener("RoomState.members", this.onRoomStateMembers); - this.matrixClient.removeListener("accountData", this.onAccountData); + this.matrixClient.removeListener(ClientEvent.Room, this.onRoom); + this.matrixClient.removeListener(RoomEvent.MyMembership, this.onRoom); + this.matrixClient.removeListener(RoomEvent.AccountData, this.onRoomAccountData); + this.matrixClient.removeListener(RoomStateEvent.Events, this.onRoomState); + this.matrixClient.removeListener(RoomStateEvent.Members, this.onRoomStateMembers); + this.matrixClient.removeListener(ClientEvent.AccountData, this.onAccountData); } await this.reset(); } protected async onReady() { if (!spacesEnabled) return; - this.matrixClient.on("Room", this.onRoom); - this.matrixClient.on("Room.myMembership", this.onRoom); - this.matrixClient.on("Room.accountData", this.onRoomAccountData); - this.matrixClient.on("RoomState.events", this.onRoomState); - this.matrixClient.on("RoomState.members", this.onRoomStateMembers); - this.matrixClient.on("accountData", this.onAccountData); + this.matrixClient.on(ClientEvent.Room, this.onRoom); + this.matrixClient.on(RoomEvent.MyMembership, this.onRoom); + this.matrixClient.on(RoomEvent.AccountData, this.onRoomAccountData); + this.matrixClient.on(RoomStateEvent.Events, this.onRoomState); + this.matrixClient.on(RoomStateEvent.Members, this.onRoomStateMembers); + this.matrixClient.on(ClientEvent.AccountData, this.onAccountData); this.matrixClient.getCapabilities().then(capabilities => { this._restrictedJoinRuleSupport = capabilities diff --git a/src/stores/widgets/StopGapWidget.ts b/src/stores/widgets/StopGapWidget.ts index ab8a0cdff9..c0ea8a7119 100644 --- a/src/stores/widgets/StopGapWidget.ts +++ b/src/stores/widgets/StopGapWidget.ts @@ -17,10 +17,12 @@ import { Room } from "matrix-js-sdk/src/models/room"; import { ClientWidgetApi, + IModalWidgetOpenRequest, IStickerActionRequest, IStickyActionRequest, ITemplateParams, IWidget, + IWidgetApiErrorResponseData, IWidgetApiRequest, IWidgetApiRequestEmptyData, IWidgetData, @@ -28,13 +30,12 @@ import { runTemplate, Widget, WidgetApiFromWidgetAction, - IModalWidgetOpenRequest, - IWidgetApiErrorResponseData, WidgetKind, } from "matrix-widget-api"; import { EventEmitter } from "events"; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; import { logger } from "matrix-js-sdk/src/logger"; +import { ClientEvent } from "matrix-js-sdk/src/client"; import { StopGapWidgetDriver } from "./StopGapWidgetDriver"; import { WidgetMessagingStore } from "./WidgetMessagingStore"; @@ -315,8 +316,8 @@ export class StopGapWidget extends EventEmitter { } // Attach listeners for feeding events - the underlying widget classes handle permissions for us - MatrixClientPeg.get().on('event', this.onEvent); - MatrixClientPeg.get().on('Event.decrypted', this.onEventDecrypted); + MatrixClientPeg.get().on(ClientEvent.Event, this.onEvent); + MatrixClientPeg.get().on(MatrixEventEvent.Decrypted, this.onEventDecrypted); this.messaging.on(`action:${WidgetApiFromWidgetAction.UpdateAlwaysOnScreen}`, (ev: CustomEvent) => { @@ -423,8 +424,8 @@ export class StopGapWidget extends EventEmitter { this.messaging = null; if (MatrixClientPeg.get()) { - MatrixClientPeg.get().off('event', this.onEvent); - MatrixClientPeg.get().off('Event.decrypted', this.onEventDecrypted); + MatrixClientPeg.get().off(ClientEvent.Event, this.onEvent); + MatrixClientPeg.get().off(MatrixEventEvent.Decrypted, this.onEventDecrypted); } } diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index ef0df52efc..7c48d5d96b 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -16,6 +16,7 @@ import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { Optional } from "matrix-events-sdk"; import SettingsStore from "../../settings/SettingsStore"; @@ -130,7 +131,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { protected async onReady(): Promise { this.updateAllRooms(); - this.matrixClient.on("RoomState.events", this.updateRoomFromState); + this.matrixClient.on(RoomStateEvent.Events, this.updateRoomFromState); this.pinnedRef = SettingsStore.watchSetting("Widgets.pinned", null, this.updateFromSettings); this.layoutRef = SettingsStore.watchSetting("Widgets.layout", null, this.updateFromSettings); WidgetStore.instance.on(UPDATE_EVENT, this.updateFromWidgetStore); @@ -139,6 +140,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { protected async onNotReady(): Promise { this.byRoom = {}; + this.matrixClient?.off(RoomStateEvent.Events, this.updateRoomFromState); SettingsStore.unwatchSetting(this.pinnedRef); SettingsStore.unwatchSetting(this.layoutRef); WidgetStore.instance.off(UPDATE_EVENT, this.updateFromWidgetStore); diff --git a/src/utils/DMRoomMap.ts b/src/utils/DMRoomMap.ts index 92cf07016e..69ab4e192b 100644 --- a/src/utils/DMRoomMap.ts +++ b/src/utils/DMRoomMap.ts @@ -16,7 +16,7 @@ limitations under the License. import { uniq } from "lodash"; import { Room } from "matrix-js-sdk/src/models/room"; -import { MatrixClient } from "matrix-js-sdk/src/client"; +import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client"; import { logger } from "matrix-js-sdk/src/logger"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; @@ -76,11 +76,11 @@ export default class DMRoomMap { public start() { this.populateRoomToUser(); - this.matrixClient.on("accountData", this.onAccountData); + this.matrixClient.on(ClientEvent.AccountData, this.onAccountData); } public stop() { - this.matrixClient.removeListener("accountData", this.onAccountData); + this.matrixClient.removeListener(ClientEvent.AccountData, this.onAccountData); } private onAccountData = (ev: MatrixEvent) => { diff --git a/src/utils/RoomUpgrade.ts b/src/utils/RoomUpgrade.ts index 3f3369a920..d881e342b1 100644 --- a/src/utils/RoomUpgrade.ts +++ b/src/utils/RoomUpgrade.ts @@ -17,7 +17,7 @@ limitations under the License. import { Room } from "matrix-js-sdk/src/models/room"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { logger } from "matrix-js-sdk/src/logger"; -import { MatrixClient } from "matrix-js-sdk/src/client"; +import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client"; import { inviteUsersToRoom } from "../RoomInvite"; import Modal, { IHandle } from "../Modal"; @@ -46,9 +46,9 @@ export async function awaitRoomDownSync(cli: MatrixClient, roomId: string): Prom const checkForRoomFn = (room: Room) => { if (room.roomId !== roomId) return; resolve(room); - cli.off("Room", checkForRoomFn); + cli.off(ClientEvent.Room, checkForRoomFn); }; - cli.on("Room", checkForRoomFn); + cli.on(ClientEvent.Room, checkForRoomFn); }); } diff --git a/src/utils/WidgetUtils.ts b/src/utils/WidgetUtils.ts index 5f6d321b5a..3a9676ea83 100644 --- a/src/utils/WidgetUtils.ts +++ b/src/utils/WidgetUtils.ts @@ -20,6 +20,7 @@ import { Capability, IWidget, IWidgetData, MatrixCapabilities } from "matrix-wid import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { logger } from "matrix-js-sdk/src/logger"; +import { ClientEvent, RoomStateEvent } from "matrix-js-sdk/src/matrix"; import { MatrixClientPeg } from '../MatrixClientPeg'; import SdkConfig from "../SdkConfig"; @@ -156,16 +157,16 @@ export default class WidgetUtils { function onAccountData(ev) { const currentAccountDataEvent = MatrixClientPeg.get().getAccountData('m.widgets'); if (eventInIntendedState(currentAccountDataEvent)) { - MatrixClientPeg.get().removeListener('accountData', onAccountData); + MatrixClientPeg.get().removeListener(ClientEvent.AccountData, onAccountData); clearTimeout(timerId); resolve(); } } const timerId = setTimeout(() => { - MatrixClientPeg.get().removeListener('accountData', onAccountData); + MatrixClientPeg.get().removeListener(ClientEvent.AccountData, onAccountData); reject(new Error("Timed out waiting for widget ID " + widgetId + " to appear")); }, WIDGET_WAIT_TIME); - MatrixClientPeg.get().on('accountData', onAccountData); + MatrixClientPeg.get().on(ClientEvent.AccountData, onAccountData); }); } @@ -211,16 +212,16 @@ export default class WidgetUtils { const currentWidgetEvents = room.currentState.getStateEvents('im.vector.modular.widgets'); if (eventsInIntendedState(currentWidgetEvents)) { - MatrixClientPeg.get().removeListener('RoomState.events', onRoomStateEvents); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, onRoomStateEvents); clearTimeout(timerId); resolve(); } } const timerId = setTimeout(() => { - MatrixClientPeg.get().removeListener('RoomState.events', onRoomStateEvents); + MatrixClientPeg.get().removeListener(RoomStateEvent.Events, onRoomStateEvents); reject(new Error("Timed out waiting for widget ID " + widgetId + " to appear")); }, WIDGET_WAIT_TIME); - MatrixClientPeg.get().on('RoomState.events', onRoomStateEvents); + MatrixClientPeg.get().on(RoomStateEvent.Events, onRoomStateEvents); }); } diff --git a/src/utils/membership.ts b/src/utils/membership.ts index e03b575e57..6c2fe4f769 100644 --- a/src/utils/membership.ts +++ b/src/utils/membership.ts @@ -16,7 +16,7 @@ limitations under the License. import { Room } from "matrix-js-sdk/src/models/room"; import { sleep } from "matrix-js-sdk/src/utils"; -import { EventStatus } from "matrix-js-sdk/src/models/event"; +import { EventStatus, MatrixEventEvent } from "matrix-js-sdk/src/models/event"; import React from "react"; import { MatrixClientPeg } from "../MatrixClientPeg"; @@ -122,12 +122,12 @@ export async function leaveRoomBehaviour(roomId: string, retry = true, spinner = } if (!ev.status || ev.status === EventStatus.SENT) { - ev.off("Event.status", handler); + ev.off(MatrixEventEvent.Status, handler); resolve(); } }; - ev.on("Event.status", handler); + ev.on(MatrixEventEvent.Status, handler); }))); let results: { [roomId: string]: Error & { errcode?: string, message: string, data?: Record } } = {}; diff --git a/src/utils/permalinks/Permalinks.ts b/src/utils/permalinks/Permalinks.ts index 51c94c4f75..b1a01b28c3 100644 --- a/src/utils/permalinks/Permalinks.ts +++ b/src/utils/permalinks/Permalinks.ts @@ -19,8 +19,9 @@ import * as utils from "matrix-js-sdk/src/utils"; import { Room } from "matrix-js-sdk/src/models/room"; import { EventType } from "matrix-js-sdk/src/@types/event"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { RoomMember } from "matrix-js-sdk/src/models/room-member"; +import { RoomMember, RoomMemberEvent } from "matrix-js-sdk/src/models/room-member"; import { logger } from "matrix-js-sdk/src/logger"; +import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state"; import { MatrixClientPeg } from "../../MatrixClientPeg"; import MatrixToPermalinkConstructor, { baseUrl as matrixtoBaseUrl } from "./MatrixToPermalinkConstructor"; @@ -122,14 +123,14 @@ export class RoomPermalinkCreator { start() { this.load(); - this.room.on("RoomMember.membership", this.onMembership); - this.room.on("RoomState.events", this.onRoomState); + this.room.client.on(RoomMemberEvent.Membership, this.onMembership); + this.room.currentState.on(RoomStateEvent.Events, this.onRoomState); this.started = true; } stop() { - this.room.removeListener("RoomMember.membership", this.onMembership); - this.room.removeListener("RoomState.events", this.onRoomState); + this.room.client.removeListener(RoomMemberEvent.Membership, this.onMembership); + this.room.currentState.removeListener(RoomStateEvent.Events, this.onRoomState); this.started = false; } @@ -176,6 +177,8 @@ export class RoomPermalinkCreator { }; private onMembership = (evt: MatrixEvent, member: RoomMember, oldMembership: string) => { + if (member.roomId !== this.room.roomId) return; + const userId = member.userId; const membership = member.membership; const serverName = getServerName(userId); diff --git a/src/widgets/Jitsi.ts b/src/widgets/Jitsi.ts index 5534557dca..83be3e5dcf 100644 --- a/src/widgets/Jitsi.ts +++ b/src/widgets/Jitsi.ts @@ -15,7 +15,7 @@ limitations under the License. */ import { logger } from "matrix-js-sdk/src/logger"; -import { IClientWellKnown } from "matrix-js-sdk/src/client"; +import { ClientEvent, IClientWellKnown } from "matrix-js-sdk/src/client"; import SdkConfig from "../SdkConfig"; import { MatrixClientPeg } from "../MatrixClientPeg"; @@ -63,7 +63,7 @@ export class Jitsi { public start() { const cli = MatrixClientPeg.get(); - cli.on("WellKnown.client", this.update); + cli.on(ClientEvent.ClientWellKnown, this.update); // call update initially in case we missed the first WellKnown.client event and for if no well-known present this.update(cli.getClientWellKnown()); } diff --git a/test/utils/permalinks/Permalinks-test.js b/test/utils/permalinks/Permalinks-test.js index 41cce7f98d..a338706a81 100644 --- a/test/utils/permalinks/Permalinks-test.js +++ b/test/utils/permalinks/Permalinks-test.js @@ -103,18 +103,22 @@ describe('Permalinks', function() { }); it('should change candidate server when highest power level user leaves the room', function() { + const roomId = "!fake:example.org"; const member95 = { userId: "@alice:pl_95", powerLevel: 95, + roomId, }; - const room = mockRoom("!fake:example.org", [ + const room = mockRoom(roomId, [ { userId: "@alice:pl_50", powerLevel: 50, + roomId, }, { userId: "@alice:pl_75", powerLevel: 75, + roomId, }, member95, ]);