Skip to content

Commit 4d04889

Browse files
committed
Add selectors for ConnectivityController
1 parent 3afdf91 commit 4d04889

File tree

6 files changed

+81
-1
lines changed

6 files changed

+81
-1
lines changed

packages/connectivity-controller/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
- The controller now initializes with a default state (online) and requires calling `init()` to fetch the actual status
1414
- Add `setConnectivityStatus` method to manually set connectivity status ([#7676](https://github.com/MetaMask/core/pull/7676))
1515
- The method is exposed as a messenger action `ConnectivityController:setConnectivityStatus`
16+
- Add `connectivityControllerSelectors` with `selectConnectivityStatus` and `selectIsOffline` selectors ([#XXXX](https://github.com/MetaMask/core/pull/XXXX))
17+
- `selectConnectivityStatus` returns the current connectivity status from the controller state
18+
- `selectIsOffline` is a memoized selector that returns `true` when the device is offline
1619

1720
### Changed
1821

packages/connectivity-controller/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@
4949
},
5050
"dependencies": {
5151
"@metamask/base-controller": "^9.0.0",
52-
"@metamask/messenger": "^0.3.0"
52+
"@metamask/messenger": "^0.3.0",
53+
"reselect": "^5.1.1"
5354
},
5455
"devDependencies": {
5556
"@metamask/auto-changelog": "^3.4.4",

packages/connectivity-controller/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ export {
1313
ConnectivityController,
1414
getDefaultConnectivityControllerState,
1515
} from './ConnectivityController';
16+
export { connectivityControllerSelectors } from './selectors';
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import type { ConnectivityControllerState } from './ConnectivityController';
2+
import { connectivityControllerSelectors } from './selectors';
3+
import { CONNECTIVITY_STATUSES } from './types';
4+
5+
describe('connectivityControllerSelectors', () => {
6+
describe('selectConnectivityStatus', () => {
7+
it.each([[CONNECTIVITY_STATUSES.Online], [CONNECTIVITY_STATUSES.Offline]])(
8+
'returns %s when connectivityStatus is %s',
9+
(connectivityStatus) => {
10+
const state: ConnectivityControllerState = {
11+
connectivityStatus,
12+
};
13+
14+
const result =
15+
connectivityControllerSelectors.selectConnectivityStatus(state);
16+
17+
expect(result).toBe(connectivityStatus);
18+
},
19+
);
20+
});
21+
22+
describe('selectIsOffline', () => {
23+
it.each([
24+
[CONNECTIVITY_STATUSES.Online, false],
25+
[CONNECTIVITY_STATUSES.Offline, true],
26+
])(
27+
'when connectivityStatus=%s, returns %s',
28+
(connectivityStatus, expected) => {
29+
const state: ConnectivityControllerState = {
30+
connectivityStatus,
31+
};
32+
33+
const result = connectivityControllerSelectors.selectIsOffline(state);
34+
35+
expect(result).toBe(expected);
36+
},
37+
);
38+
});
39+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { createSelector } from 'reselect';
2+
3+
import type { ConnectivityControllerState } from './ConnectivityController';
4+
import { CONNECTIVITY_STATUSES } from './types';
5+
import type { ConnectivityStatus } from './types';
6+
7+
/**
8+
* Selects the connectivity status from the controller state.
9+
*
10+
* @param state - The controller state
11+
* @returns The connectivity status
12+
*/
13+
const selectConnectivityStatus = (
14+
state: ConnectivityControllerState,
15+
): ConnectivityStatus => state.connectivityStatus;
16+
17+
/**
18+
* Selects whether the device is offline.
19+
*
20+
* @param state - The controller state
21+
* @returns Whether the device is offline
22+
*/
23+
const selectIsOffline = createSelector(
24+
[selectConnectivityStatus],
25+
(connectivityStatus) => connectivityStatus === CONNECTIVITY_STATUSES.Offline,
26+
);
27+
28+
/**
29+
* Selectors for the ConnectivityController state.
30+
* These can be used with Redux or directly with controller state.
31+
*/
32+
export const connectivityControllerSelectors = {
33+
selectConnectivityStatus,
34+
selectIsOffline,
35+
};

yarn.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,6 +2995,7 @@ __metadata:
29952995
"@types/jest": "npm:^27.4.1"
29962996
deepmerge: "npm:^4.2.2"
29972997
jest: "npm:^27.5.1"
2998+
reselect: "npm:^5.1.1"
29982999
ts-jest: "npm:^27.1.4"
29993000
typedoc: "npm:^0.24.8"
30003001
typedoc-plugin-missing-exports: "npm:^2.0.0"

0 commit comments

Comments
 (0)