-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Expand file tree
/
Copy pathmetamask-notifications.ts
More file actions
304 lines (282 loc) · 10.8 KB
/
metamask-notifications.ts
File metadata and controls
304 lines (282 loc) · 10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
// @ts-check
import { createSelector } from 'reselect';
import {
NotificationServicesControllerState,
INotification as Notification,
TRIGGER_TYPES,
defaultState,
} from '@metamask/notification-services-controller/notification-services';
import { createParameterizedSelector } from '../../../shared/lib/selectors/selector-creators';
import {
getRemoteFeatureFlags,
type RemoteFeatureFlagsState,
} from '../remote-feature-flags';
export type NotificationAppState = RemoteFeatureFlagsState & {
metamask: Partial<NotificationServicesControllerState>;
};
const getMetamask = (state: NotificationAppState) => ({
...defaultState,
...state.metamask,
});
/**
* Get the state of the `defiPositionsEnabled` remote feature flag.
*
* @param state
* @returns The state of the `defiPositionsEnabled` remote feature flag.
*/
export function getIsNotificationEnabledByDefaultFeatureFlag(
state: NotificationAppState,
) {
const { assetsEnableNotificationsByDefaultV2 } = getRemoteFeatureFlags(state);
const result =
assetsEnableNotificationsByDefaultV2 &&
typeof assetsEnableNotificationsByDefaultV2 === 'object' &&
'value' in assetsEnableNotificationsByDefaultV2 &&
Boolean(assetsEnableNotificationsByDefaultV2.value);
return Boolean(result);
}
/**
* Selector to get the list of MetaMask notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {Notification[]} An array of notifications.
*/
export const getMetamaskNotifications = createSelector(
[getMetamask],
(metamask): Notification[] => {
return metamask.metamaskNotificationsList;
},
);
/**
* Selector to retrieve a specific MetaMask notification by its ID.
*
* @param _state - The current state of the Redux store.
* @param id - The unique identifier of the notification to retrieve.
* @returns The notification matching the given ID, or undefined if not found.
*/
export const getMetamaskNotificationById = createParameterizedSelector(20)(
[getMetamaskNotifications, (_state: NotificationAppState, id: string) => id],
(notifications: Notification[], id: string): Notification | undefined => {
return notifications.find((notification) => notification.id === id);
},
);
/**
* Selector to get the list of read MetaMask notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {string[]} An array of notifications that have been read.
*/
export const getMetamaskNotificationsReadList = createSelector(
[getMetamask],
(metamask): string[] => metamask.metamaskNotificationsReadList,
);
/**
* Selector to get the count of unread MetaMask notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of notifications that have not been read.
*/
export const getMetamaskNotificationsUnreadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]): number => {
return notifications
? notifications.filter((notification) => !notification.isRead).length
: 0;
},
);
/**
* Selector to get the count of unread feature announcement notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of unread feature announcement notifications.
*/
export const getFeatureAnnouncementsUnreadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]): number => {
return notifications
? notifications.filter(
(notification) =>
!notification.isRead &&
notification.type === TRIGGER_TYPES.FEATURES_ANNOUNCEMENT,
).length
: 0;
},
);
/**
* Selector to get the count of read feature announcement notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of read feature announcement notifications.
*/
export const getFeatureAnnouncementsReadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]) => {
return notifications
? notifications.filter(
(notification) =>
notification.isRead &&
notification.type === TRIGGER_TYPES.FEATURES_ANNOUNCEMENT,
).length
: 0;
},
);
/**
* Selector to get the count of unread snap notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of unread snap notifications.
*/
export const getSnapNotificationsUnreadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]): number => {
return notifications
? notifications.filter(
(notification) =>
!notification.isRead && notification.type === TRIGGER_TYPES.SNAP,
).length
: 0;
},
);
/**
* Selector to get the count of read snap notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of read snap notifications.
*/
export const getSnapNotificationsReadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]) => {
return notifications
? notifications.filter(
(notification) =>
notification.isRead && notification.type === TRIGGER_TYPES.SNAP,
).length
: 0;
},
);
/**
* Selector to get the count of unread non-feature announcement notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of unread non-feature announcement notifications.
*/
export const getOnChainMetamaskNotificationsUnreadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]): number => {
return notifications
? notifications.filter(
(notification) =>
!notification.isRead &&
notification.type !== TRIGGER_TYPES.FEATURES_ANNOUNCEMENT &&
notification.type !== TRIGGER_TYPES.SNAP,
).length
: 0;
},
);
/**
* Selector to get the count of read non-feature announcement notifications.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {number} The count of read non-feature announcement notifications.
*/
export const getOnChainMetamaskNotificationsReadCount = createSelector(
[getMetamaskNotifications],
(notifications: Notification[]): number => {
return notifications
? notifications.filter(
(notification) =>
notification.isRead &&
notification.type !== TRIGGER_TYPES.FEATURES_ANNOUNCEMENT &&
notification.type !== TRIGGER_TYPES.SNAP,
).length
: 0;
},
);
/**
* Selector to determine if the MetaMask notifications feature has been seen by the user.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {boolean} Returns true if the MetaMask notifications feature has been seen, false otherwise.
*/
export const selectIsMetamaskNotificationsFeatureSeen = createSelector(
[getMetamask],
(metamask) => metamask.isMetamaskNotificationsFeatureSeen,
);
/**
* Selector to determine if MetaMask notifications are enabled.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {boolean} Returns true if MetaMask notifications are enabled, false otherwise.
*/
export const selectIsMetamaskNotificationsEnabled = createSelector(
[getMetamask],
(metamask): boolean => metamask.isNotificationServicesEnabled,
);
/**
* Selector to determine if feature announcements are enabled.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {boolean} Returns true if feature announcements are enabled, false otherwise.
*/
export const selectIsFeatureAnnouncementsEnabled = createSelector(
[getMetamask],
(metamask): boolean => metamask.isFeatureAnnouncementsEnabled,
);
/**
* Selector to determine if MetaMask notifications are currently being created.
*
* This selector checks the `isUpdatingMetamaskNotifications` property of the `metamask` state to see if the notifications are in the process of being created.
* It uses the `createSelector` function from 'reselect' for memoization, improving performance by avoiding unnecessary recalculations.
*
* @param state - The current state of the Redux store.
* @returns Returns true if MetaMask notifications are being created, false otherwise.
*/
export const getIsUpdatingMetamaskNotifications = createSelector(
[getMetamask],
(metamask): boolean => metamask.isUpdatingMetamaskNotifications,
);
/**
* Selector to determine if MetaMask notifications are currently being fetched.
*
* This selector accesses the `isFetchingMetamaskNotifications` property from the `metamask` state to check if the notifications are currently being fetched.
* It leverages the `createSelector` function for memoization, which helps in optimizing the performance by caching the result until the input selectors' outputs change.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {boolean} Returns true if MetaMask notifications are being fetched, false otherwise.
*/
export const isFetchingMetamaskNotifications = createSelector(
[getMetamask],
(metamask): boolean => metamask.isFetchingMetamaskNotifications,
);
/**
* Selector to determine if the MetaMask notifications account is currently being updated.
*
* This selector checks the `isUpdatingMetamaskNotificationsAccount` property of the `metamask` state to see if the account associated with MetaMask notifications is in the process of being updated.
* It uses the `createSelector` function from 'reselect' for memoization, improving performance by avoiding unnecessary recalculations.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {string[]} Returns list of accounts that are currently being updated.
*/
export const getIsUpdatingMetamaskNotificationsAccount = createSelector(
[getMetamask],
(metamask): string[] => {
return metamask.isUpdatingMetamaskNotificationsAccount;
},
);
/**
* Selector to determine if the presence of accounts is currently being checked.
*
* This selector accesses the `isCheckingAccountsPresence` property from the `metamask` state to check if the system is currently verifying the presence of accounts.
* It leverages the `createSelector` function for memoization, which helps in optimizing performance by caching the result until the input selectors' outputs change.
*
* @param {NotificationAppState} state - The current state of the Redux store.
* @returns {boolean} Returns true if the account presence check is ongoing, false otherwise.
*/
export const getIsCheckingAccountsPresence = createSelector(
[getMetamask],
(metamask): boolean => metamask.isCheckingAccountsPresence,
);
export const getValidNotificationAccounts = createSelector(
[getMetamask],
(metamask): string[] => metamask.subscriptionAccountsSeen,
);