From 02071b5f508ae53965dbc585fd82849314c6a6ed Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Thu, 22 Jan 2026 11:50:44 +0100 Subject: [PATCH] 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"