@zeniai/client-epic-state 5.1.74 → 5.1.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/index.js +2 -2
- package/lib/esm/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +13 -16
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewPayload.js +7 -2
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewReducer.js +55 -10
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewSelector.js +23 -13
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewState.js +1 -0
- package/lib/index.d.ts +2 -2
- package/lib/index.js +16 -14
- package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.d.ts +2 -8
- package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +10 -13
- package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.d.ts +2 -1
- package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.js +7 -2
- package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.d.ts +6 -1
- package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.js +56 -11
- package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.js +23 -15
- package/lib/view/notificationPreferencesView/notificationPreferencesViewState.d.ts +1 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewState.js +1 -0
- package/package.json +1 -1
package/lib/esm/index.js
CHANGED
|
@@ -212,7 +212,7 @@ import { isNetBurnOrIncomeClassesViewCalculatedSectionID, isNetBurnOrIncomeClass
|
|
|
212
212
|
import { toAverageMonthsCount } from './view/netBurnOrIncomeStoryCard/epic/updateNetBurnOrIncomeStoryCardSettingsEpic';
|
|
213
213
|
import { fetchNetBurnOrIncomeStoryCard, updateNetBurnOrIncomeStoryCardSettings, } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardReducer';
|
|
214
214
|
import { getNetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelector';
|
|
215
|
-
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel, } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
|
|
215
|
+
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
|
|
216
216
|
import { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, hasUnsavedNotificationPreferences, } from './view/notificationPreferencesView/notificationPreferencesViewSelector';
|
|
217
217
|
import { fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, fetchNotificationView, updateNotificationViewAllNotificationsStatus, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewNotificationStatus, updateNotificationViewSubTab, updateNotificationViewTabState, updateNotificationViewUIState, } from './view/notificationView/notificationViewReducer';
|
|
218
218
|
import { getExternalNotificationsForSelectedSubTab, getNotificationView, getNotificationsForSelectedSubTab, } from './view/notificationView/notificationViewSelector';
|
|
@@ -646,7 +646,7 @@ export { toNotificationModeStrict, updateCommentsNotifications, updateCommentsNo
|
|
|
646
646
|
export { toNotificationSubTabTypeStrict, toNotificationTabTypeStrict, fetchNotificationView, fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, updateNotificationViewAllNotificationsStatus, updateNotificationViewNotificationStatus, updateNotificationViewTabState, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewSubTab, updateNotificationViewUIState, getNotificationView, getExternalNotificationsForSelectedSubTab, getNotificationsForSelectedSubTab, };
|
|
647
647
|
export { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature, getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, };
|
|
648
648
|
export { pushToastNotification, getLastNotificationTime, getNotifications, };
|
|
649
|
-
export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
|
|
649
|
+
export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
|
|
650
650
|
export { getReferralListView, getInviteFormView, toReferralListViewSortKeyType, StatusTypes, AmountStatusTypes, DEFAULT_REFERRER_AMOUNT, fetchReferrals, sendReferralInvite, clearReferrals, saveReferralFormDataInLocalStore, updateReferralListSortUiState, resendReferralInvite, fetchRewardsPlan, getRewardsPlanCard, updateReferViewed, };
|
|
651
651
|
export { ALL_WEEK_DAYS, SEMI_WEEKLY_REQUIRED_DAYS_COUNT, getMinAllowedEndDate, getRecurringEndDateFromCount, toDayOfWeek, toRecurringFrequency, };
|
|
652
652
|
export { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, getCompanyTaskManagerView, createTaskFromTaskGroupTemplate, };
|
|
@@ -1,19 +1,14 @@
|
|
|
1
|
-
import { EMPTY,
|
|
2
|
-
import { catchError,
|
|
1
|
+
import { EMPTY, of } from 'rxjs';
|
|
2
|
+
import { catchError, filter, finalize, mergeMap, switchMap, takeUntil, withLatestFrom, } from 'rxjs/operators';
|
|
3
3
|
import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
|
|
4
4
|
import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
|
|
5
5
|
import { notificationPreferencesUrl } from '../notificationPreferencesEndpoint';
|
|
6
6
|
import { mapPreferencesToPayload, } from '../notificationPreferencesViewPayload';
|
|
7
|
-
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess,
|
|
7
|
+
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, } from '../notificationPreferencesViewReducer';
|
|
8
8
|
import { getNotificationLocalOverrides } from '../notificationPreferencesViewSelector';
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
// defer saves until they pause. Consider a max-wait wrapper if this
|
|
13
|
-
// becomes a UX problem.
|
|
14
|
-
debounceTime(DEBOUNCE_MS), withLatestFrom(state$),
|
|
15
|
-
// `switchMap` unsubscribes from any in-flight PUT observable when a new
|
|
16
|
-
// debounced batch fires. The prior HTTP request has already left the
|
|
9
|
+
export const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter((action) => saveNotificationPreferences.match(action)), withLatestFrom(state$),
|
|
10
|
+
// `switchMap` unsubscribes from any in-flight PUT observable when a newer
|
|
11
|
+
// Save fires. The prior HTTP request has already left the
|
|
17
12
|
// client — the network call is NOT cancelled — but its response is
|
|
18
13
|
// ignored, so stale success/failure actions cannot clobber the newer
|
|
19
14
|
// batch's state. Server-side ordering is arrival-order LWW.
|
|
@@ -48,7 +43,7 @@ switchMap(([, state]) => {
|
|
|
48
43
|
const isCancelledSince = () => cancelEpochAtDispatch <
|
|
49
44
|
state$.value.notificationPreferencesViewState.cancelEpoch;
|
|
50
45
|
// Abort the in-flight HTTP request when `switchMap` disposes this
|
|
51
|
-
// observable (
|
|
46
|
+
// observable (a newer Save fires, tenant switch, unmount).
|
|
52
47
|
// Without an AbortSignal, `switchMap` would drop the response
|
|
53
48
|
// client-side but the older PUT would still land on the server —
|
|
54
49
|
// under patch-semantic LWW, a slower older PUT arriving after a
|
|
@@ -74,7 +69,7 @@ switchMap(([, state]) => {
|
|
|
74
69
|
];
|
|
75
70
|
if (!isCancelledSince()) {
|
|
76
71
|
// Surface a user-visible error — without it the UI reverts to
|
|
77
|
-
// server truth after
|
|
72
|
+
// server truth after the save and the failed toggle looks like
|
|
78
73
|
// a mystery UI bug.
|
|
79
74
|
actions.push(errorSnackbar);
|
|
80
75
|
}
|
|
@@ -110,7 +105,9 @@ switchMap(([, state]) => {
|
|
|
110
105
|
// under patch-semantic LWW. Cursor Bugbot 3637969823 + 3641372002.
|
|
111
106
|
takeUntil(actions$.pipe(filter((action) => clearNotificationPreferencesLocalOverrides.match(action) ||
|
|
112
107
|
clearAllNotificationPreferencesView.match(action)))));
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
|
|
108
|
+
// `saveNotificationPreferences` (the trigger) already flipped
|
|
109
|
+
// savePreferencesState to In-Progress via its reducer case, so the PUT
|
|
110
|
+
// observable is returned directly — re-emitting the trigger here would
|
|
111
|
+
// loop the epic on itself.
|
|
112
|
+
return request$;
|
|
116
113
|
}));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toNotificationChannel, toNotificationFrequency, } from '../../entity/notificationRegistry/notificationRegistryState';
|
|
2
|
-
const
|
|
2
|
+
const mapChannelEnabledMap = (raw) => {
|
|
3
3
|
if (raw == null) {
|
|
4
4
|
return {};
|
|
5
5
|
}
|
|
@@ -20,7 +20,8 @@ export const mapPayloadToPreferences = (payload) => {
|
|
|
20
20
|
toNotificationFrequency(frequency),
|
|
21
21
|
]));
|
|
22
22
|
return {
|
|
23
|
-
eventEnabledByChannel:
|
|
23
|
+
eventEnabledByChannel: mapChannelEnabledMap(payload?.event_enabled_by_channel),
|
|
24
|
+
groupChannelEnabledByGroupId: mapChannelEnabledMap(payload?.group_channel_enabled_by_group_id),
|
|
24
25
|
groupFrequencyByGroupId,
|
|
25
26
|
};
|
|
26
27
|
};
|
|
@@ -29,6 +30,10 @@ export const mapPreferencesToPayload = (preferences) => {
|
|
|
29
30
|
if (Object.keys(preferences.eventEnabledByChannel).length > 0) {
|
|
30
31
|
payload.event_enabled_by_channel = preferences.eventEnabledByChannel;
|
|
31
32
|
}
|
|
33
|
+
if (Object.keys(preferences.groupChannelEnabledByGroupId).length > 0) {
|
|
34
|
+
payload.group_channel_enabled_by_group_id =
|
|
35
|
+
preferences.groupChannelEnabledByGroupId;
|
|
36
|
+
}
|
|
32
37
|
if (Object.keys(preferences.groupFrequencyByGroupId).length > 0) {
|
|
33
38
|
payload.group_frequency_by_group_id = preferences.groupFrequencyByGroupId;
|
|
34
39
|
}
|
|
@@ -18,8 +18,18 @@ const mergePreferences = (base, patch) => {
|
|
|
18
18
|
...channels,
|
|
19
19
|
};
|
|
20
20
|
});
|
|
21
|
+
const groupChannelEnabledByGroupId = {
|
|
22
|
+
...base.groupChannelEnabledByGroupId,
|
|
23
|
+
};
|
|
24
|
+
Object.entries(patch.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
|
|
25
|
+
groupChannelEnabledByGroupId[groupId] = {
|
|
26
|
+
...(base.groupChannelEnabledByGroupId[groupId] ?? {}),
|
|
27
|
+
...channels,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
21
30
|
return {
|
|
22
31
|
eventEnabledByChannel,
|
|
32
|
+
groupChannelEnabledByGroupId,
|
|
23
33
|
groupFrequencyByGroupId: {
|
|
24
34
|
...base.groupFrequencyByGroupId,
|
|
25
35
|
...patch.groupFrequencyByGroupId,
|
|
@@ -30,16 +40,16 @@ const mergePreferences = (base, patch) => {
|
|
|
30
40
|
// to the server from `localOverrides` — AND whose current value still equals
|
|
31
41
|
// what was saved. Any new edits the user added while the PUT was in flight
|
|
32
42
|
// (either new keys not present in `saved`, OR same keys the user flipped back
|
|
33
|
-
// to a different value) are preserved so the next
|
|
43
|
+
// to a different value) are preserved so the next Save picks them up.
|
|
34
44
|
//
|
|
35
45
|
// Presence-only subtraction (the prior implementation) silently dropped a
|
|
36
|
-
// same-key re-edit that landed AFTER
|
|
46
|
+
// same-key re-edit that landed AFTER a Save fired but BEFORE the response
|
|
37
47
|
// returned. Concrete case:
|
|
38
48
|
// 1. toggle evt1.email = false → localOverrides = {evt1:{email:false}}
|
|
39
|
-
// 2.
|
|
49
|
+
// 2. Save → PUT #1 fires with savedOverrides = {evt1:{email:false}}
|
|
40
50
|
// 3. user re-toggles evt1.email = true → localOverrides = {evt1:{email:true}}
|
|
41
51
|
// 4. PUT #1 success → subtract dropped `email` on presence, so the true
|
|
42
|
-
// re-edit disappeared and next
|
|
52
|
+
// re-edit disappeared and the next Save found nothing to send.
|
|
43
53
|
const subtractSavedOverrides = (current, saved) => {
|
|
44
54
|
const eventEnabledByChannel = {};
|
|
45
55
|
Object.entries(current.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
@@ -61,13 +71,38 @@ const subtractSavedOverrides = (current, saved) => {
|
|
|
61
71
|
eventEnabledByChannel[eventId] = remainingChannels;
|
|
62
72
|
}
|
|
63
73
|
});
|
|
74
|
+
// Same value-equality subtraction as eventEnabledByChannel above — a
|
|
75
|
+
// group-channel master the user re-flipped while a PUT was in flight must
|
|
76
|
+
// survive so the next Save re-sends it.
|
|
77
|
+
const groupChannelEnabledByGroupId = {};
|
|
78
|
+
Object.entries(current.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
|
|
79
|
+
const savedChannels = saved.groupChannelEnabledByGroupId[groupId];
|
|
80
|
+
if (savedChannels == null) {
|
|
81
|
+
groupChannelEnabledByGroupId[groupId] = channels;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const remainingChannels = {};
|
|
85
|
+
Object.keys(channels).forEach((channel) => {
|
|
86
|
+
if (!(channel in savedChannels) ||
|
|
87
|
+
channels[channel] !== savedChannels[channel]) {
|
|
88
|
+
remainingChannels[channel] = channels[channel];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
if (Object.keys(remainingChannels).length > 0) {
|
|
92
|
+
groupChannelEnabledByGroupId[groupId] = remainingChannels;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
64
95
|
const groupFrequencyByGroupId = {};
|
|
65
96
|
Object.entries(current.groupFrequencyByGroupId).forEach(([groupId, frequency]) => {
|
|
66
97
|
if (saved.groupFrequencyByGroupId[groupId] !== frequency) {
|
|
67
98
|
groupFrequencyByGroupId[groupId] = frequency;
|
|
68
99
|
}
|
|
69
100
|
});
|
|
70
|
-
return {
|
|
101
|
+
return {
|
|
102
|
+
eventEnabledByChannel,
|
|
103
|
+
groupChannelEnabledByGroupId,
|
|
104
|
+
groupFrequencyByGroupId,
|
|
105
|
+
};
|
|
71
106
|
};
|
|
72
107
|
const notificationPreferencesView = createSlice({
|
|
73
108
|
name: 'notificationPreferencesView',
|
|
@@ -123,8 +158,8 @@ const notificationPreferencesView = createSlice({
|
|
|
123
158
|
// snapshot of the server-known preferences (empty maps included), so
|
|
124
159
|
// REPLACE `preferences` rather than merging — merging would leak keys
|
|
125
160
|
// the server has since removed. DO NOT touch `localOverrides`: a refetch
|
|
126
|
-
// that fires while the user has
|
|
127
|
-
//
|
|
161
|
+
// that fires while the user has unsaved edits must not silently drop
|
|
162
|
+
// them; the save-success path is the only clearer.
|
|
128
163
|
// A `null`/`undefined` payload isn't a snapshot at all (e.g. the
|
|
129
164
|
// envelope key was omitted); no-op instead of wiping preferences.
|
|
130
165
|
if (action.payload.preferences == null) {
|
|
@@ -177,8 +212,8 @@ const notificationPreferencesView = createSlice({
|
|
|
177
212
|
// In-flight-edit invariant: `savedOverrides` is the exact snapshot the
|
|
178
213
|
// epic PUT to the server. Subtracting those keys from `localOverrides`
|
|
179
214
|
// (instead of clearing it wholesale) preserves any edits the user
|
|
180
|
-
// added AFTER the
|
|
181
|
-
// next
|
|
215
|
+
// added AFTER the Save fired but BEFORE the response landed. The
|
|
216
|
+
// next Save will pick them up. Clearing wholesale drops
|
|
182
217
|
// in-flight edits from both UI (once server echo lands) and server.
|
|
183
218
|
// Cancel/in-flight-save race: `cancelEpoch` monotonically increases
|
|
184
219
|
// on every Cancel. If the save captured a lower epoch at dispatch,
|
|
@@ -204,6 +239,16 @@ const notificationPreferencesView = createSlice({
|
|
|
204
239
|
draft.preferences = mergePreferences(draft.preferences, patch);
|
|
205
240
|
draft.localOverrides = subtractSavedOverrides(draft.localOverrides, action.payload.savedOverrides);
|
|
206
241
|
},
|
|
242
|
+
setGroupChannelMaster(draft, action) {
|
|
243
|
+
// Mirror of `toggleEventChannel` but scoped to the group-channel master
|
|
244
|
+
// held under `groupChannelEnabledByGroupId[groupId][channel]`.
|
|
245
|
+
const { channel, enabled, groupId } = action.payload;
|
|
246
|
+
const groupMap = {
|
|
247
|
+
...(draft.localOverrides.groupChannelEnabledByGroupId[groupId] ?? {}),
|
|
248
|
+
};
|
|
249
|
+
groupMap[channel] = enabled;
|
|
250
|
+
draft.localOverrides.groupChannelEnabledByGroupId[groupId] = groupMap;
|
|
251
|
+
},
|
|
207
252
|
setGroupFrequency(draft, action) {
|
|
208
253
|
draft.localOverrides.groupFrequencyByGroupId[action.payload.groupId] =
|
|
209
254
|
action.payload.frequency;
|
|
@@ -218,5 +263,5 @@ const notificationPreferencesView = createSlice({
|
|
|
218
263
|
},
|
|
219
264
|
},
|
|
220
265
|
});
|
|
221
|
-
export const { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, fetchNotificationPreferencesSuccess, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupFrequency, toggleEventChannel, } = notificationPreferencesView.actions;
|
|
266
|
+
export const { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, fetchNotificationPreferencesSuccess, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, } = notificationPreferencesView.actions;
|
|
222
267
|
export default notificationPreferencesView.reducer;
|
|
@@ -1,25 +1,35 @@
|
|
|
1
|
+
import { createSelector } from '@reduxjs/toolkit';
|
|
1
2
|
const getView = (state) => state.notificationPreferencesViewState;
|
|
2
3
|
export const getNotificationPreferencesSaveState = (state) => getView(state).savePreferencesState;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
// Memoised on `preferences` + `localOverrides` so the merged shape keeps a
|
|
5
|
+
// stable reference while neither input changes — a plain function would
|
|
6
|
+
// allocate a fresh object on every call and re-render every `useSelector`
|
|
7
|
+
// consumer on any unrelated dispatch.
|
|
8
|
+
export const getEffectiveNotificationPreferences = createSelector((state) => getView(state).preferences, (state) => getView(state).localOverrides, (preferences, localOverrides) => {
|
|
9
|
+
const mergedEventEnabledByChannel = { ...preferences.eventEnabledByChannel };
|
|
10
|
+
Object.entries(localOverrides.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
7
11
|
mergedEventEnabledByChannel[eventId] = {
|
|
8
|
-
...(
|
|
12
|
+
...(preferences.eventEnabledByChannel[eventId] ?? {}),
|
|
13
|
+
...channels,
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
const mergedGroupChannelEnabledByGroupId = { ...preferences.groupChannelEnabledByGroupId };
|
|
17
|
+
Object.entries(localOverrides.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
|
|
18
|
+
mergedGroupChannelEnabledByGroupId[groupId] = {
|
|
19
|
+
...(preferences.groupChannelEnabledByGroupId[groupId] ?? {}),
|
|
9
20
|
...channels,
|
|
10
21
|
};
|
|
11
22
|
});
|
|
12
23
|
return {
|
|
13
24
|
eventEnabledByChannel: mergedEventEnabledByChannel,
|
|
25
|
+
groupChannelEnabledByGroupId: mergedGroupChannelEnabledByGroupId,
|
|
14
26
|
groupFrequencyByGroupId: {
|
|
15
|
-
...
|
|
16
|
-
...
|
|
27
|
+
...preferences.groupFrequencyByGroupId,
|
|
28
|
+
...localOverrides.groupFrequencyByGroupId,
|
|
17
29
|
},
|
|
18
30
|
};
|
|
19
|
-
};
|
|
31
|
+
});
|
|
20
32
|
export const getNotificationLocalOverrides = (state) => getView(state).localOverrides;
|
|
21
|
-
export const hasUnsavedNotificationPreferences = (state) =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Object.keys(overrides.groupFrequencyByGroupId).length > 0);
|
|
25
|
-
};
|
|
33
|
+
export const hasUnsavedNotificationPreferences = createSelector((state) => getView(state).localOverrides, (localOverrides) => Object.keys(localOverrides.eventEnabledByChannel).length > 0 ||
|
|
34
|
+
Object.keys(localOverrides.groupChannelEnabledByGroupId).length > 0 ||
|
|
35
|
+
Object.keys(localOverrides.groupFrequencyByGroupId).length > 0);
|
package/lib/index.d.ts
CHANGED
|
@@ -337,7 +337,7 @@ import { fetchNetBurnOrIncomeStoryCard, updateNetBurnOrIncomeStoryCardSettings }
|
|
|
337
337
|
import { getNetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelector';
|
|
338
338
|
import { AccountingMethod, NetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelectorTypes';
|
|
339
339
|
import { AverageMonthsCount, NetBurnOrIncomeRunway, NetBurnOrIncomeStoryCardState, TimeSpanIdForAverage } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardState';
|
|
340
|
-
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
|
|
340
|
+
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
|
|
341
341
|
import { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, hasUnsavedNotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewSelector';
|
|
342
342
|
import { NotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewState';
|
|
343
343
|
import { fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, fetchNotificationView, updateNotificationViewAllNotificationsStatus, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewNotificationStatus, updateNotificationViewSubTab, updateNotificationViewTabState, updateNotificationViewUIState } from './view/notificationView/notificationViewReducer';
|
|
@@ -908,7 +908,7 @@ export { ExternalNotificationData, NotificationGroup, NotificationActivityType,
|
|
|
908
908
|
export { NotificationView, NotificationViewUIState, NotificationTabState, NotificationTabType, NotificationSubTabType, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict, fetchNotificationView, fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, updateNotificationViewAllNotificationsStatus, updateNotificationViewNotificationStatus, updateNotificationViewTabState, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewSubTab, updateNotificationViewUIState, getNotificationView, getExternalNotificationsForSelectedSubTab, getNotificationsForSelectedSubTab, };
|
|
909
909
|
export { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature, getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, FeatureInterest, FeatureNotificationViewState, };
|
|
910
910
|
export { pushToastNotification, ToastNotification, ToastNotificationPayload, getLastNotificationTime, getNotifications, };
|
|
911
|
-
export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, NotificationChannel, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
|
|
911
|
+
export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, NotificationChannel, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, setGroupChannelMaster, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
|
|
912
912
|
export { getReferralListView, getInviteFormView, ReferralListSelectorView, ReferralViewState, InviteCompanyLocalData, ReferralInvitation, ReferralListViewSortKey, ReferralViewUIState, toReferralListViewSortKeyType, ReferralStatus, ReferralAmountStatus, StatusTypes, AmountStatusTypes, DEFAULT_REFERRER_AMOUNT, fetchReferrals, sendReferralInvite, clearReferrals, saveReferralFormDataInLocalStore, updateReferralListSortUiState, resendReferralInvite, fetchRewardsPlan, RewardsPlanCardReport, getRewardsPlanCard, updateReferViewed, RewardsPlanData, };
|
|
913
913
|
export { ALL_WEEK_DAYS, DayOfWeek, RecurringDatePickerOptions, RecurringFrequencyType, SEMI_WEEKLY_REQUIRED_DAYS_COUNT, getMinAllowedEndDate, getRecurringEndDateFromCount, toDayOfWeek, toRecurringFrequency, };
|
|
914
914
|
export { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, CompanyTaskManagerSelectorView, CompanyTaskManagerViewUIState, TaskManagerMetrics, getCompanyTaskManagerView, TaskWithCompanyDetail, createTaskFromTaskGroupTemplate, TaskGroupTemplate, };
|
package/lib/index.js
CHANGED
|
@@ -70,20 +70,20 @@ exports.toScheduleTypesTypeStrict = exports.toScheduleTypesType = exports.getFet
|
|
|
70
70
|
exports.fetchGlobalMerchantRecommendation = exports.getVendorDetailSelectorView = exports.saveVendorDetailsView = exports.updateReviewVendorDetailLocalData = exports.clearGlobalMerchantAutoCompleteResults = exports.fetchGlobalMerchantAutoCompleteView = exports.updateVendorFirstReviewSortUiState = exports.updateVendorFirstReviewViewLocalData = exports.saveVendorFirstReviewView = exports.clearRecentlySavedErroredVendorData = exports.updateVendorFirstReviewViewPageToken = exports.resetVendorFirstReviewLocalData = exports.updateVendorFirstReviewViewScrollYOffset = exports.fetchVendorFirstReviewAttachments = exports.fetchVendorFirstReviewView = exports.getVendorFirstReviewAttachmentView = exports.getVendorFirstReviewView = exports.getGlobalMerchantAutoCompleteResults = exports.toVendorFirstReviewViewColumnKeyType = exports.getVendorTabView = exports.updateVendorTabViewTab = exports.fetchVendorTabView = exports.resetMarkAsCompleteStatus = exports.markAsCompleteScheduleDetail = exports.getDefaultSelectedTimeframeForScheduleType = exports.getFetchStateForScheduleListByType = exports.updatedJELinkWithRecommendedLocalData = exports.resetJELinkInLocalData = exports.updateAmountsInScheduleDetail = exports.updatedJELinkInLocalData = exports.getThirdPartyIDFromQBOURL = exports.getQBOUrlForLink = exports.updatedSelectedJELinkRowIndex = exports.updateAccruedJEScheduleAccruedByListKey = exports.updateScheduleListDownloadState = exports.updateScheduleDetailsLocalData = exports.createNewSchedules = exports.deleteScheduleDetail = exports.saveScheduleDetails = exports.fetchScheduleDetailsPage = exports.getAccruedScheduleDetailsView = exports.getScheduleDetailsView = exports.fetchScheduleDetails = exports.updateSelectedJEScheduleKey = exports.updateScheduleListSortState = exports.updateScheduleListScrollState = exports.updateScheduleListSearchText = exports.updateScheduleListSubTab = exports.toScheduleSubTabType = exports.toScheduleListTabsFileTypeStrict = void 0;
|
|
71
71
|
exports.deleteTaskGroup = exports.initiateTaskListLocalData = exports.createNewTaskGroup = exports.bulkUpdateTaskList = exports.discardTaskUpdatesInLocalStore = exports.deleteTask = exports.TASK_LIST_GROUP_BY_CATEGORIES = exports.TASK_LIST_FILTER_CATEGORIES = exports.updateTaskFilters = exports.allTaskPriority = exports.allTaskStatus = exports.updateTaskListUIState = exports.updateTaskListSearchText = exports.getCannedResponsesView = exports.deleteCannedResponse = exports.saveCannedResponse = exports.fetchCannedResponses = exports.archiveTask = exports.fetchSubTasks = exports.resetSubTaskCreateStatus = exports.createSubTask = exports.saveTaskDetail = exports.saveTaskUpdatesToLocalStore = exports.fetchTaskDetailPage = exports.getTaskDetail = exports.fetchTaskListPage = exports.getAllTasks = exports.getTaskGroupById = exports.toRecurringBillFrequencyStrict = exports.toRecurringBillFrequency = exports.updateArAgingNodeCollapseState = exports.getArAgingDetailForCustomer = exports.getArAgingReport = exports.updateArAgingDetailUIState = exports.fetchArAgingDetail = exports.updateArAgingUIState = exports.fetchArAging = exports.updateVendorGlobalReviewViewLocalData = exports.toVendorGlobalReviewColumnSortKeyType = exports.getTenantMerchantByMerchantId = exports.getVendorGlobalReviewView = exports.updateVendorGlobalReviewViewUIState = exports.updateSelectedGlobalMerchant = exports.fetchVendorGlobalReviewView = exports.rejectVendorGlobalReview = exports.approveVendorGlobalReview = exports.getGlobalMerchantView = exports.clearGlobalMerchantView = exports.updateCreateGlobalMerchantLocalData = exports.createGlobalMerchant = void 0;
|
|
72
72
|
exports.getZeniOAuthApproveRedirectUrl = exports.getZeniOAuthApproveFetchState = exports.getZeniOAuthApproveError = exports.clearZeniOAuthView = exports.approveOAuthConsentSuccess = exports.approveOAuthConsentFailure = exports.approveOAuthConsent = exports.fetchZeniAccountsPromoCard = exports.getZeniAccountsPromoCard = exports.getAuthenticationView = exports.fetchCollaborationAuthToken = exports.clearAuditReportGroupViewByCompanyId = exports.saveReasonForAuditRule = exports.fetchAuditReportGroupView = exports.fetchAuditRuleGroupView = exports.getUserFromAllUsers = exports.getAuditRuleGroupViewSelectorView = exports.getAuditReportGroupViewSelectorView = exports.clearCardPaymentView = exports.resetCardPaymentErrorStatuses = exports.fetchPaymentSources = exports.addCardPaymentSource = exports.confirmCardSetupIntent = exports.createCardSetupIntent = exports.getAllCardsAndBankPaymentMethods = exports.deleteTag = exports.createTag = exports.fetchTagList = exports.getAllTags = exports.ALL_TASK_LIST_TABS = exports.initialTaskDetailLocalData = exports.convertHHMMStrToMinutes = exports.unsnoozeTask = exports.snoozeTask = exports.removeTaskFromList = exports.updateTaskListTab = exports.updateTaskFromListView = exports.toDueDateGroupKeyType = exports.toTaskStatusCodeType = exports.toPriorityCodeType = exports.getDueDateValueFromDueDateGroupId = exports.initialTaskDetail = exports.fetchAllTaskGroups = exports.sortSubtasks = exports.getTaskUpdates = exports.toTaskListGroupByKeyTypeStrict = exports.toTaskListGroupByKeyType = exports.updateTaskGroupName = exports.dragNDropTasks = exports.updateTaskListLocalData = void 0;
|
|
73
|
-
exports.
|
|
74
|
-
exports.
|
|
75
|
-
exports.
|
|
76
|
-
exports.
|
|
77
|
-
exports.
|
|
78
|
-
exports.
|
|
79
|
-
exports.
|
|
80
|
-
exports.
|
|
81
|
-
exports.
|
|
82
|
-
exports.
|
|
83
|
-
exports.
|
|
84
|
-
exports.
|
|
85
|
-
exports.
|
|
86
|
-
exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = exports.clearInvoicingConfig = exports.acceptInvoicingTerms = exports.isStripeConnectedFromSettings = exports.initialInvoicingBrandingFormLocalData = exports.entityToInvoicingBrandingFormLocalData = exports.INVOICING_BUSINESS_ADDRESS_TYPE = exports.getInvoicingSettingsView = exports.getInvoicingSettingsFetchState = exports.getInvoicingSettings = exports.getInvoicingBrandingFormView = exports.updateInvoicingSettings = exports.updateInvoicingBrandingFormDraft = exports.submitInvoicingBrandingForm = exports.saveInvoicingSettings = exports.resetSaveInvoicingSettings = exports.resetInvoicingBrandingFormDraft = exports.fetchInvoicingSettings = exports.disconnectInvoicingStripe = void 0;
|
|
73
|
+
exports.clearReferrals = exports.sendReferralInvite = exports.fetchReferrals = exports.DEFAULT_REFERRER_AMOUNT = exports.AmountStatusTypes = exports.StatusTypes = exports.toReferralListViewSortKeyType = exports.getInviteFormView = exports.getReferralListView = exports.toNotificationFrequency = exports.toNotificationChannel = exports.toggleEventChannel = exports.setGroupFrequency = exports.setGroupChannelMaster = exports.saveNotificationPreferences = exports.clearNotificationPreferencesLocalOverrides = exports.clearAllNotificationPreferencesView = exports.hasUnsavedNotificationPreferences = exports.getNotificationRegistry = exports.getNotificationPreferencesSaveState = exports.getNotificationLocalOverrides = exports.getEffectiveNotificationPreferences = exports.getNotifications = exports.getLastNotificationTime = exports.pushToastNotification = exports.isFeatureInterestRegistered = exports.getRegisteredInterestsByFeature = exports.getRegisteredInterests = exports.getFeatureNotificationView = exports.notifyMeForFeature = exports.fetchRegisteredInterests = exports.clearFeatureNotificationView = exports.getNotificationsForSelectedSubTab = exports.getExternalNotificationsForSelectedSubTab = exports.getNotificationView = exports.updateNotificationViewUIState = exports.updateNotificationViewSubTab = exports.updateNotificationViewCurrentTabAndSubTab = exports.updateNotificationViewTabState = exports.updateNotificationViewNotificationStatus = exports.updateNotificationViewAllNotificationsStatus = exports.fetchNotificationUnreadCountSuccess = exports.fetchNotificationUnreadCount = exports.fetchNotificationView = exports.toNotificationTabTypeStrict = exports.toNotificationSubTabTypeStrict = exports.updateCommentsNotificationsStatuses = exports.updateCommentsNotifications = exports.toNotificationModeStrict = exports.parseOAuthParams = void 0;
|
|
74
|
+
exports.getAiAccountantCustomers = exports.updateAiAccountantJobs = exports.updateAiAccountantCustomer = exports.updateAiAccountantCustomers = exports.clearAllAiAccountantCustomers = exports.toAiAccountantJob = exports.toAiAccountantEnrollment = exports.toAiAccountantCustomer = exports.toAiAccountantOperationType = exports.toAiAccountantJobStatus = exports.toAiAccountantEnrollmentStatus = exports.getAllowedOperationsForStatus = exports.getTreasuryFundsMaximumYield = exports.getTreasurySetupViewDetails = exports.updateTreasuryVideoViewed = exports.updateTreasuryPromoRemindMeLaterClicked = exports.updateTreasuryPromoIntroClosedByOutsideClick = exports.updateFundAllocationLocalData = exports.fetchPortfolioAllocation = exports.updatePortfolioAllocation = exports.fetchTreasuryFunds = exports.clearTreasurySetupView = exports.fetchTreasurySetupView = exports.acceptTreasuryTerms = exports.getExpressPayView = exports.resetExpressPayLocalData = exports.submitExpressPay = exports.updateExpressPayFormLocalData = exports.fetchExpressPayInitialDetails = exports.getIntlWireVerificationView = exports.updateVerificationFormLocalData = exports.submitInternationalVerificationForm = exports.fetchInternationalVerificationForm = exports.createTaskFromTaskGroupTemplate = exports.getCompanyTaskManagerView = exports.fetchTaskManagerMetrics = exports.fetchCompanyTaskManagerView = exports.fetchCockpitContext = exports.toRecurringFrequency = exports.toDayOfWeek = exports.getRecurringEndDateFromCount = exports.getMinAllowedEndDate = exports.SEMI_WEEKLY_REQUIRED_DAYS_COUNT = exports.ALL_WEEK_DAYS = exports.updateReferViewed = exports.getRewardsPlanCard = exports.fetchRewardsPlan = exports.resendReferralInvite = exports.updateReferralListSortUiState = exports.saveReferralFormDataInLocalStore = void 0;
|
|
75
|
+
exports.appendSyntheticAiCfoAnswer = exports.toAiCfoVisualization = exports.clearAiCfo = exports.clearSession = exports.addQuestionPayload = exports.upsertOrAddQuestionAnswerPayload = exports.upsertAnswerPayload = exports.updateAiCfoAnswerCardPolicyWizardPlan = exports.setSessions = exports.setNewSession = exports.getSkills = exports.getSuggestedQuestionsForPageContext = exports.getAiCfoView = exports.clearAiCfoSidePanelHostPageContext = exports.applyAiCfoSidePanelHostPageTransition = exports.fetchSkillsFailure = exports.fetchSkillsSuccess = exports.fetchSkills = exports.fetchSuggestedQuestionsFailure = exports.fetchSuggestedQuestionsSuccess = exports.fetchSuggestedQuestions = exports.updateResponseState = exports.submitFeedback = exports.deleteChatSession = exports.acceptMasterTOS = exports.fetchChatHistory = exports.stopSubmitQuestion = exports.stopSubmit = exports.createSessionAndSubmit = exports.clearLastContextMessage = exports.clearDeleteChatSessionStatus = exports.clearCurrentSessionId = exports.clearAiCfoView = exports.setSession = exports.clearInput = exports.updateCotCollapsedState = exports.updateCurrentInput = exports.updateAiCfoViewScrollPosition = exports.submitQuestion = exports.createSession = exports.fetchChatSessionsForUser = exports.getAiAccountantCockpitView = exports.updateAiAccountantUIState = exports.triggerAiAccountantJob = exports.setSelectedTenantIdsForJobTrigger = exports.fetchAiAccountantJobs = exports.fetchAiAccountantCustomers = exports.clearAiAccountantView = exports.cancelAiAccountantOnboarding = exports.getAiAccountantJobsByTenantId = void 0;
|
|
76
|
+
exports.getCardPolicyStats = exports.getCardPolicyMccCategoriesFetchState = exports.getCardPolicyMccCategoriesError = exports.getCardPolicyMccCategories = exports.getAllCardPolicyTemplates = exports.clearCardPolicy = exports.updatePolicyRecommendationFromUploadSuccess = exports.updatePolicyRecommendationFromUploadFailure = exports.updatePolicyDocumentExtractionSuccess = exports.updatePolicyDocumentExtractionFailure = exports.updateCreatedCardPolicyTemplate = exports.updateCardPolicyVendorOptionsFailure = exports.updateCardPolicyVendorOptions = exports.updateCardPolicyTemplates = exports.updateCardPolicyStats = exports.updateCardPolicyMccCategoriesFailure = exports.updateCardPolicyMccCategories = exports.removeCardPolicyTemplate = exports.fetchCardPolicyVendorOptions = exports.fetchCardPolicyRecommendationFromUpload = exports.fetchCardPolicyMccCategories = exports.extractPolicyDocument = exports.clearPolicyDocumentExtraction = exports.toMessageType = exports.toMessageSender = exports.ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS = exports.toInteractiveFormTypeStrict = exports.toInteractiveFormType = exports.toAiCfoAnswerResponseTypeStrict = exports.toAiCfoAnswerResponseType = exports.toAiCfoAnswerStateTypeStrict = exports.toAiCfoAnswerStateType = exports.toAiCfoChartTypeStrict = exports.toAiCfoChartType = exports.toAiCfoVisualizationTypeStrict = exports.toAiCfoVisualizationType = exports.ALL_INTERACTIVE_FORM_TYPES = exports.ALL_AI_CFO_ANSWER_RESPONSE_TYPES = exports.ALL_AI_CFO_ANSWER_STATE_TYPES = exports.ALL_AI_CFO_VISUALIZATION_TYPES = exports.ALL_AI_CFO_CHARTS_TYPES = exports.getSyntheticAiCfoAnswerByQuestionAnswerId = exports.getSyntheticAiCfoAnswersForChatSession = exports.getAiCfoSelectorView = exports.getAllQuestionsForChatSession = exports.getQuestionAnswerByIdForChatSession = exports.getAllQuestionAnswersForChatSession = exports.clearSyntheticAiCfoAnswers = exports.removeSyntheticAiCfoAnswer = exports.updateSyntheticAiCfoAnswer = void 0;
|
|
77
|
+
exports.getManualCardPolicyFormDraft = exports.getLastCreatedCardPolicyTemplateIds = exports.getLastCreatedCardPolicyTemplateId = exports.getLastCreateCardPolicyTemplateErrors = exports.getLastCreateCardPolicySourceChatSessionId = exports.getCreateCardPolicyTemplateRequestState = exports.getAiCardPolicyFormDraft = exports.updateManualCardPolicyFormDraft = exports.updateCreateCardPolicyTemplateRequestState = exports.updateAiCardPolicyFormDraftFromUploadPlan = exports.updateAiCardPolicyFormDraft = exports.seedManualCardPolicyFormDraft = exports.seedAiCardPolicyFormDraft = exports.createCardPolicyTemplates = exports.clearManualCardPolicyFormDraft = exports.clearCreateCardPolicy = exports.clearAiCardPolicyFormDraft = exports.applyExtractedPolicyToManualCardPolicyDraft = exports.applyExtractedPolicyToAiCardPolicyDraft = exports.toUpdateCardPolicyTemplateRequestBody = exports.toExtractedCardPolicyRules = exports.toCreateCardPolicyTemplatesRequestBody = exports.toCreateCardPolicyTemplateRequestBody = exports.toCardPolicyVendorSearchOption = exports.toCardPolicyTemplateList = exports.toCardPolicyTemplate = exports.toCardPolicyStats = exports.toCardPolicyEditFormDraft = exports.toBulkCreateCardPolicyTemplateError = exports.toCardPolicyTemplateStatus = exports.toCardPolicyTemplateMode = exports.ALL_CARD_POLICY_TEMPLATE_STATUSES = exports.ALL_CARD_POLICY_TEMPLATE_MODES = exports.getUploadedPolicyDocumentFileName = exports.getPolicyRecommendationFromUploadFetchState = exports.getPolicyRecommendationFromUploadError = exports.getPolicyRecommendationFromUploadChatSessionId = exports.getPolicyRecommendationFromUploadAnswerId = exports.getPolicyDocumentExtractionFetchState = exports.getPolicyDocumentExtractionError = exports.getExtractedCardPolicyRules = exports.getCardPolicyVendorSearchString = exports.getCardPolicyVendorSearchOptions = exports.getCardPolicyVendorSearchFetchState = exports.getCardPolicyTemplatesByIds = exports.getCardPolicyTemplateById = exports.getCardPolicySuggestedBlockMerchants = exports.getCardPolicySuggestedBlockCategories = exports.getCardPolicySuggestedAllowMerchants = exports.getCardPolicySuggestedAllowCategories = void 0;
|
|
78
|
+
exports.getTreasuryTaxLetters = exports.fetchTreasuryTaxLetterList = exports.getTreasuryStatements = exports.fetchTreasuryStatementList = exports.getTreasuryTransferMoney = exports.clearTreasuryTransferMoney = exports.updateTreasuryTransferMoneyLocalData = exports.executeTreasuryTransferMoney = exports.getTreasuryDetail = exports.updateTreasuryTransactionListUIState = exports.fetchTreasuryTransactionList = exports.fetchTreasuryOverviewDetail = exports.getUpdateCardPolicyFetchState = exports.getCardPolicyFormDraft = exports.getCardPolicyDetailView = exports.getCardPolicyDetailFetchState = exports.updateCardPolicyFormDraft = exports.updateCardPolicyFetchStatus = exports.updateCardPolicyDetailFetchStatus = exports.updateCardPolicy = exports.fetchCardPolicyDetail = exports.clearCardPolicyDetail = exports.getCardPolicyTemplateIds = exports.getCardPolicyListView = exports.getCardPolicyListFetchState = exports.getArchiveCardPolicyFetchState = exports.updateCardPolicyListFetchStatus = exports.updateArchiveCardPolicyFetchStatus = exports.prependCardPolicyTemplateIds = exports.fetchCardPolicyList = exports.clearCardPolicyList = exports.archiveCardPolicy = exports.toManualCardPolicyTemplateRequestFromDraft = exports.toBulkCardPolicyTemplateRequestsFromDraft = exports.toCardPolicyTemplateRequestFromDraft = exports.applyAiCardPolicyFormDraftUpdate = exports.deriveAiPolicyReviewRowsFromInputs = exports.buildManualCardPolicyFormDraftSeed = exports.buildUploadReviewRows = exports.buildEmptyLimitRows = exports.buildAiCardPolicyFormDraftSeed = exports.toVendorChipFieldValue = exports.toMccCategoryChipFieldValue = exports.buildVendorChipId = exports.buildMccCategoryChipId = exports.VENDOR_CHIP_ID_PREFIX = exports.MCC_CHIP_ID_PREFIX = exports.toMccCategoryLike = exports.CARD_POLICY_LIMIT_ROW_ID_TRANSACTION = exports.CARD_POLICY_LIMIT_ROW_ID_REQUIRE_RECEIPT = void 0;
|
|
79
|
+
exports.ALL_INVOICING_INVOICE_TAB_IDS = exports.updateInvoiceListFilters = exports.setInvoiceActiveTab = exports.fetchInvoiceListPage = exports.fetchInvoiceList = exports.fetchInvoiceKPIs = exports.fetchInvoiceCounts = exports.clearInvoiceList = exports.getInvoicesByIds = exports.getInvoiceById = exports.updateInvoices = exports.removeInvoice = exports.clearAllInvoices = exports.mapAuditLogEntry = exports.toAuditLogEntityRouteOption = exports.isInvoicingEntityLinkable = exports.buildInvoicingEntityPath = exports.toInvoicingDiscountLifecycleActionOption = exports.toInvoicingDiscountLifecycleAction = exports.toInvoicingCatalogProductLifecycleActionOption = exports.toInvoicingCatalogItemLifecycleActionOption = exports.toInvoicingCatalogProductLifecycleAction = exports.toInvoicingCatalogItemLifecycleAction = exports.toInvoicingSubscriptionLifecycleActionOption = exports.toInvoicingSubscriptionLifecycleAction = exports.toInvoicingDunningAction = exports.INVOICING_DISCOUNT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_PRODUCT_LIFECYCLE_ACTIONS = exports.INVOICING_CATALOG_ITEM_LIFECYCLE_ACTIONS = exports.INVOICING_SUBSCRIPTION_LIFECYCLE_ACTIONS = exports.INVOICING_DUNNING_ACTIONS = exports.toKycProvidedDocumentTypeFromAllowed = exports.toKycProvidedDocumentType = exports.DEFAULT_SESSION_CONFIG = exports.SessionManager = exports.getTransactionActivityLogView = exports.fetchTransactionActivityLog = exports.BULK_UPLOAD_BAR_COMPLETE_HOLD_MS = exports.BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS = exports.getAutoTransferRuleHistory = exports.getAutoTransferRuleById = exports.getAutoTransferRules = exports.clearRuleUpdateLocalData = exports.updateRuleLocalData = exports.fetchAutoTransferReviewDetail = exports.fetchAutoTransferRuleHistory = exports.deleteAutoTransferRule = exports.updateAutoTransferRule = exports.createAutoTransferRule = exports.fetchAutoTransferRules = void 0;
|
|
80
|
+
exports.fetchInvoicingAuditLog = exports.clearInvoicingAuditView = exports.getInvoicingOverview = exports.buildPeriodOptions = exports.fetchInvoicingOverview = exports.clearInvoicingOverview = exports.initialRecordPaymentFormLocalData = exports.INVOICING_PAYMENT_METHOD_VALUES = exports.INVOICING_PAYMENT_GATEWAY_VALUES = exports.localDataToRecordPaymentPayload = exports.localDataToInvoiceRecordPaymentBody = exports.initializeRecordPaymentDraftFromInvoice = exports.getCreateCreditNoteView = exports.getCreateCreditNoteFormView = exports.initialCreateCreditNoteFormLocalData = exports.localDataToCreateCreditNotePayload = exports.updateCreateCreditNoteFormDraft = exports.submitCreateCreditNote = exports.resetCreateCreditNote = exports.createCreditNoteSuccess = exports.createCreditNoteFailure = exports.getIssueCreditNoteView = exports.getIssueCreditNoteFormView = exports.initialIssueCreditNoteFormLocalData = exports.INVOICING_CREDIT_NOTE_REASON_CODES = exports.localDataToIssueCreditNotePayload = exports.initializeIssueCreditNoteDraftFromInvoice = exports.computeIssueCreditNoteTotal = exports.updateIssueCreditNoteFormDraft = exports.submitIssueCreditNote = exports.resetIssueCreditNote = exports.issueCreditNoteSuccess = exports.issueCreditNoteFailure = exports.initializeIssueCreditNoteDraft = exports.updateRecordPaymentFormDraft = exports.submitRecordPayment = exports.initializeRecordPaymentDraft = exports.resetRecordPayment = exports.initialInvoicingCreateInvoiceFormLocalData = exports.createInvoiceFormLocalDataToRequest = exports.blankInvoicingCreateInvoiceLineItem = exports.updateInvoicingCreateInvoiceFormDraft = exports.resetCreateInvoice = exports.fetchCreateInvoiceFormPage = exports.createInvoice = exports.getInvoiceDetail = exports.fetchInvoiceDetail = exports.clearAllInvoiceDetail = exports.getInvoiceListView = exports.INVOICING_INVOICE_TABS = void 0;
|
|
81
|
+
exports.entityToInvoicingCatalogItemFormLocalData = exports.blankInvoicingCatalogTier = exports.blankInvoicingCatalogSubFamily = exports.INVOICING_CATALOG_TYPE_VALUES = exports.INVOICING_CATALOG_TRIAL_UNIT_VALUES = exports.INVOICING_CATALOG_TRIAL_END_ACTION_VALUES = exports.INVOICING_CATALOG_TIER_TYPE_VALUES = exports.INVOICING_CATALOG_PRORATION_VALUES = exports.INVOICING_CATALOG_PRICING_MODEL_VALUES = exports.INVOICING_CATALOG_PERIOD_UNIT_VALUES = exports.INVOICING_CATALOG_APPLICABILITY_VALUES = exports.productToCreateSubFamilyFormValues = exports.planToCatalogDetailEditValues = exports.createSubFamilyFormToPayload = exports.catalogDetailEditValuesToSavePayload = exports.updateInvoicingCatalogItemFormDraft = exports.submitInvoicingCatalogItemForm = exports.saveInvoicingCatalogItem = exports.resetEditInvoicingCatalogItemDetailView = exports.createInvoicingCatalogSubFamily = exports.archiveInvoicingCatalogSubFamily = exports.getInvoicingSubscriptionFormView = exports.getEditInvoicingSubscriptionDetailViewState = exports.initialInvoicingSubscriptionFormLocalData = exports.entityToInvoicingSubscriptionFormLocalData = exports.INVOICING_SUBSCRIPTION_SHIPPING_ADDRESS_TYPE = exports.INVOICING_SUBSCRIPTION_BILLING_FREQUENCY_VALUES = exports.updateInvoicingSubscriptionFormDraft = exports.submitInvoicingSubscriptionForm = exports.resetEditInvoicingSubscriptionDetailView = exports.initializeInvoicingSubscriptionAddress = exports.fetchInvoicingSubscriptionFormPage = exports.getInvoicingCustomerFormView = exports.initialInvoicingCustomerFormLocalData = exports.entityToInvoicingCustomerFormLocalData = exports.INVOICING_TAXABILITY_VALUES = exports.INVOICING_NET_TERM_DAY_VALUES = exports.INVOICING_CUSTOMER_TYPE_VALUES = exports.INVOICING_CUSTOMER_BILLING_ADDRESS_TYPE = exports.updateInvoicingCustomerFormDraft = exports.submitInvoicingCustomerFormSuccess = exports.submitInvoicingCustomerFormFailure = exports.submitInvoicingCustomerForm = exports.resetEditInvoicingCustomerDetailView = exports.initializeInvoicingCustomerAddress = exports.getRecordPaymentView = exports.getRecordPaymentInvoiceOptions = exports.getRecordPaymentFormView = exports.getCreateInvoiceFormView = exports.getInvoicingAuditView = void 0;
|
|
82
|
+
exports.INVOICING_LIST_PAGE_SIZE = exports.getInvoicingDataImportActionState = exports.uploadInvoicingMigrationFiles = exports.startInvoicingMigration = exports.rollbackInvoicingMigration = exports.retryInvoicingMigration = exports.connectInvoicingChargebee = exports.clearAllInvoicingDataImportActions = exports.getInvoicingDataImportView = exports.setInvoicingActiveMigrationSessionId = exports.fetchInvoicingMigrationSessions = exports.fetchInvoicingMigrationSession = exports.fetchInvoicingMigrationDiagnostics = exports.fetchInvoicingDataImportStatus = exports.clearInvoicingDataImportView = exports.getInvoicingPaymentActionState = exports.runInvoicingPaymentAction = exports.clearInvoicingPaymentAction = exports.getInvoicingDunningActionState = exports.runInvoicingDunningAction = exports.clearInvoicingDunningAction = exports.getInvoicingSubscriptionActionState = exports.runInvoicingSubscriptionAction = exports.clearInvoicingSubscriptionAction = exports.getInvoicingDiscountActionState = exports.runInvoicingDiscountAction = exports.clearInvoicingDiscountAction = exports.getInvoicingCatalogActionState = exports.runInvoicingCatalogProductAction = exports.runInvoicingCatalogPlanAction = exports.clearInvoicingCatalogAction = exports.getInvoicingInvoiceActionState = exports.updateInvoicingInvoice = exports.runInvoicingInvoiceAction = exports.clearInvoicingInvoiceAction = exports.getInvoicingCouponFormView = exports.getEditInvoicingCouponDetailViewState = exports.initialInvoicingCouponFormLocalData = exports.entityToInvoicingCouponFormLocalData = exports.updateInvoicingCouponFormDraft = exports.submitInvoicingCouponForm = exports.saveInvoicingCoupon = exports.resetEditInvoicingCouponDetailView = exports.getSavedInvoicingCatalogItemKind = exports.getSavedInvoicingCatalogItemId = exports.getInvoicingCatalogItemFormView = exports.getInvoicingApplicableCatalogItemOptions = exports.getEditInvoicingCatalogItemDetailViewState = exports.isTieredCatalogPricingModel = exports.initialInvoicingCatalogItemFormLocalData = void 0;
|
|
83
|
+
exports.getInvoicingSubscriptionById = exports.fetchInvoicingSubscriptionDetail = exports.clearInvoicingSubscriptionDetailView = exports.getInvoicingSubscriptionListView = exports.INVOICING_SUBSCRIPTION_TABS = exports.INVOICING_SUBSCRIPTION_COLUMNS = exports.ALL_INVOICING_SUBSCRIPTION_TAB_IDS = exports.ALL_INVOICING_SUBSCRIPTION_SORT_KEYS = exports.updateInvoicingSubscriptionFilters = exports.setInvoicingSubscriptionActiveTab = exports.fetchInvoicingSubscriptionListPage = exports.fetchInvoicingSubscriptionList = exports.fetchInvoicingSubscriptionCounts = exports.clearInvoicingSubscriptionListView = exports.updateInvoicingSubscriptions = exports.removeInvoicingSubscription = exports.clearAllInvoicingSubscriptions = exports.resetPromotionalCreditAction = exports.submitAddPromotionalCredits = exports.getInvoicingSetupIntentFetchState = exports.getInvoicingSetupIntent = exports.getInvoicingSentPaymentLinkMagicUrl = exports.getInvoicingSentPaymentLinkEmail = exports.getInvoicingPlaidLinkTokenFetchState = exports.getInvoicingPlaidLinkToken = exports.getInvoicingPaymentMethodSaveState = exports.getInvoicingPaymentLinkSendState = exports.sendInvoicingPaymentLink = exports.saveInvoicingPaymentMethod = exports.resetInvoicingCustomerPaymentMethod = exports.fetchInvoicingPlaidLinkToken = exports.createInvoicingSetupIntent = exports.getInvoicingCustomerDetail = exports.fetchInvoicingCustomerDetailPage = exports.fetchInvoicingCustomerDetail = exports.clearInvoicingCustomerDetailView = exports.getInvoicingCustomerListView = exports.INVOICING_CUSTOMER_TABS = exports.INVOICING_CUSTOMER_COLUMNS = exports.ALL_INVOICING_CUSTOMER_TAB_IDS = exports.ALL_INVOICING_CUSTOMER_SORT_KEYS = exports.updateInvoicingCustomerFilters = exports.setInvoicingCustomerActiveTab = exports.fetchInvoicingCustomerListPage = exports.fetchInvoicingCustomerList = exports.fetchInvoicingCustomerCounts = exports.clearInvoicingCustomerListView = exports.updateInvoicingCustomers = exports.removeInvoicingCustomer = exports.clearAllInvoicingCustomers = void 0;
|
|
84
|
+
exports.getInvoicingCouponCounts = exports.INVOICING_COUPON_TABS = exports.INVOICING_COUPON_COLUMNS = exports.ALL_INVOICING_COUPON_TAB_IDS = exports.ALL_INVOICING_COUPON_SORT_KEYS = exports.updateInvoicingCouponFilters = exports.setInvoicingCouponActiveTab = exports.fetchInvoicingCouponListPage = exports.fetchInvoicingCouponList = exports.fetchInvoicingCouponCounts = exports.clearInvoicingCouponView = exports.updateInvoicingCoupons = exports.removeInvoicingCoupon = exports.clearAllInvoicingCoupons = exports.getInvoicingCreditNoteDetail = exports.getInvoicingCreditNoteById = exports.fetchInvoicingCreditNoteDetail = exports.clearInvoicingCreditNoteDetailView = exports.getInvoicingCreditNoteListView = exports.INVOICING_CREDIT_NOTE_TABS = exports.INVOICING_CREDIT_NOTE_COLUMNS = exports.ALL_INVOICING_CREDIT_NOTE_TAB_IDS = exports.ALL_INVOICING_CREDIT_NOTE_SORT_KEYS = exports.updateInvoicingCreditNoteFilters = exports.setInvoicingCreditNoteActiveTab = exports.fetchInvoicingCreditNoteListPage = exports.fetchInvoicingCreditNoteList = exports.fetchInvoicingCreditNoteCounts = exports.clearInvoicingCreditNoteListView = exports.updateInvoicingCreditNotes = exports.removeInvoicingCreditNote = exports.clearAllInvoicingCreditNotes = exports.getInvoicingTransactionDetail = exports.getInvoicingTransactionById = exports.fetchInvoicingTransactionDetail = exports.clearInvoicingTransactionDetailView = exports.getInvoicingTransactionListView = exports.INVOICING_TRANSACTION_TABS = exports.INVOICING_TRANSACTION_COLUMNS = exports.ALL_INVOICING_TRANSACTION_TAB_IDS = exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = exports.updateInvoicingTransactionFilters = exports.setInvoicingTransactionActiveTab = exports.fetchInvoicingTransactionListPage = exports.fetchInvoicingTransactionList = exports.clearInvoicingTransactionListView = exports.updateInvoicingTransactions = exports.removeInvoicingTransaction = exports.clearAllInvoicingTransactions = exports.getInvoicingSubscriptionDetail = void 0;
|
|
85
|
+
exports.getInvoicingProductById = exports.getInvoicingPlanById = exports.getInvoicingCatalogItemDetail = exports.fetchInvoicingCatalogItemDetail = exports.clearInvoicingCatalogItemDetailView = exports.getInvoicingCatalogListView = exports.INVOICING_PRODUCT_COLUMNS = exports.ALL_INVOICING_PRODUCT_SORT_KEYS = exports.updateInvoicingCatalogProductFilters = exports.updateInvoicingCatalogPlanFilters = exports.fetchInvoicingCatalogProductList = exports.fetchInvoicingCatalogPlanList = exports.fetchInvoicingCatalogListPage = exports.fetchInvoicingCatalogCounts = exports.clearInvoicingCatalogListView = exports.updateInvoicingProducts = exports.removeInvoicingProduct = exports.clearAllInvoicingProducts = exports.updateInvoicingPlans = exports.removeInvoicingPlan = exports.mergeInvoicingPlanSubFamily = exports.clearAllInvoicingPlans = exports.getInvoicingDunningCaseDetail = exports.getInvoicingDunningCaseById = exports.fetchInvoicingDunningCaseDetail = exports.clearInvoicingDunningCaseDetailView = exports.getInvoicingDunningCaseListView = exports.INVOICING_DUNNING_CASE_TABS = exports.INVOICING_DUNNING_CASE_COLUMNS = exports.ALL_INVOICING_DUNNING_CASE_TAB_IDS = exports.ALL_INVOICING_DUNNING_CASE_SORT_KEYS = exports.updateInvoicingDunningCaseFilters = exports.setInvoicingDunningCaseActiveTab = exports.fetchInvoicingDunningCaseListPage = exports.fetchInvoicingDunningCaseList = exports.fetchInvoicingDunningCaseCounts = exports.clearInvoicingDunningCaseListView = exports.updateInvoicingDunningCases = exports.removeInvoicingDunningCase = exports.clearAllInvoicingDunningCases = exports.getInvoicingCouponDetail = exports.fetchInvoicingCouponDetail = exports.clearInvoicingCouponDetailView = exports.getInvoicingCouponById = exports.getInvoicingCouponListView = exports.getInvoicingCouponListNextCursor = exports.getInvoicingCouponListItems = exports.getInvoicingCouponListHasMore = exports.getInvoicingCouponListFilters = exports.getInvoicingCouponListFetchState = void 0;
|
|
86
|
+
exports.getInvoicingConfigView = exports.updateInvoicingConfig = exports.resetInvoicingConfigActionStates = exports.fetchInvoicingConfig = exports.enableInvoicing = exports.clearInvoicingConfig = exports.acceptInvoicingTerms = exports.isStripeConnectedFromSettings = exports.initialInvoicingBrandingFormLocalData = exports.entityToInvoicingBrandingFormLocalData = exports.INVOICING_BUSINESS_ADDRESS_TYPE = exports.getInvoicingSettingsView = exports.getInvoicingSettingsFetchState = exports.getInvoicingSettings = exports.getInvoicingBrandingFormView = exports.updateInvoicingSettings = exports.updateInvoicingBrandingFormDraft = exports.submitInvoicingBrandingForm = exports.saveInvoicingSettings = exports.resetSaveInvoicingSettings = exports.resetInvoicingBrandingFormDraft = exports.fetchInvoicingSettings = exports.disconnectInvoicingStripe = exports.connectInvoicingStripe = exports.clearInvoicingSettings = void 0;
|
|
87
87
|
const allowedValue_1 = require("./commonStateTypes/allowedValue");
|
|
88
88
|
Object.defineProperty(exports, "isAllowedValueWithCode", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithCode; } });
|
|
89
89
|
Object.defineProperty(exports, "isAllowedValueWithID", { enumerable: true, get: function () { return allowedValue_1.isAllowedValueWithID; } });
|
|
@@ -1068,6 +1068,8 @@ Object.defineProperty(exports, "getNetBurnOrIncomeStoryCardReport", { enumerable
|
|
|
1068
1068
|
const notificationPreferencesViewReducer_1 = require("./view/notificationPreferencesView/notificationPreferencesViewReducer");
|
|
1069
1069
|
Object.defineProperty(exports, "clearAllNotificationPreferencesView", { enumerable: true, get: function () { return notificationPreferencesViewReducer_1.clearAllNotificationPreferencesView; } });
|
|
1070
1070
|
Object.defineProperty(exports, "clearNotificationPreferencesLocalOverrides", { enumerable: true, get: function () { return notificationPreferencesViewReducer_1.clearNotificationPreferencesLocalOverrides; } });
|
|
1071
|
+
Object.defineProperty(exports, "saveNotificationPreferences", { enumerable: true, get: function () { return notificationPreferencesViewReducer_1.saveNotificationPreferences; } });
|
|
1072
|
+
Object.defineProperty(exports, "setGroupChannelMaster", { enumerable: true, get: function () { return notificationPreferencesViewReducer_1.setGroupChannelMaster; } });
|
|
1071
1073
|
Object.defineProperty(exports, "setGroupFrequency", { enumerable: true, get: function () { return notificationPreferencesViewReducer_1.setGroupFrequency; } });
|
|
1072
1074
|
Object.defineProperty(exports, "toggleEventChannel", { enumerable: true, get: function () { return notificationPreferencesViewReducer_1.toggleEventChannel; } });
|
|
1073
1075
|
const notificationPreferencesViewSelector_1 = require("./view/notificationPreferencesView/notificationPreferencesViewSelector");
|
|
@@ -2,8 +2,8 @@ import { ActionsObservable, StateObservable } from 'redux-observable';
|
|
|
2
2
|
import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
|
|
3
3
|
import { RootState } from '../../../reducer';
|
|
4
4
|
import { ZeniAPI } from '../../../zeniAPI';
|
|
5
|
-
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess
|
|
6
|
-
export type ActionType = ReturnType<typeof clearAllNotificationPreferencesView> | ReturnType<typeof clearNotificationPreferencesLocalOverrides> | ReturnType<typeof saveNotificationPreferences> | ReturnType<typeof saveNotificationPreferencesFailure> | ReturnType<typeof saveNotificationPreferencesSuccess> | ReturnType<typeof
|
|
5
|
+
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess } from '../notificationPreferencesViewReducer';
|
|
6
|
+
export type ActionType = ReturnType<typeof clearAllNotificationPreferencesView> | ReturnType<typeof clearNotificationPreferencesLocalOverrides> | ReturnType<typeof saveNotificationPreferences> | ReturnType<typeof saveNotificationPreferencesFailure> | ReturnType<typeof saveNotificationPreferencesSuccess> | ReturnType<typeof openSnackbar>;
|
|
7
7
|
export declare const saveNotificationPreferencesEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
|
|
8
8
|
payload: undefined;
|
|
9
9
|
type: "notificationPreferencesView/clearAllNotificationPreferencesView";
|
|
@@ -31,10 +31,4 @@ export declare const saveNotificationPreferencesEpic: (actions$: ActionsObservab
|
|
|
31
31
|
} | {
|
|
32
32
|
payload: import("../notificationPreferencesViewReducer").SaveNotificationPreferencesSuccessPayload;
|
|
33
33
|
type: "notificationPreferencesView/saveNotificationPreferencesSuccess";
|
|
34
|
-
} | {
|
|
35
|
-
payload: import("../notificationPreferencesViewReducer").SetFrequencyPayload;
|
|
36
|
-
type: "notificationPreferencesView/setGroupFrequency";
|
|
37
|
-
} | {
|
|
38
|
-
payload: import("../notificationPreferencesViewReducer").TogglePreferencePayload;
|
|
39
|
-
type: "notificationPreferencesView/toggleEventChannel";
|
|
40
34
|
}>;
|
|
@@ -9,14 +9,9 @@ const notificationPreferencesEndpoint_1 = require("../notificationPreferencesEnd
|
|
|
9
9
|
const notificationPreferencesViewPayload_1 = require("../notificationPreferencesViewPayload");
|
|
10
10
|
const notificationPreferencesViewReducer_1 = require("../notificationPreferencesViewReducer");
|
|
11
11
|
const notificationPreferencesViewSelector_1 = require("../notificationPreferencesViewSelector");
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
//
|
|
15
|
-
// defer saves until they pause. Consider a max-wait wrapper if this
|
|
16
|
-
// becomes a UX problem.
|
|
17
|
-
(0, operators_1.debounceTime)(DEBOUNCE_MS), (0, operators_1.withLatestFrom)(state$),
|
|
18
|
-
// `switchMap` unsubscribes from any in-flight PUT observable when a new
|
|
19
|
-
// debounced batch fires. The prior HTTP request has already left the
|
|
12
|
+
const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)((action) => notificationPreferencesViewReducer_1.saveNotificationPreferences.match(action)), (0, operators_1.withLatestFrom)(state$),
|
|
13
|
+
// `switchMap` unsubscribes from any in-flight PUT observable when a newer
|
|
14
|
+
// Save fires. The prior HTTP request has already left the
|
|
20
15
|
// client — the network call is NOT cancelled — but its response is
|
|
21
16
|
// ignored, so stale success/failure actions cannot clobber the newer
|
|
22
17
|
// batch's state. Server-side ordering is arrival-order LWW.
|
|
@@ -51,7 +46,7 @@ const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.
|
|
|
51
46
|
const isCancelledSince = () => cancelEpochAtDispatch <
|
|
52
47
|
state$.value.notificationPreferencesViewState.cancelEpoch;
|
|
53
48
|
// Abort the in-flight HTTP request when `switchMap` disposes this
|
|
54
|
-
// observable (
|
|
49
|
+
// observable (a newer Save fires, tenant switch, unmount).
|
|
55
50
|
// Without an AbortSignal, `switchMap` would drop the response
|
|
56
51
|
// client-side but the older PUT would still land on the server —
|
|
57
52
|
// under patch-semantic LWW, a slower older PUT arriving after a
|
|
@@ -77,7 +72,7 @@ const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.
|
|
|
77
72
|
];
|
|
78
73
|
if (!isCancelledSince()) {
|
|
79
74
|
// Surface a user-visible error — without it the UI reverts to
|
|
80
|
-
// server truth after
|
|
75
|
+
// server truth after the save and the failed toggle looks like
|
|
81
76
|
// a mystery UI bug.
|
|
82
77
|
actions.push(errorSnackbar);
|
|
83
78
|
}
|
|
@@ -113,8 +108,10 @@ const saveNotificationPreferencesEpic = (actions$, state$, zeniAPI) => actions$.
|
|
|
113
108
|
// under patch-semantic LWW. Cursor Bugbot 3637969823 + 3641372002.
|
|
114
109
|
(0, operators_1.takeUntil)(actions$.pipe((0, operators_1.filter)((action) => notificationPreferencesViewReducer_1.clearNotificationPreferencesLocalOverrides.match(action) ||
|
|
115
110
|
notificationPreferencesViewReducer_1.clearAllNotificationPreferencesView.match(action)))));
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
|
|
111
|
+
// `saveNotificationPreferences` (the trigger) already flipped
|
|
112
|
+
// savePreferencesState to In-Progress via its reducer case, so the PUT
|
|
113
|
+
// observable is returned directly — re-emitting the trigger here would
|
|
114
|
+
// loop the epic on itself.
|
|
115
|
+
return request$;
|
|
119
116
|
}));
|
|
120
117
|
exports.saveNotificationPreferencesEpic = saveNotificationPreferencesEpic;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { NotificationPreferences } from './notificationPreferencesViewState';
|
|
2
2
|
export interface NotificationPreferencesPayload {
|
|
3
3
|
event_enabled_by_channel?: Record<string, Record<string, boolean>>;
|
|
4
|
+
group_channel_enabled_by_group_id?: Record<string, Record<string, boolean>>;
|
|
4
5
|
group_frequency_by_group_id?: Record<string, string>;
|
|
5
6
|
}
|
|
6
7
|
export declare const mapPayloadToPreferences: (payload?: NotificationPreferencesPayload) => NotificationPreferences;
|
|
7
|
-
export declare const mapPreferencesToPayload: (preferences: NotificationPreferences) =>
|
|
8
|
+
export declare const mapPreferencesToPayload: (preferences: NotificationPreferences) => NotificationPreferencesPayload;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mapPreferencesToPayload = exports.mapPayloadToPreferences = void 0;
|
|
4
4
|
const notificationRegistryState_1 = require("../../entity/notificationRegistry/notificationRegistryState");
|
|
5
|
-
const
|
|
5
|
+
const mapChannelEnabledMap = (raw) => {
|
|
6
6
|
if (raw == null) {
|
|
7
7
|
return {};
|
|
8
8
|
}
|
|
@@ -23,7 +23,8 @@ const mapPayloadToPreferences = (payload) => {
|
|
|
23
23
|
(0, notificationRegistryState_1.toNotificationFrequency)(frequency),
|
|
24
24
|
]));
|
|
25
25
|
return {
|
|
26
|
-
eventEnabledByChannel:
|
|
26
|
+
eventEnabledByChannel: mapChannelEnabledMap(payload?.event_enabled_by_channel),
|
|
27
|
+
groupChannelEnabledByGroupId: mapChannelEnabledMap(payload?.group_channel_enabled_by_group_id),
|
|
27
28
|
groupFrequencyByGroupId,
|
|
28
29
|
};
|
|
29
30
|
};
|
|
@@ -33,6 +34,10 @@ const mapPreferencesToPayload = (preferences) => {
|
|
|
33
34
|
if (Object.keys(preferences.eventEnabledByChannel).length > 0) {
|
|
34
35
|
payload.event_enabled_by_channel = preferences.eventEnabledByChannel;
|
|
35
36
|
}
|
|
37
|
+
if (Object.keys(preferences.groupChannelEnabledByGroupId).length > 0) {
|
|
38
|
+
payload.group_channel_enabled_by_group_id =
|
|
39
|
+
preferences.groupChannelEnabledByGroupId;
|
|
40
|
+
}
|
|
36
41
|
if (Object.keys(preferences.groupFrequencyByGroupId).length > 0) {
|
|
37
42
|
payload.group_frequency_by_group_id = preferences.groupFrequencyByGroupId;
|
|
38
43
|
}
|
|
@@ -12,6 +12,11 @@ export interface TogglePreferencePayload {
|
|
|
12
12
|
enabled: boolean;
|
|
13
13
|
eventId: string;
|
|
14
14
|
}
|
|
15
|
+
export interface SetGroupChannelMasterPayload {
|
|
16
|
+
channel: NotificationChannel;
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
groupId: string;
|
|
19
|
+
}
|
|
15
20
|
export interface FetchNotificationPreferencesSuccessPayload {
|
|
16
21
|
preferences: NotificationPreferencesPayload | undefined;
|
|
17
22
|
saveEpochAtDispatch: number;
|
|
@@ -25,6 +30,6 @@ export interface SaveNotificationPreferencesFailurePayload {
|
|
|
25
30
|
cancelEpochAtDispatch: number;
|
|
26
31
|
error?: ZeniAPIStatus;
|
|
27
32
|
}
|
|
28
|
-
export declare const clearAllNotificationPreferencesView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"notificationPreferencesView/clearAllNotificationPreferencesView">, clearNotificationPreferencesLocalOverrides: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"notificationPreferencesView/clearNotificationPreferencesLocalOverrides">, fetchNotificationPreferencesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<FetchNotificationPreferencesSuccessPayload, "notificationPreferencesView/fetchNotificationPreferencesSuccess">, saveNotificationPreferences: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"notificationPreferencesView/saveNotificationPreferences">, saveNotificationPreferencesFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<SaveNotificationPreferencesFailurePayload, "notificationPreferencesView/saveNotificationPreferencesFailure">, saveNotificationPreferencesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<SaveNotificationPreferencesSuccessPayload, "notificationPreferencesView/saveNotificationPreferencesSuccess">, setGroupFrequency: import("@reduxjs/toolkit").ActionCreatorWithPayload<SetFrequencyPayload, "notificationPreferencesView/setGroupFrequency">, toggleEventChannel: import("@reduxjs/toolkit").ActionCreatorWithPayload<TogglePreferencePayload, "notificationPreferencesView/toggleEventChannel">;
|
|
33
|
+
export declare const clearAllNotificationPreferencesView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"notificationPreferencesView/clearAllNotificationPreferencesView">, clearNotificationPreferencesLocalOverrides: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"notificationPreferencesView/clearNotificationPreferencesLocalOverrides">, fetchNotificationPreferencesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<FetchNotificationPreferencesSuccessPayload, "notificationPreferencesView/fetchNotificationPreferencesSuccess">, saveNotificationPreferences: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"notificationPreferencesView/saveNotificationPreferences">, saveNotificationPreferencesFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<SaveNotificationPreferencesFailurePayload, "notificationPreferencesView/saveNotificationPreferencesFailure">, saveNotificationPreferencesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<SaveNotificationPreferencesSuccessPayload, "notificationPreferencesView/saveNotificationPreferencesSuccess">, setGroupChannelMaster: import("@reduxjs/toolkit").ActionCreatorWithPayload<SetGroupChannelMasterPayload, "notificationPreferencesView/setGroupChannelMaster">, setGroupFrequency: import("@reduxjs/toolkit").ActionCreatorWithPayload<SetFrequencyPayload, "notificationPreferencesView/setGroupFrequency">, toggleEventChannel: import("@reduxjs/toolkit").ActionCreatorWithPayload<TogglePreferencePayload, "notificationPreferencesView/toggleEventChannel">;
|
|
29
34
|
declare const _default: import("redux").Reducer<NotificationPreferencesViewState>;
|
|
30
35
|
export default _default;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.toggleEventChannel = exports.setGroupFrequency = exports.saveNotificationPreferencesSuccess = exports.saveNotificationPreferencesFailure = exports.saveNotificationPreferences = exports.fetchNotificationPreferencesSuccess = exports.clearNotificationPreferencesLocalOverrides = exports.clearAllNotificationPreferencesView = exports.initialState = void 0;
|
|
4
|
+
exports.toggleEventChannel = exports.setGroupFrequency = exports.setGroupChannelMaster = exports.saveNotificationPreferencesSuccess = exports.saveNotificationPreferencesFailure = exports.saveNotificationPreferences = exports.fetchNotificationPreferencesSuccess = exports.clearNotificationPreferencesLocalOverrides = exports.clearAllNotificationPreferencesView = exports.initialState = void 0;
|
|
5
5
|
const toolkit_1 = require("@reduxjs/toolkit");
|
|
6
6
|
const notificationPreferencesViewPayload_1 = require("./notificationPreferencesViewPayload");
|
|
7
7
|
const notificationPreferencesViewState_1 = require("./notificationPreferencesViewState");
|
|
@@ -22,8 +22,18 @@ const mergePreferences = (base, patch) => {
|
|
|
22
22
|
...channels,
|
|
23
23
|
};
|
|
24
24
|
});
|
|
25
|
+
const groupChannelEnabledByGroupId = {
|
|
26
|
+
...base.groupChannelEnabledByGroupId,
|
|
27
|
+
};
|
|
28
|
+
Object.entries(patch.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
|
|
29
|
+
groupChannelEnabledByGroupId[groupId] = {
|
|
30
|
+
...(base.groupChannelEnabledByGroupId[groupId] ?? {}),
|
|
31
|
+
...channels,
|
|
32
|
+
};
|
|
33
|
+
});
|
|
25
34
|
return {
|
|
26
35
|
eventEnabledByChannel,
|
|
36
|
+
groupChannelEnabledByGroupId,
|
|
27
37
|
groupFrequencyByGroupId: {
|
|
28
38
|
...base.groupFrequencyByGroupId,
|
|
29
39
|
...patch.groupFrequencyByGroupId,
|
|
@@ -34,16 +44,16 @@ const mergePreferences = (base, patch) => {
|
|
|
34
44
|
// to the server from `localOverrides` — AND whose current value still equals
|
|
35
45
|
// what was saved. Any new edits the user added while the PUT was in flight
|
|
36
46
|
// (either new keys not present in `saved`, OR same keys the user flipped back
|
|
37
|
-
// to a different value) are preserved so the next
|
|
47
|
+
// to a different value) are preserved so the next Save picks them up.
|
|
38
48
|
//
|
|
39
49
|
// Presence-only subtraction (the prior implementation) silently dropped a
|
|
40
|
-
// same-key re-edit that landed AFTER
|
|
50
|
+
// same-key re-edit that landed AFTER a Save fired but BEFORE the response
|
|
41
51
|
// returned. Concrete case:
|
|
42
52
|
// 1. toggle evt1.email = false → localOverrides = {evt1:{email:false}}
|
|
43
|
-
// 2.
|
|
53
|
+
// 2. Save → PUT #1 fires with savedOverrides = {evt1:{email:false}}
|
|
44
54
|
// 3. user re-toggles evt1.email = true → localOverrides = {evt1:{email:true}}
|
|
45
55
|
// 4. PUT #1 success → subtract dropped `email` on presence, so the true
|
|
46
|
-
// re-edit disappeared and next
|
|
56
|
+
// re-edit disappeared and the next Save found nothing to send.
|
|
47
57
|
const subtractSavedOverrides = (current, saved) => {
|
|
48
58
|
const eventEnabledByChannel = {};
|
|
49
59
|
Object.entries(current.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
@@ -65,13 +75,38 @@ const subtractSavedOverrides = (current, saved) => {
|
|
|
65
75
|
eventEnabledByChannel[eventId] = remainingChannels;
|
|
66
76
|
}
|
|
67
77
|
});
|
|
78
|
+
// Same value-equality subtraction as eventEnabledByChannel above — a
|
|
79
|
+
// group-channel master the user re-flipped while a PUT was in flight must
|
|
80
|
+
// survive so the next Save re-sends it.
|
|
81
|
+
const groupChannelEnabledByGroupId = {};
|
|
82
|
+
Object.entries(current.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
|
|
83
|
+
const savedChannels = saved.groupChannelEnabledByGroupId[groupId];
|
|
84
|
+
if (savedChannels == null) {
|
|
85
|
+
groupChannelEnabledByGroupId[groupId] = channels;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const remainingChannels = {};
|
|
89
|
+
Object.keys(channels).forEach((channel) => {
|
|
90
|
+
if (!(channel in savedChannels) ||
|
|
91
|
+
channels[channel] !== savedChannels[channel]) {
|
|
92
|
+
remainingChannels[channel] = channels[channel];
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
if (Object.keys(remainingChannels).length > 0) {
|
|
96
|
+
groupChannelEnabledByGroupId[groupId] = remainingChannels;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
68
99
|
const groupFrequencyByGroupId = {};
|
|
69
100
|
Object.entries(current.groupFrequencyByGroupId).forEach(([groupId, frequency]) => {
|
|
70
101
|
if (saved.groupFrequencyByGroupId[groupId] !== frequency) {
|
|
71
102
|
groupFrequencyByGroupId[groupId] = frequency;
|
|
72
103
|
}
|
|
73
104
|
});
|
|
74
|
-
return {
|
|
105
|
+
return {
|
|
106
|
+
eventEnabledByChannel,
|
|
107
|
+
groupChannelEnabledByGroupId,
|
|
108
|
+
groupFrequencyByGroupId,
|
|
109
|
+
};
|
|
75
110
|
};
|
|
76
111
|
const notificationPreferencesView = (0, toolkit_1.createSlice)({
|
|
77
112
|
name: 'notificationPreferencesView',
|
|
@@ -127,8 +162,8 @@ const notificationPreferencesView = (0, toolkit_1.createSlice)({
|
|
|
127
162
|
// snapshot of the server-known preferences (empty maps included), so
|
|
128
163
|
// REPLACE `preferences` rather than merging — merging would leak keys
|
|
129
164
|
// the server has since removed. DO NOT touch `localOverrides`: a refetch
|
|
130
|
-
// that fires while the user has
|
|
131
|
-
//
|
|
165
|
+
// that fires while the user has unsaved edits must not silently drop
|
|
166
|
+
// them; the save-success path is the only clearer.
|
|
132
167
|
// A `null`/`undefined` payload isn't a snapshot at all (e.g. the
|
|
133
168
|
// envelope key was omitted); no-op instead of wiping preferences.
|
|
134
169
|
if (action.payload.preferences == null) {
|
|
@@ -181,8 +216,8 @@ const notificationPreferencesView = (0, toolkit_1.createSlice)({
|
|
|
181
216
|
// In-flight-edit invariant: `savedOverrides` is the exact snapshot the
|
|
182
217
|
// epic PUT to the server. Subtracting those keys from `localOverrides`
|
|
183
218
|
// (instead of clearing it wholesale) preserves any edits the user
|
|
184
|
-
// added AFTER the
|
|
185
|
-
// next
|
|
219
|
+
// added AFTER the Save fired but BEFORE the response landed. The
|
|
220
|
+
// next Save will pick them up. Clearing wholesale drops
|
|
186
221
|
// in-flight edits from both UI (once server echo lands) and server.
|
|
187
222
|
// Cancel/in-flight-save race: `cancelEpoch` monotonically increases
|
|
188
223
|
// on every Cancel. If the save captured a lower epoch at dispatch,
|
|
@@ -208,6 +243,16 @@ const notificationPreferencesView = (0, toolkit_1.createSlice)({
|
|
|
208
243
|
draft.preferences = mergePreferences(draft.preferences, patch);
|
|
209
244
|
draft.localOverrides = subtractSavedOverrides(draft.localOverrides, action.payload.savedOverrides);
|
|
210
245
|
},
|
|
246
|
+
setGroupChannelMaster(draft, action) {
|
|
247
|
+
// Mirror of `toggleEventChannel` but scoped to the group-channel master
|
|
248
|
+
// held under `groupChannelEnabledByGroupId[groupId][channel]`.
|
|
249
|
+
const { channel, enabled, groupId } = action.payload;
|
|
250
|
+
const groupMap = {
|
|
251
|
+
...(draft.localOverrides.groupChannelEnabledByGroupId[groupId] ?? {}),
|
|
252
|
+
};
|
|
253
|
+
groupMap[channel] = enabled;
|
|
254
|
+
draft.localOverrides.groupChannelEnabledByGroupId[groupId] = groupMap;
|
|
255
|
+
},
|
|
211
256
|
setGroupFrequency(draft, action) {
|
|
212
257
|
draft.localOverrides.groupFrequencyByGroupId[action.payload.groupId] =
|
|
213
258
|
action.payload.frequency;
|
|
@@ -222,5 +267,5 @@ const notificationPreferencesView = (0, toolkit_1.createSlice)({
|
|
|
222
267
|
},
|
|
223
268
|
},
|
|
224
269
|
});
|
|
225
|
-
_a = notificationPreferencesView.actions, exports.clearAllNotificationPreferencesView = _a.clearAllNotificationPreferencesView, exports.clearNotificationPreferencesLocalOverrides = _a.clearNotificationPreferencesLocalOverrides, exports.fetchNotificationPreferencesSuccess = _a.fetchNotificationPreferencesSuccess, exports.saveNotificationPreferences = _a.saveNotificationPreferences, exports.saveNotificationPreferencesFailure = _a.saveNotificationPreferencesFailure, exports.saveNotificationPreferencesSuccess = _a.saveNotificationPreferencesSuccess, exports.setGroupFrequency = _a.setGroupFrequency, exports.toggleEventChannel = _a.toggleEventChannel;
|
|
270
|
+
_a = notificationPreferencesView.actions, exports.clearAllNotificationPreferencesView = _a.clearAllNotificationPreferencesView, exports.clearNotificationPreferencesLocalOverrides = _a.clearNotificationPreferencesLocalOverrides, exports.fetchNotificationPreferencesSuccess = _a.fetchNotificationPreferencesSuccess, exports.saveNotificationPreferences = _a.saveNotificationPreferences, exports.saveNotificationPreferencesFailure = _a.saveNotificationPreferencesFailure, exports.saveNotificationPreferencesSuccess = _a.saveNotificationPreferencesSuccess, exports.setGroupChannelMaster = _a.setGroupChannelMaster, exports.setGroupFrequency = _a.setGroupFrequency, exports.toggleEventChannel = _a.toggleEventChannel;
|
|
226
271
|
exports.default = notificationPreferencesView.reducer;
|
|
@@ -1,32 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.hasUnsavedNotificationPreferences = exports.getNotificationLocalOverrides = exports.getEffectiveNotificationPreferences = exports.getNotificationPreferencesSaveState = void 0;
|
|
4
|
+
const toolkit_1 = require("@reduxjs/toolkit");
|
|
4
5
|
const getView = (state) => state.notificationPreferencesViewState;
|
|
5
6
|
const getNotificationPreferencesSaveState = (state) => getView(state).savePreferencesState;
|
|
6
7
|
exports.getNotificationPreferencesSaveState = getNotificationPreferencesSaveState;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
// Memoised on `preferences` + `localOverrides` so the merged shape keeps a
|
|
9
|
+
// stable reference while neither input changes — a plain function would
|
|
10
|
+
// allocate a fresh object on every call and re-render every `useSelector`
|
|
11
|
+
// consumer on any unrelated dispatch.
|
|
12
|
+
exports.getEffectiveNotificationPreferences = (0, toolkit_1.createSelector)((state) => getView(state).preferences, (state) => getView(state).localOverrides, (preferences, localOverrides) => {
|
|
13
|
+
const mergedEventEnabledByChannel = { ...preferences.eventEnabledByChannel };
|
|
14
|
+
Object.entries(localOverrides.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
11
15
|
mergedEventEnabledByChannel[eventId] = {
|
|
12
|
-
...(
|
|
16
|
+
...(preferences.eventEnabledByChannel[eventId] ?? {}),
|
|
17
|
+
...channels,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
const mergedGroupChannelEnabledByGroupId = { ...preferences.groupChannelEnabledByGroupId };
|
|
21
|
+
Object.entries(localOverrides.groupChannelEnabledByGroupId).forEach(([groupId, channels]) => {
|
|
22
|
+
mergedGroupChannelEnabledByGroupId[groupId] = {
|
|
23
|
+
...(preferences.groupChannelEnabledByGroupId[groupId] ?? {}),
|
|
13
24
|
...channels,
|
|
14
25
|
};
|
|
15
26
|
});
|
|
16
27
|
return {
|
|
17
28
|
eventEnabledByChannel: mergedEventEnabledByChannel,
|
|
29
|
+
groupChannelEnabledByGroupId: mergedGroupChannelEnabledByGroupId,
|
|
18
30
|
groupFrequencyByGroupId: {
|
|
19
|
-
...
|
|
20
|
-
...
|
|
31
|
+
...preferences.groupFrequencyByGroupId,
|
|
32
|
+
...localOverrides.groupFrequencyByGroupId,
|
|
21
33
|
},
|
|
22
34
|
};
|
|
23
|
-
};
|
|
24
|
-
exports.getEffectiveNotificationPreferences = getEffectiveNotificationPreferences;
|
|
35
|
+
});
|
|
25
36
|
const getNotificationLocalOverrides = (state) => getView(state).localOverrides;
|
|
26
37
|
exports.getNotificationLocalOverrides = getNotificationLocalOverrides;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Object.keys(overrides.groupFrequencyByGroupId).length > 0);
|
|
31
|
-
};
|
|
32
|
-
exports.hasUnsavedNotificationPreferences = hasUnsavedNotificationPreferences;
|
|
38
|
+
exports.hasUnsavedNotificationPreferences = (0, toolkit_1.createSelector)((state) => getView(state).localOverrides, (localOverrides) => Object.keys(localOverrides.eventEnabledByChannel).length > 0 ||
|
|
39
|
+
Object.keys(localOverrides.groupChannelEnabledByGroupId).length > 0 ||
|
|
40
|
+
Object.keys(localOverrides.groupFrequencyByGroupId).length > 0);
|
|
@@ -2,6 +2,7 @@ import { FetchStateAndError } from '../../commonStateTypes/common';
|
|
|
2
2
|
import { NotificationChannel, NotificationFrequency } from '../../entity/notificationRegistry/notificationRegistryState';
|
|
3
3
|
export interface NotificationPreferences {
|
|
4
4
|
eventEnabledByChannel: Record<string, Partial<Record<NotificationChannel, boolean>>>;
|
|
5
|
+
groupChannelEnabledByGroupId: Record<string, Partial<Record<NotificationChannel, boolean>>>;
|
|
5
6
|
groupFrequencyByGroupId: Record<string, NotificationFrequency>;
|
|
6
7
|
}
|
|
7
8
|
export interface NotificationPreferencesViewState {
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.emptyNotificationPreferences = void 0;
|
|
4
4
|
const emptyNotificationPreferences = () => ({
|
|
5
5
|
eventEnabledByChannel: {},
|
|
6
|
+
groupChannelEnabledByGroupId: {},
|
|
6
7
|
groupFrequencyByGroupId: {},
|
|
7
8
|
});
|
|
8
9
|
exports.emptyNotificationPreferences = emptyNotificationPreferences;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeniai/client-epic-state",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.75",
|
|
4
4
|
"description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib/esm/index.js",
|