From 02071b5f508ae53965dbc585fd82849314c6a6ed Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Thu, 22 Jan 2026 11:50:44 +0100 Subject: [PATCH 1/4] Add selectors for ConnectivityController --- packages/connectivity-controller/CHANGELOG.md | 3 ++ packages/connectivity-controller/package.json | 3 +- packages/connectivity-controller/src/index.ts | 1 + .../src/selectors.test.ts | 39 +++++++++++++++++++ .../connectivity-controller/src/selectors.ts | 35 +++++++++++++++++ yarn.lock | 1 + 6 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 packages/connectivity-controller/src/selectors.test.ts create mode 100644 packages/connectivity-controller/src/selectors.ts diff --git a/packages/connectivity-controller/CHANGELOG.md b/packages/connectivity-controller/CHANGELOG.md index 72bfa6f8965..c728f5a3e9b 100644 --- a/packages/connectivity-controller/CHANGELOG.md +++ b/packages/connectivity-controller/CHANGELOG.md @@ -13,6 +13,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The controller now initializes with a default state (online) and requires calling `init()` to fetch the actual status - Add `setConnectivityStatus` method to manually set connectivity status ([#7676](https://github.com/MetaMask/core/pull/7676)) - The method is exposed as a messenger action `ConnectivityController:setConnectivityStatus` +- Add `connectivityControllerSelectors` with `selectConnectivityStatus` and `selectIsOffline` selectors ([#7701](https://github.com/MetaMask/core/pull/7701)) + - `selectConnectivityStatus` returns the current connectivity status from the controller state + - `selectIsOffline` is a memoized selector that returns `true` when the device is offline ### Changed diff --git a/packages/connectivity-controller/package.json b/packages/connectivity-controller/package.json index 468e096c291..63657af6c63 100644 --- a/packages/connectivity-controller/package.json +++ b/packages/connectivity-controller/package.json @@ -49,7 +49,8 @@ }, "dependencies": { "@metamask/base-controller": "^9.0.0", - "@metamask/messenger": "^0.3.0" + "@metamask/messenger": "^0.3.0", + "reselect": "^5.1.1" }, "devDependencies": { "@metamask/auto-changelog": "^3.4.4", diff --git a/packages/connectivity-controller/src/index.ts b/packages/connectivity-controller/src/index.ts index af8cfc311a2..4cd875d8f89 100644 --- a/packages/connectivity-controller/src/index.ts +++ b/packages/connectivity-controller/src/index.ts @@ -13,3 +13,4 @@ export { ConnectivityController, getDefaultConnectivityControllerState, } from './ConnectivityController'; +export { connectivityControllerSelectors } from './selectors'; diff --git a/packages/connectivity-controller/src/selectors.test.ts b/packages/connectivity-controller/src/selectors.test.ts new file mode 100644 index 00000000000..8b9c227cdcb --- /dev/null +++ b/packages/connectivity-controller/src/selectors.test.ts @@ -0,0 +1,39 @@ +import type { ConnectivityControllerState } from './ConnectivityController'; +import { connectivityControllerSelectors } from './selectors'; +import { CONNECTIVITY_STATUSES } from './types'; + +describe('connectivityControllerSelectors', () => { + describe('selectConnectivityStatus', () => { + it.each([[CONNECTIVITY_STATUSES.Online], [CONNECTIVITY_STATUSES.Offline]])( + 'returns %s when connectivityStatus is %s', + (connectivityStatus) => { + const state: ConnectivityControllerState = { + connectivityStatus, + }; + + const result = + connectivityControllerSelectors.selectConnectivityStatus(state); + + expect(result).toBe(connectivityStatus); + }, + ); + }); + + describe('selectIsOffline', () => { + it.each([ + [CONNECTIVITY_STATUSES.Online, false], + [CONNECTIVITY_STATUSES.Offline, true], + ])( + 'when connectivityStatus=%s, returns %s', + (connectivityStatus, expected) => { + const state: ConnectivityControllerState = { + connectivityStatus, + }; + + const result = connectivityControllerSelectors.selectIsOffline(state); + + expect(result).toBe(expected); + }, + ); + }); +}); diff --git a/packages/connectivity-controller/src/selectors.ts b/packages/connectivity-controller/src/selectors.ts new file mode 100644 index 00000000000..cea73cc5974 --- /dev/null +++ b/packages/connectivity-controller/src/selectors.ts @@ -0,0 +1,35 @@ +import { createSelector } from 'reselect'; + +import type { ConnectivityControllerState } from './ConnectivityController'; +import { CONNECTIVITY_STATUSES } from './types'; +import type { ConnectivityStatus } from './types'; + +/** + * Selects the connectivity status from the controller state. + * + * @param state - The controller state + * @returns The connectivity status + */ +const selectConnectivityStatus = ( + state: ConnectivityControllerState, +): ConnectivityStatus => state.connectivityStatus; + +/** + * Selects whether the device is offline. + * + * @param state - The controller state + * @returns Whether the device is offline + */ +const selectIsOffline = createSelector( + [selectConnectivityStatus], + (connectivityStatus) => connectivityStatus === CONNECTIVITY_STATUSES.Offline, +); + +/** + * Selectors for the ConnectivityController state. + * These can be used with Redux or directly with controller state. + */ +export const connectivityControllerSelectors = { + selectConnectivityStatus, + selectIsOffline, +}; diff --git a/yarn.lock b/yarn.lock index efbd8d7a726..2d810f2ccf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2995,6 +2995,7 @@ __metadata: "@types/jest": "npm:^27.4.1" deepmerge: "npm:^4.2.2" jest: "npm:^27.5.1" + reselect: "npm:^5.1.1" ts-jest: "npm:^27.1.4" typedoc: "npm:^0.24.8" typedoc-plugin-missing-exports: "npm:^2.0.0" From 27e0999e0fd7959a4d04a5c053709a30dfd0c61d Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Thu, 26 Mar 2026 11:20:40 +0100 Subject: [PATCH 2/4] fix: lock file --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index 40f1eb934a7..22ffb63a949 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3260,6 +3260,7 @@ __metadata: "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" + reselect: "npm:^5.1.1" ts-jest: "npm:^29.2.5" tsx: "npm:^4.20.5" typedoc: "npm:^0.25.13" From 40fd2dcf05614419d34b0582b9ea23629626cbcd Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Thu, 26 Mar 2026 15:29:49 +0100 Subject: [PATCH 3/4] refactor: unroll parameterized selector tests for readability --- .../src/selectors.test.ts | 68 +++++++++++-------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/packages/connectivity-controller/src/selectors.test.ts b/packages/connectivity-controller/src/selectors.test.ts index 8b9c227cdcb..99eec99a459 100644 --- a/packages/connectivity-controller/src/selectors.test.ts +++ b/packages/connectivity-controller/src/selectors.test.ts @@ -4,36 +4,48 @@ import { CONNECTIVITY_STATUSES } from './types'; describe('connectivityControllerSelectors', () => { describe('selectConnectivityStatus', () => { - it.each([[CONNECTIVITY_STATUSES.Online], [CONNECTIVITY_STATUSES.Offline]])( - 'returns %s when connectivityStatus is %s', - (connectivityStatus) => { - const state: ConnectivityControllerState = { - connectivityStatus, - }; - - const result = - connectivityControllerSelectors.selectConnectivityStatus(state); - - expect(result).toBe(connectivityStatus); - }, - ); + it('returns Online when connectivityStatus is Online', () => { + const state: ConnectivityControllerState = { + connectivityStatus: CONNECTIVITY_STATUSES.Online, + }; + + const result = + connectivityControllerSelectors.selectConnectivityStatus(state); + + expect(result).toBe(CONNECTIVITY_STATUSES.Online); + }); + + it('returns Offline when connectivityStatus is Offline', () => { + const state: ConnectivityControllerState = { + connectivityStatus: CONNECTIVITY_STATUSES.Offline, + }; + + const result = + connectivityControllerSelectors.selectConnectivityStatus(state); + + expect(result).toBe(CONNECTIVITY_STATUSES.Offline); + }); }); describe('selectIsOffline', () => { - it.each([ - [CONNECTIVITY_STATUSES.Online, false], - [CONNECTIVITY_STATUSES.Offline, true], - ])( - 'when connectivityStatus=%s, returns %s', - (connectivityStatus, expected) => { - const state: ConnectivityControllerState = { - connectivityStatus, - }; - - const result = connectivityControllerSelectors.selectIsOffline(state); - - expect(result).toBe(expected); - }, - ); + it('returns false when connectivityStatus is Online', () => { + const state: ConnectivityControllerState = { + connectivityStatus: CONNECTIVITY_STATUSES.Online, + }; + + const result = connectivityControllerSelectors.selectIsOffline(state); + + expect(result).toBe(false); + }); + + it('returns true when connectivityStatus is Offline', () => { + const state: ConnectivityControllerState = { + connectivityStatus: CONNECTIVITY_STATUSES.Offline, + }; + + const result = connectivityControllerSelectors.selectIsOffline(state); + + expect(result).toBe(true); + }); }); }); From bd031dc764344629c73fc41a35077caf53a01ebd Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 31 Mar 2026 22:21:41 +0200 Subject: [PATCH 4/4] fix: changelog section --- packages/connectivity-controller/CHANGELOG.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/connectivity-controller/CHANGELOG.md b/packages/connectivity-controller/CHANGELOG.md index a0523836176..15b21e447ae 100644 --- a/packages/connectivity-controller/CHANGELOG.md +++ b/packages/connectivity-controller/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `connectivityControllerSelectors` with `selectConnectivityStatus` and `selectIsOffline` selectors ([#7701](https://github.com/MetaMask/core/pull/7701)) + - `selectConnectivityStatus` returns the current connectivity status from the controller state + - `selectIsOffline` is a memoized selector that returns `true` when the device is offline + ## [0.2.0] ### Added @@ -16,9 +22,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - This method can be called through the messenger action `ConnectivityController:init` - Add `setConnectivityStatus` method to manually set connectivity status ([#7676](https://github.com/MetaMask/core/pull/7676)) - The method is exposed as a messenger action `ConnectivityController:setConnectivityStatus` -- Add `connectivityControllerSelectors` with `selectConnectivityStatus` and `selectIsOffline` selectors ([#7701](https://github.com/MetaMask/core/pull/7701)) - - `selectConnectivityStatus` returns the current connectivity status from the controller state - - `selectIsOffline` is a memoized selector that returns `true` when the device is offline ### Changed