diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 19bc221444..38f3d9ba4f 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -15,7 +15,7 @@ import type { logger } from "matrix-js-sdk/src/logger"; import type ContentMessages from "../ContentMessages"; import { type IMatrixClientPeg } from "../MatrixClientPeg"; import type ToastStore from "../stores/ToastStore"; -import type DeviceListener from "../DeviceListener"; +import { type DeviceListener } from "../device-listener"; import { type RoomListStore } from "../stores/room-list/Interface"; import { type PlatformPeg } from "../PlatformPeg"; import type RoomListLayoutStore from "../stores/room-list/RoomListLayoutStore"; diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index e0d5c7bd78..78c6cc2de6 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -41,7 +41,7 @@ import { SettingLevel } from "./settings/SettingLevel"; import ToastStore from "./stores/ToastStore"; import { IntegrationManagers } from "./integrations/IntegrationManagers"; import { Mjolnir } from "./mjolnir/Mjolnir"; -import DeviceListener from "./DeviceListener"; +import { DeviceListener } from "./device-listener"; import { Jitsi } from "./widgets/Jitsi"; import { SSO_HOMESERVER_URL_KEY, SSO_ID_SERVER_URL_KEY, SSO_IDP_ID_KEY } from "./BasePlatform"; import ThreepidInviteStore from "./stores/ThreepidInviteStore"; diff --git a/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts b/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts index 7dd2419c62..d968b91a7c 100644 --- a/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts +++ b/src/components/viewmodels/settings/encryption/KeyStoragePanelViewModel.ts @@ -10,10 +10,9 @@ import { CryptoEvent } from "matrix-js-sdk/src/crypto-api"; import { logger } from "matrix-js-sdk/src/logger"; import { useMatrixClientContext } from "../../../../contexts/MatrixClientContext"; -import DeviceListener from "../../../../DeviceListener"; +import { DeviceListener, BACKUP_DISABLED_ACCOUNT_DATA_KEY } from "../../../../device-listener"; import { useEventEmitterAsyncState } from "../../../../hooks/useEventEmitter"; import { resetKeyBackupAndWait } from "../../../../utils/crypto/resetKeyBackup"; -import { BACKUP_DISABLED_ACCOUNT_DATA_KEY } from "../../../../device-listener/DeviceListenerCurrentDevice"; interface KeyStoragePanelState { /** diff --git a/src/components/views/settings/encryption/ChangeRecoveryKey.tsx b/src/components/views/settings/encryption/ChangeRecoveryKey.tsx index 7f0f61cbfe..f62a429aa7 100644 --- a/src/components/views/settings/encryption/ChangeRecoveryKey.tsx +++ b/src/components/views/settings/encryption/ChangeRecoveryKey.tsx @@ -31,9 +31,8 @@ import { initialiseDehydrationIfEnabled } from "../../../../utils/device/dehydra import { withSecretStorageKeyCache } from "../../../../SecurityManager"; import { EncryptionCardButtons } from "./EncryptionCardButtons"; import { logErrorAndShowErrorDialog } from "../../../../utils/ErrorUtils.tsx"; -import DeviceListener from "../../../../DeviceListener"; +import { DeviceListener, RECOVERY_ACCOUNT_DATA_KEY } from "../../../../device-listener"; import { resetKeyBackupAndWait } from "../../../../utils/crypto/resetKeyBackup"; -import { RECOVERY_ACCOUNT_DATA_KEY } from "../../../../device-listener/DeviceListenerCurrentDevice.ts"; /** * The possible states of the component. diff --git a/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx b/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx index 4c4bcbee33..dd06854bbc 100644 --- a/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx +++ b/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx @@ -14,7 +14,7 @@ import { SettingsSection } from "../shared/SettingsSection"; import { _t } from "../../../../languageHandler"; import { SettingsSubheader } from "../SettingsSubheader"; import { AccessCancelledError, accessSecretStorage } from "../../../../SecurityManager"; -import DeviceListener from "../../../../DeviceListener"; +import { DeviceListener } from "../../../../device-listener"; import { useMatrixClientContext } from "../../../../contexts/MatrixClientContext"; import { resetKeyBackupAndWait } from "../../../../utils/crypto/resetKeyBackup"; diff --git a/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx b/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx index c0cc936f03..52ee2b1e60 100644 --- a/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx @@ -24,9 +24,8 @@ import { RecoveryPanelOutOfSync } from "../../encryption/RecoveryPanelOutOfSync" import { useTypedEventEmitterState } from "../../../../../hooks/useEventEmitter"; import { KeyStoragePanel } from "../../encryption/KeyStoragePanel"; import { DeleteKeyStoragePanel } from "../../encryption/DeleteKeyStoragePanel"; -import DeviceListener, { DeviceListenerEvents } from "../../../../../DeviceListener"; +import { DeviceListener, DeviceListenerEvents, type DeviceState } from "../../../../../device-listener"; import { useKeyStoragePanelViewModel } from "../../../../viewmodels/settings/encryption/KeyStoragePanelViewModel"; -import type DeviceState from "../../../../../device-listener/DeviceState"; /** * The state in the encryption settings tab. diff --git a/src/DeviceListener.ts b/src/device-listener/DeviceListener.ts similarity index 94% rename from src/DeviceListener.ts rename to src/device-listener/DeviceListener.ts index 111808a976..fed7b9ad5a 100644 --- a/src/DeviceListener.ts +++ b/src/device-listener/DeviceListener.ts @@ -12,17 +12,15 @@ import { logger as baseLogger, LogSpan } from "matrix-js-sdk/src/logger"; import { type CryptoSessionStateChange } from "@matrix-org/analytics-events/types/typescript/CryptoSessionStateChange"; import { secureRandomString } from "matrix-js-sdk/src/randomstring"; -import { PosthogAnalytics } from "./PosthogAnalytics"; -import dis from "./dispatcher/dispatcher"; -import { type ActionPayload } from "./dispatcher/payloads"; -import { Action } from "./dispatcher/actions"; -import SdkConfig from "./SdkConfig"; -import PlatformPeg from "./PlatformPeg"; -import { recordClientInformation, removeClientInformation } from "./utils/device/clientInformation"; -import SettingsStore, { type CallbackFn } from "./settings/SettingsStore"; -import DeviceListenerOtherDevices from "./device-listener/DeviceListenerOtherDevices.ts"; -import DeviceListenerCurrentDevice from "./device-listener/DeviceListenerCurrentDevice.ts"; -import type DeviceState from "./device-listener/DeviceState.ts"; +import { PosthogAnalytics } from "../PosthogAnalytics"; +import dis from "../dispatcher/dispatcher"; +import { type ActionPayload } from "../dispatcher/payloads"; +import { Action } from "../dispatcher/actions"; +import SdkConfig from "../SdkConfig"; +import PlatformPeg from "../PlatformPeg"; +import { recordClientInformation, removeClientInformation } from "../utils/device/clientInformation"; +import SettingsStore, { type CallbackFn } from "../settings/SettingsStore"; +import { DeviceListenerOtherDevices, DeviceListenerCurrentDevice, type DeviceState } from "."; const logger = baseLogger.getChild("DeviceListener:"); @@ -37,7 +35,7 @@ type EventHandlerMap = { [DeviceListenerEvents.DeviceState]: (state: DeviceState) => void; }; -export default class DeviceListener extends TypedEventEmitter { +export class DeviceListener extends TypedEventEmitter { private dispatcherRef?: string; /** diff --git a/src/device-listener/DeviceListenerCurrentDevice.ts b/src/device-listener/DeviceListenerCurrentDevice.ts index 4debb378f7..d74ee76507 100644 --- a/src/device-listener/DeviceListenerCurrentDevice.ts +++ b/src/device-listener/DeviceListenerCurrentDevice.ts @@ -18,9 +18,7 @@ import { ClientEvent, } from "matrix-js-sdk/src/matrix"; -import type DeviceListener from "../DeviceListener"; -import type DeviceState from "./DeviceState"; -import { DeviceListenerEvents } from "../DeviceListener"; +import { type DeviceListener, type DeviceState, DeviceListenerEvents } from "."; import { hideToast as hideSetupEncryptionToast, showToast as showSetupEncryptionToast, @@ -46,7 +44,7 @@ export const RECOVERY_ACCOUNT_DATA_KEY = "io.element.recovery"; /** * Handles all of DeviceListener's work that relates to the current device. */ -export default class DeviceListenerCurrentDevice { +export class DeviceListenerCurrentDevice { /** * The DeviceListener launching this instance. */ diff --git a/src/device-listener/DeviceListenerOtherDevices.ts b/src/device-listener/DeviceListenerOtherDevices.ts index 8cf839e8fd..d39d77ef60 100644 --- a/src/device-listener/DeviceListenerOtherDevices.ts +++ b/src/device-listener/DeviceListenerOtherDevices.ts @@ -11,7 +11,7 @@ import { CryptoEvent } from "matrix-js-sdk/src/crypto-api"; import { type LogSpan } from "matrix-js-sdk/src/logger"; import { type MatrixClient } from "matrix-js-sdk/src/matrix"; -import type DeviceListener from "../DeviceListener"; +import { type DeviceListener } from "."; import { getUserDeviceIds } from "../utils/crypto/deviceInfo"; import { isBulkUnverifiedDeviceReminderSnoozed } from "../utils/device/snoozeBulkUnverifiedDeviceReminder"; import { @@ -23,7 +23,7 @@ import { showToast as showUnverifiedSessionToast, } from "../toasts/UnverifiedSessionToast"; -export default class DeviceListenerOtherDevices { +export class DeviceListenerOtherDevices { /** * The DeviceListener launching this instance. */ diff --git a/src/device-listener/DeviceState.ts b/src/device-listener/DeviceState.ts index 569258d1d2..9977011fb2 100644 --- a/src/device-listener/DeviceState.ts +++ b/src/device-listener/DeviceState.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. /** * The state of the device and the user's account. */ -type DeviceState = +export type DeviceState = /** * The device is in a good state. */ @@ -35,5 +35,3 @@ type DeviceState = * The user's identity needs resetting, due to missing keys. */ | "identity_needs_reset"; - -export default DeviceState; diff --git a/src/device-listener/index.ts b/src/device-listener/index.ts new file mode 100644 index 0000000000..af45ea9af8 --- /dev/null +++ b/src/device-listener/index.ts @@ -0,0 +1,11 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +export * from "./DeviceListener"; +export * from "./DeviceListenerCurrentDevice"; +export * from "./DeviceListenerOtherDevices"; +export type * from "./DeviceState"; diff --git a/src/toasts/BulkUnverifiedSessionsToast.tsx b/src/toasts/BulkUnverifiedSessionsToast.tsx index 7f658dc3ab..ac3efa71e8 100644 --- a/src/toasts/BulkUnverifiedSessionsToast.tsx +++ b/src/toasts/BulkUnverifiedSessionsToast.tsx @@ -11,7 +11,7 @@ import { ErrorSolidIcon } from "@vector-im/compound-design-tokens/assets/web/ico import { _t } from "../languageHandler"; import dis from "../dispatcher/dispatcher"; -import DeviceListener from "../DeviceListener"; +import { DeviceListener } from "../device-listener"; import GenericToast from "../components/views/toasts/GenericToast"; import ToastStore from "../stores/ToastStore"; import { Action } from "../dispatcher/actions"; diff --git a/src/toasts/SetupEncryptionToast.tsx b/src/toasts/SetupEncryptionToast.tsx index ab769f4ce1..aaeb4b6cde 100644 --- a/src/toasts/SetupEncryptionToast.tsx +++ b/src/toasts/SetupEncryptionToast.tsx @@ -15,7 +15,7 @@ import { logger } from "matrix-js-sdk/src/logger"; import Modal from "../Modal"; import { _t } from "../languageHandler"; -import DeviceListener from "../DeviceListener"; +import { DeviceListener, type DeviceState } from "../device-listener"; import SetupEncryptionDialog from "../components/views/dialogs/security/SetupEncryptionDialog"; import { AccessCancelledError, accessSecretStorage } from "../SecurityManager"; import ToastStore, { type IToast } from "../stores/ToastStore"; @@ -31,7 +31,6 @@ import ConfirmKeyStorageOffDialog from "../components/views/dialogs/ConfirmKeySt import { MatrixClientPeg } from "../MatrixClientPeg"; import { resetKeyBackupAndWait } from "../utils/crypto/resetKeyBackup"; import { PosthogAnalytics } from "../PosthogAnalytics"; -import type DeviceState from "../device-listener/DeviceState"; const TOAST_KEY = "setupencryption"; diff --git a/src/toasts/UnverifiedSessionToast.tsx b/src/toasts/UnverifiedSessionToast.tsx index 4a7f7d2be4..d66439d4fe 100644 --- a/src/toasts/UnverifiedSessionToast.tsx +++ b/src/toasts/UnverifiedSessionToast.tsx @@ -12,7 +12,7 @@ import { ErrorSolidIcon } from "@vector-im/compound-design-tokens/assets/web/ico import { _t } from "../languageHandler"; import dis from "../dispatcher/dispatcher"; import { MatrixClientPeg } from "../MatrixClientPeg"; -import DeviceListener from "../DeviceListener"; +import { DeviceListener } from "../device-listener"; import ToastStore from "../stores/ToastStore"; import GenericToast from "../components/views/toasts/GenericToast"; import { Action } from "../dispatcher/actions"; diff --git a/test/unit-tests/DeviceListener-test.ts b/test/unit-tests/DeviceListener-test.ts index f5fa239520..713221928c 100644 --- a/test/unit-tests/DeviceListener-test.ts +++ b/test/unit-tests/DeviceListener-test.ts @@ -25,7 +25,7 @@ import { } from "matrix-js-sdk/src/crypto-api"; import { type CryptoSessionStateChange } from "@matrix-org/analytics-events/types/typescript/CryptoSessionStateChange"; -import DeviceListener from "../../src/DeviceListener"; +import { DeviceListener, BACKUP_DISABLED_ACCOUNT_DATA_KEY } from "../../src/device-listener"; import { MatrixClientPeg } from "../../src/MatrixClientPeg"; import * as SetupEncryptionToast from "../../src/toasts/SetupEncryptionToast"; import * as UnverifiedSessionToast from "../../src/toasts/UnverifiedSessionToast"; @@ -37,7 +37,6 @@ import { SettingLevel } from "../../src/settings/SettingLevel"; import { getMockClientWithEventEmitter, mockPlatformPeg } from "../test-utils"; import { isBulkUnverifiedDeviceReminderSnoozed } from "../../src/utils/device/snoozeBulkUnverifiedDeviceReminder"; import { PosthogAnalytics } from "../../src/PosthogAnalytics"; -import { BACKUP_DISABLED_ACCOUNT_DATA_KEY } from "../../src/device-listener/DeviceListenerCurrentDevice"; jest.mock("../../src/dispatcher/dispatcher", () => ({ dispatch: jest.fn(), diff --git a/test/unit-tests/components/views/settings/encryption/ChangeRecoveryKey-test.tsx b/test/unit-tests/components/views/settings/encryption/ChangeRecoveryKey-test.tsx index 7b494e28ca..33813ca6f9 100644 --- a/test/unit-tests/components/views/settings/encryption/ChangeRecoveryKey-test.tsx +++ b/test/unit-tests/components/views/settings/encryption/ChangeRecoveryKey-test.tsx @@ -16,7 +16,7 @@ import { createTestClient, withClientContextRenderOptions } from "../../../../.. import { copyPlaintext } from "../../../../../../src/utils/strings"; import Modal from "../../../../../../src/Modal"; import ErrorDialog from "../../../../../../src/components/views/dialogs/ErrorDialog"; -import DeviceListener from "../../../../../../src/DeviceListener"; +import { DeviceListener } from "../../../../../../src/device-listener"; jest.mock("../../../../../../src/utils/strings", () => ({ copyPlaintext: jest.fn(), diff --git a/test/unit-tests/components/views/settings/encryption/RecoveryPanelOutOfSync-test.tsx b/test/unit-tests/components/views/settings/encryption/RecoveryPanelOutOfSync-test.tsx index 7f1d37b329..222df74ec1 100644 --- a/test/unit-tests/components/views/settings/encryption/RecoveryPanelOutOfSync-test.tsx +++ b/test/unit-tests/components/views/settings/encryption/RecoveryPanelOutOfSync-test.tsx @@ -13,7 +13,7 @@ import { type MatrixClient } from "matrix-js-sdk/src/matrix"; import { RecoveryPanelOutOfSync } from "../../../../../../src/components/views/settings/encryption/RecoveryPanelOutOfSync"; import { AccessCancelledError, accessSecretStorage } from "../../../../../../src/SecurityManager"; -import DeviceListener from "../../../../../../src/DeviceListener"; +import { DeviceListener } from "../../../../../../src/device-listener"; import { createTestClient, withClientContextRenderOptions } from "../../../../../test-utils"; jest.mock("../../../../../../src/SecurityManager", () => { diff --git a/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx b/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx index d86f8fbdec..129b6ca797 100644 --- a/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx +++ b/test/unit-tests/components/views/settings/tabs/user/EncryptionUserSettingsTab-test.tsx @@ -19,7 +19,7 @@ import { } from "../../../../../../../src/components/views/settings/tabs/user/EncryptionUserSettingsTab"; import { createTestClient, withClientContextRenderOptions } from "../../../../../../test-utils"; import Modal from "../../../../../../../src/Modal"; -import DeviceListener from "../../../../../../../src/DeviceListener"; +import { DeviceListener } from "../../../../../../../src/device-listener"; describe("", () => { let matrixClient: MatrixClient; diff --git a/test/unit-tests/toasts/SetupEncryptionToast-test.tsx b/test/unit-tests/toasts/SetupEncryptionToast-test.tsx index 52c19984bc..8bae6689ec 100644 --- a/test/unit-tests/toasts/SetupEncryptionToast-test.tsx +++ b/test/unit-tests/toasts/SetupEncryptionToast-test.tsx @@ -17,7 +17,7 @@ import * as SecurityManager from "../../../src/SecurityManager"; import ToastContainer from "../../../src/components/structures/ToastContainer"; import { showToast } from "../../../src/toasts/SetupEncryptionToast"; import dis from "../../../src/dispatcher/dispatcher"; -import DeviceListener from "../../../src/DeviceListener"; +import { DeviceListener } from "../../../src/device-listener"; import Modal from "../../../src/Modal"; import ConfirmKeyStorageOffDialog from "../../../src/components/views/dialogs/ConfirmKeyStorageOffDialog"; import SetupEncryptionDialog from "../../../src/components/views/dialogs/security/SetupEncryptionDialog"; diff --git a/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx b/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx index ee67599b63..d61927eb39 100644 --- a/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx +++ b/test/unit-tests/toasts/UnverifiedSessionToast-test.tsx @@ -18,7 +18,7 @@ import { showToast } from "../../../src/toasts/UnverifiedSessionToast"; import { filterConsole, flushPromises, stubClient } from "../../test-utils"; import ToastContainer from "../../../src/components/structures/ToastContainer"; import { Action } from "../../../src/dispatcher/actions"; -import DeviceListener from "../../../src/DeviceListener"; +import { DeviceListener } from "../../../src/device-listener"; describe("UnverifiedSessionToast", () => { const otherDevice: IMyDevice = {