@availity/mui-favorites 1.0.0 → 1.1.0

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/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.1.0](https://github.com/Availity/element/compare/@availity/mui-favorites@1.0.0...@availity/mui-favorites@1.1.0) (2025-03-06)
6
+
7
+
8
+ ### Features
9
+
10
+ * **mui-favorites:** add applicationId, maxFavorites, onMaxFavoritesReached props ([015e297](https://github.com/Availity/element/commit/015e2977cb17a2166971d82588055880027662a0))
11
+
5
12
  ## [1.0.0](https://github.com/Availity/element/compare/@availity/mui-favorites@1.0.0-alpha.0...@availity/mui-favorites@1.0.0) (2025-02-25)
6
13
 
7
14
  ### Dependency Updates
package/dist/index.d.mts CHANGED
@@ -6,11 +6,14 @@ type Favorite = {
6
6
  };
7
7
 
8
8
  type StatusUnion = 'idle' | 'error' | 'loading' | 'reloading' | 'success';
9
- declare const FavoritesProvider: ({ children, onFavoritesChange, settingsFavorites, settingsStatus, }: {
9
+ declare const FavoritesProvider: ({ children, onFavoritesChange, onMaxFavoritesReached, settingsFavorites, settingsStatus, applicationId, maxFavorites, }: {
10
10
  children: React.ReactNode;
11
11
  onFavoritesChange?: (favorites: Favorite[]) => void;
12
+ onMaxFavoritesReached?: (favorites: Favorite[]) => void;
12
13
  settingsFavorites?: Favorite[];
13
14
  settingsStatus?: StatusUnion;
15
+ applicationId?: string;
16
+ maxFavorites?: number;
14
17
  }) => JSX.Element;
15
18
  type MergedStatusUnion = 'initLoading' | 'reloading' | 'error' | 'success';
16
19
  declare const useFavorites: (id: string) => {
package/dist/index.d.ts CHANGED
@@ -6,11 +6,14 @@ type Favorite = {
6
6
  };
7
7
 
8
8
  type StatusUnion = 'idle' | 'error' | 'loading' | 'reloading' | 'success';
9
- declare const FavoritesProvider: ({ children, onFavoritesChange, settingsFavorites, settingsStatus, }: {
9
+ declare const FavoritesProvider: ({ children, onFavoritesChange, onMaxFavoritesReached, settingsFavorites, settingsStatus, applicationId, maxFavorites, }: {
10
10
  children: React.ReactNode;
11
11
  onFavoritesChange?: (favorites: Favorite[]) => void;
12
+ onMaxFavoritesReached?: (favorites: Favorite[]) => void;
12
13
  settingsFavorites?: Favorite[];
13
14
  settingsStatus?: StatusUnion;
15
+ applicationId?: string;
16
+ maxFavorites?: number;
14
17
  }) => JSX.Element;
15
18
  type MergedStatusUnion = 'initLoading' | 'reloading' | 'error' | 'success';
16
19
  declare const useFavorites: (id: string) => {
package/dist/index.js CHANGED
@@ -108,21 +108,21 @@ var validateFavorites = (unvalidatedFavorites) => {
108
108
  const validatedFavorites = Array.isArray(unvalidatedFavorites) ? unvalidatedFavorites == null ? void 0 : unvalidatedFavorites.filter(isFavorite) : [];
109
109
  return validatedFavorites;
110
110
  };
111
- var submit = (_0) => __async(void 0, [_0], function* ({ favorites, targetFavoriteId }) {
112
- const response = yield import_api_axios.avSettingsApi.setApplication(NAV_APP_ID, { favorites });
111
+ var submit = (_0, _1) => __async(void 0, [_0, _1], function* ({ favorites, targetFavoriteId }, applicationId) {
112
+ const response = yield import_api_axios.avSettingsApi.setApplication(applicationId, { favorites });
113
113
  return { favorites: response.data.favorites, targetFavoriteId };
114
114
  });
115
- var getFavorites = () => __async(void 0, null, function* () {
115
+ var getFavorites = (applicationId) => __async(void 0, null, function* () {
116
116
  var _a, _b, _c;
117
- const result = yield import_api_axios.avSettingsApi.getApplication(NAV_APP_ID);
117
+ const result = yield import_api_axios.avSettingsApi.getApplication(applicationId);
118
118
  const unvalidatedFavorites = (_c = (_b = (_a = result == null ? void 0 : result.data) == null ? void 0 : _a.settings) == null ? void 0 : _b[0]) == null ? void 0 : _c.favorites;
119
119
  const validatedFavorites = validateFavorites(unvalidatedFavorites);
120
120
  return validatedFavorites;
121
121
  });
122
- var useFavoritesQuery = (enabled) => (0, import_react_query.useQuery)(["favorites"], getFavorites, { enabled });
123
- var useSubmitFavorites = ({ onMutationStart }) => {
122
+ var useFavoritesQuery = (enabled, applicationId) => (0, import_react_query.useQuery)(["favorites"], () => getFavorites(applicationId), { enabled });
123
+ var useSubmitFavorites = ({ onMutationStart }, applicationId) => {
124
124
  const queryClient = (0, import_react_query.useQueryClient)();
125
- const _a = (0, import_react_query.useMutation)(submit, {
125
+ const _a = (0, import_react_query.useMutation)(({ favorites, targetFavoriteId }) => submit({ favorites, targetFavoriteId }, applicationId), {
126
126
  onMutate(variables) {
127
127
  onMutationStart == null ? void 0 : onMutationStart(variables.targetFavoriteId);
128
128
  },
@@ -132,10 +132,17 @@ var useSubmitFavorites = ({ onMutationStart }) => {
132
132
  }), { mutateAsync: submitFavorites } = _a, rest = __objRest(_a, ["mutateAsync"]);
133
133
  return __spreadValues({ submitFavorites }, rest);
134
134
  };
135
- var sendUpdateMessage = (favorites) => {
136
- import_message_core.default.send({ favorites, event: AV_INTERNAL_GLOBALS.FAVORITES_UPDATE });
135
+ var sendUpdateMessage = (favorites, applicationId) => {
136
+ if (applicationId === NAV_APP_ID) {
137
+ import_message_core.default.send({ favorites, event: AV_INTERNAL_GLOBALS.FAVORITES_UPDATE });
138
+ }
139
+ };
140
+ var openMaxModal = (applicationId) => {
141
+ if (applicationId === NAV_APP_ID) {
142
+ return import_message_core.default.send(AV_INTERNAL_GLOBALS.MAX_FAVORITES);
143
+ }
144
+ return null;
137
145
  };
138
- var openMaxModal = () => import_message_core.default.send(AV_INTERNAL_GLOBALS.MAX_FAVORITES);
139
146
 
140
147
  // src/lib/Favorites.tsx
141
148
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -143,57 +150,71 @@ var FavoritesContext = (0, import_react.createContext)(null);
143
150
  var FavoritesProvider = ({
144
151
  children,
145
152
  onFavoritesChange,
153
+ onMaxFavoritesReached,
146
154
  settingsFavorites,
147
- settingsStatus
155
+ settingsStatus,
156
+ applicationId = NAV_APP_ID,
157
+ maxFavorites = MAX_FAVORITES
148
158
  }) => {
149
159
  const [lastClickedFavoriteId, setLastClickedFavoriteId] = (0, import_react.useState)("");
150
160
  const queryClient = (0, import_react_query2.useQueryClient)();
151
- const { data: favoritesData, status: favoritesDataStatus } = useFavoritesQuery(!settingsStatus);
161
+ const { data: favoritesData, status: favoritesDataStatus } = useFavoritesQuery(!settingsStatus, applicationId);
152
162
  const favorites = settingsStatus ? settingsFavorites : favoritesData;
153
163
  const queryStatus = settingsStatus ? settingsStatus : favoritesDataStatus;
154
164
  const { submitFavorites, status: mutationStatus } = useSubmitFavorites({
155
165
  onMutationStart(targetFavoriteId) {
156
166
  setLastClickedFavoriteId(targetFavoriteId);
157
167
  }
158
- });
168
+ }, applicationId);
159
169
  (0, import_react.useEffect)(() => {
160
- const unsubscribeFavoritesChanged = import_message_core2.default.subscribe(
161
- AV_INTERNAL_GLOBALS.FAVORITES_CHANGED,
162
- (data) => {
163
- if (data == null ? void 0 : data.favorites) {
164
- queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
165
- }
166
- },
167
- { ignoreSameWindow: false }
168
- );
169
- const unsubscribeFavoritesUpdate = import_message_core2.default.subscribe(
170
- AV_INTERNAL_GLOBALS.FAVORITES_UPDATE,
171
- (data) => {
172
- if (data == null ? void 0 : data.favorites) {
173
- queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
174
- }
175
- },
176
- { ignoreSameWindow: false }
177
- );
170
+ const subscribe = () => {
171
+ if (applicationId === NAV_APP_ID) {
172
+ const unsubscribeFavoritesChanged = import_message_core2.default.subscribe(
173
+ AV_INTERNAL_GLOBALS.FAVORITES_CHANGED,
174
+ (data) => {
175
+ if (data == null ? void 0 : data.favorites) {
176
+ queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
177
+ }
178
+ },
179
+ { ignoreSameWindow: false }
180
+ );
181
+ const unsubscribeFavoritesUpdate = import_message_core2.default.subscribe(
182
+ AV_INTERNAL_GLOBALS.FAVORITES_UPDATE,
183
+ (data) => {
184
+ if (data == null ? void 0 : data.favorites) {
185
+ queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
186
+ }
187
+ },
188
+ { ignoreSameWindow: false }
189
+ );
190
+ return () => {
191
+ unsubscribeFavoritesChanged();
192
+ unsubscribeFavoritesUpdate();
193
+ };
194
+ }
195
+ };
196
+ const unsubscribe = subscribe();
178
197
  return () => {
179
- unsubscribeFavoritesChanged();
180
- unsubscribeFavoritesUpdate();
198
+ if (unsubscribe) unsubscribe();
181
199
  };
182
- }, [queryClient]);
200
+ }, [queryClient, applicationId]);
183
201
  const deleteFavorite = (id) => __async(void 0, null, function* () {
184
202
  if (favorites) {
185
203
  const response = yield submitFavorites({
186
204
  favorites: favorites.filter((favorite) => favorite.id !== id),
187
205
  targetFavoriteId: id
188
206
  });
189
- sendUpdateMessage(response.favorites);
207
+ sendUpdateMessage(response.favorites, applicationId);
190
208
  onFavoritesChange == null ? void 0 : onFavoritesChange(response.favorites);
191
209
  }
192
210
  });
193
211
  const addFavorite = (id) => __async(void 0, null, function* () {
194
212
  if (!favorites) return false;
195
- if (favorites.length >= MAX_FAVORITES) {
196
- openMaxModal();
213
+ if (favorites.length >= maxFavorites) {
214
+ openMaxModal(applicationId);
215
+ if (onMaxFavoritesReached && typeof onMaxFavoritesReached === "function") {
216
+ yield onMaxFavoritesReached(favorites);
217
+ }
197
218
  return false;
198
219
  }
199
220
  const maxFavorite = favorites.reduce((accum, fave) => {
@@ -207,7 +228,7 @@ var FavoritesProvider = ({
207
228
  favorites: [...favorites, { id, pos: newFavPos }],
208
229
  targetFavoriteId: id
209
230
  });
210
- sendUpdateMessage(response.favorites);
231
+ sendUpdateMessage(response.favorites, applicationId);
211
232
  onFavoritesChange == null ? void 0 : onFavoritesChange(response.favorites);
212
233
  const isFavorited = response.favorites.find((f) => f.id === id);
213
234
  return !!isFavorited;
package/dist/index.mjs CHANGED
@@ -73,21 +73,21 @@ var validateFavorites = (unvalidatedFavorites) => {
73
73
  const validatedFavorites = Array.isArray(unvalidatedFavorites) ? unvalidatedFavorites == null ? void 0 : unvalidatedFavorites.filter(isFavorite) : [];
74
74
  return validatedFavorites;
75
75
  };
76
- var submit = (_0) => __async(void 0, [_0], function* ({ favorites, targetFavoriteId }) {
77
- const response = yield avSettingsApi.setApplication(NAV_APP_ID, { favorites });
76
+ var submit = (_0, _1) => __async(void 0, [_0, _1], function* ({ favorites, targetFavoriteId }, applicationId) {
77
+ const response = yield avSettingsApi.setApplication(applicationId, { favorites });
78
78
  return { favorites: response.data.favorites, targetFavoriteId };
79
79
  });
80
- var getFavorites = () => __async(void 0, null, function* () {
80
+ var getFavorites = (applicationId) => __async(void 0, null, function* () {
81
81
  var _a, _b, _c;
82
- const result = yield avSettingsApi.getApplication(NAV_APP_ID);
82
+ const result = yield avSettingsApi.getApplication(applicationId);
83
83
  const unvalidatedFavorites = (_c = (_b = (_a = result == null ? void 0 : result.data) == null ? void 0 : _a.settings) == null ? void 0 : _b[0]) == null ? void 0 : _c.favorites;
84
84
  const validatedFavorites = validateFavorites(unvalidatedFavorites);
85
85
  return validatedFavorites;
86
86
  });
87
- var useFavoritesQuery = (enabled) => useQuery(["favorites"], getFavorites, { enabled });
88
- var useSubmitFavorites = ({ onMutationStart }) => {
87
+ var useFavoritesQuery = (enabled, applicationId) => useQuery(["favorites"], () => getFavorites(applicationId), { enabled });
88
+ var useSubmitFavorites = ({ onMutationStart }, applicationId) => {
89
89
  const queryClient = useQueryClient();
90
- const _a = useMutation(submit, {
90
+ const _a = useMutation(({ favorites, targetFavoriteId }) => submit({ favorites, targetFavoriteId }, applicationId), {
91
91
  onMutate(variables) {
92
92
  onMutationStart == null ? void 0 : onMutationStart(variables.targetFavoriteId);
93
93
  },
@@ -97,10 +97,17 @@ var useSubmitFavorites = ({ onMutationStart }) => {
97
97
  }), { mutateAsync: submitFavorites } = _a, rest = __objRest(_a, ["mutateAsync"]);
98
98
  return __spreadValues({ submitFavorites }, rest);
99
99
  };
100
- var sendUpdateMessage = (favorites) => {
101
- avMessages.send({ favorites, event: AV_INTERNAL_GLOBALS.FAVORITES_UPDATE });
100
+ var sendUpdateMessage = (favorites, applicationId) => {
101
+ if (applicationId === NAV_APP_ID) {
102
+ avMessages.send({ favorites, event: AV_INTERNAL_GLOBALS.FAVORITES_UPDATE });
103
+ }
104
+ };
105
+ var openMaxModal = (applicationId) => {
106
+ if (applicationId === NAV_APP_ID) {
107
+ return avMessages.send(AV_INTERNAL_GLOBALS.MAX_FAVORITES);
108
+ }
109
+ return null;
102
110
  };
103
- var openMaxModal = () => avMessages.send(AV_INTERNAL_GLOBALS.MAX_FAVORITES);
104
111
 
105
112
  // src/lib/Favorites.tsx
106
113
  import { jsx } from "react/jsx-runtime";
@@ -108,57 +115,71 @@ var FavoritesContext = createContext(null);
108
115
  var FavoritesProvider = ({
109
116
  children,
110
117
  onFavoritesChange,
118
+ onMaxFavoritesReached,
111
119
  settingsFavorites,
112
- settingsStatus
120
+ settingsStatus,
121
+ applicationId = NAV_APP_ID,
122
+ maxFavorites = MAX_FAVORITES
113
123
  }) => {
114
124
  const [lastClickedFavoriteId, setLastClickedFavoriteId] = useState("");
115
125
  const queryClient = useQueryClient2();
116
- const { data: favoritesData, status: favoritesDataStatus } = useFavoritesQuery(!settingsStatus);
126
+ const { data: favoritesData, status: favoritesDataStatus } = useFavoritesQuery(!settingsStatus, applicationId);
117
127
  const favorites = settingsStatus ? settingsFavorites : favoritesData;
118
128
  const queryStatus = settingsStatus ? settingsStatus : favoritesDataStatus;
119
129
  const { submitFavorites, status: mutationStatus } = useSubmitFavorites({
120
130
  onMutationStart(targetFavoriteId) {
121
131
  setLastClickedFavoriteId(targetFavoriteId);
122
132
  }
123
- });
133
+ }, applicationId);
124
134
  useEffect(() => {
125
- const unsubscribeFavoritesChanged = avMessages2.subscribe(
126
- AV_INTERNAL_GLOBALS.FAVORITES_CHANGED,
127
- (data) => {
128
- if (data == null ? void 0 : data.favorites) {
129
- queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
130
- }
131
- },
132
- { ignoreSameWindow: false }
133
- );
134
- const unsubscribeFavoritesUpdate = avMessages2.subscribe(
135
- AV_INTERNAL_GLOBALS.FAVORITES_UPDATE,
136
- (data) => {
137
- if (data == null ? void 0 : data.favorites) {
138
- queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
139
- }
140
- },
141
- { ignoreSameWindow: false }
142
- );
135
+ const subscribe = () => {
136
+ if (applicationId === NAV_APP_ID) {
137
+ const unsubscribeFavoritesChanged = avMessages2.subscribe(
138
+ AV_INTERNAL_GLOBALS.FAVORITES_CHANGED,
139
+ (data) => {
140
+ if (data == null ? void 0 : data.favorites) {
141
+ queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
142
+ }
143
+ },
144
+ { ignoreSameWindow: false }
145
+ );
146
+ const unsubscribeFavoritesUpdate = avMessages2.subscribe(
147
+ AV_INTERNAL_GLOBALS.FAVORITES_UPDATE,
148
+ (data) => {
149
+ if (data == null ? void 0 : data.favorites) {
150
+ queryClient.setQueryData(["favorites"], data == null ? void 0 : data.favorites);
151
+ }
152
+ },
153
+ { ignoreSameWindow: false }
154
+ );
155
+ return () => {
156
+ unsubscribeFavoritesChanged();
157
+ unsubscribeFavoritesUpdate();
158
+ };
159
+ }
160
+ };
161
+ const unsubscribe = subscribe();
143
162
  return () => {
144
- unsubscribeFavoritesChanged();
145
- unsubscribeFavoritesUpdate();
163
+ if (unsubscribe) unsubscribe();
146
164
  };
147
- }, [queryClient]);
165
+ }, [queryClient, applicationId]);
148
166
  const deleteFavorite = (id) => __async(void 0, null, function* () {
149
167
  if (favorites) {
150
168
  const response = yield submitFavorites({
151
169
  favorites: favorites.filter((favorite) => favorite.id !== id),
152
170
  targetFavoriteId: id
153
171
  });
154
- sendUpdateMessage(response.favorites);
172
+ sendUpdateMessage(response.favorites, applicationId);
155
173
  onFavoritesChange == null ? void 0 : onFavoritesChange(response.favorites);
156
174
  }
157
175
  });
158
176
  const addFavorite = (id) => __async(void 0, null, function* () {
159
177
  if (!favorites) return false;
160
- if (favorites.length >= MAX_FAVORITES) {
161
- openMaxModal();
178
+ if (favorites.length >= maxFavorites) {
179
+ openMaxModal(applicationId);
180
+ if (onMaxFavoritesReached && typeof onMaxFavoritesReached === "function") {
181
+ yield onMaxFavoritesReached(favorites);
182
+ }
162
183
  return false;
163
184
  }
164
185
  const maxFavorite = favorites.reduce((accum, fave) => {
@@ -172,7 +193,7 @@ var FavoritesProvider = ({
172
193
  favorites: [...favorites, { id, pos: newFavPos }],
173
194
  targetFavoriteId: id
174
195
  });
175
- sendUpdateMessage(response.favorites);
196
+ sendUpdateMessage(response.favorites, applicationId);
176
197
  onFavoritesChange == null ? void 0 : onFavoritesChange(response.favorites);
177
198
  const isFavorited = response.favorites.find((f) => f.id === id);
178
199
  return !!isFavorited;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@availity/mui-favorites",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Availity MUI Favorites Component - part of the @availity/element design system",
5
5
  "keywords": [
6
6
  "react",
@@ -15,9 +15,8 @@ const domain = () => {
15
15
  }
16
16
 
17
17
  if (window.location.hostname) {
18
- return `${window.location.protocol}//${window.location.hostname}${
19
- window.location.port ? `:${window.location.port}` : ''
20
- }`;
18
+ return `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''
19
+ }`;
21
20
  }
22
21
 
23
22
  return '*';
@@ -270,4 +269,6 @@ describe('Favorites', () => {
270
269
  });
271
270
  });
272
271
  });
272
+
273
+
273
274
  });
@@ -3,7 +3,7 @@ import { useQueryClient } from '@tanstack/react-query';
3
3
  import avMessages from '@availity/message-core';
4
4
  import type { Favorite } from './utils';
5
5
  import { useFavoritesQuery, useSubmitFavorites, sendUpdateMessage, openMaxModal } from './utils';
6
- import { AV_INTERNAL_GLOBALS, MAX_FAVORITES } from './constants';
6
+ import { AV_INTERNAL_GLOBALS, MAX_FAVORITES, NAV_APP_ID } from './constants';
7
7
 
8
8
  type StatusUnion = 'idle' | 'error' | 'loading' | 'reloading' | 'success';
9
9
 
@@ -21,18 +21,24 @@ const FavoritesContext = createContext<FavoritesContextType | null>(null);
21
21
  export const FavoritesProvider = ({
22
22
  children,
23
23
  onFavoritesChange,
24
+ onMaxFavoritesReached,
24
25
  settingsFavorites,
25
26
  settingsStatus,
27
+ applicationId = NAV_APP_ID,
28
+ maxFavorites = MAX_FAVORITES,
26
29
  }: {
27
30
  children: React.ReactNode;
28
31
  onFavoritesChange?: (favorites: Favorite[]) => void;
32
+ onMaxFavoritesReached?: (favorites: Favorite[]) => void;
29
33
  settingsFavorites?: Favorite[];
30
34
  settingsStatus?: StatusUnion;
35
+ applicationId?: string;
36
+ maxFavorites?: number;
31
37
  }): JSX.Element => {
32
38
  const [lastClickedFavoriteId, setLastClickedFavoriteId] = useState<string>('');
33
39
 
34
40
  const queryClient = useQueryClient();
35
- const { data: favoritesData, status: favoritesDataStatus } = useFavoritesQuery(!settingsStatus);
41
+ const { data: favoritesData, status: favoritesDataStatus } = useFavoritesQuery(!settingsStatus, applicationId);
36
42
  const favorites = settingsStatus ? settingsFavorites : favoritesData;
37
43
  const queryStatus = settingsStatus ? settingsStatus : favoritesDataStatus;
38
44
 
@@ -40,34 +46,44 @@ export const FavoritesProvider = ({
40
46
  onMutationStart(targetFavoriteId) {
41
47
  setLastClickedFavoriteId(targetFavoriteId);
42
48
  },
43
- });
49
+ }, applicationId);
44
50
 
45
51
  useEffect(() => {
46
- const unsubscribeFavoritesChanged = avMessages.subscribe(
47
- AV_INTERNAL_GLOBALS.FAVORITES_CHANGED,
48
- (data) => {
49
- if (data?.favorites) {
50
- queryClient.setQueryData(['favorites'], data?.favorites);
51
- }
52
- },
53
- { ignoreSameWindow: false }
54
- );
55
-
56
- const unsubscribeFavoritesUpdate = avMessages.subscribe(
57
- AV_INTERNAL_GLOBALS.FAVORITES_UPDATE,
58
- (data) => {
59
- if (data?.favorites) {
60
- queryClient.setQueryData(['favorites'], data?.favorites);
61
- }
62
- },
63
- { ignoreSameWindow: false }
64
- );
52
+ const subscribe = () => {
53
+ if (applicationId === NAV_APP_ID) {
54
+ const unsubscribeFavoritesChanged = avMessages.subscribe(
55
+ AV_INTERNAL_GLOBALS.FAVORITES_CHANGED,
56
+ (data) => {
57
+ if (data?.favorites) {
58
+ queryClient.setQueryData(['favorites'], data?.favorites);
59
+ }
60
+ },
61
+ { ignoreSameWindow: false }
62
+ );
63
+
64
+ const unsubscribeFavoritesUpdate = avMessages.subscribe(
65
+ AV_INTERNAL_GLOBALS.FAVORITES_UPDATE,
66
+ (data) => {
67
+ if (data?.favorites) {
68
+ queryClient.setQueryData(['favorites'], data?.favorites);
69
+ }
70
+ },
71
+ { ignoreSameWindow: false }
72
+ );
73
+
74
+ return () => {
75
+ unsubscribeFavoritesChanged();
76
+ unsubscribeFavoritesUpdate();
77
+ };
78
+ }
79
+ };
80
+
81
+ const unsubscribe = subscribe();
65
82
 
66
83
  return () => {
67
- unsubscribeFavoritesChanged();
68
- unsubscribeFavoritesUpdate();
84
+ if (unsubscribe) unsubscribe();
69
85
  };
70
- }, [queryClient]);
86
+ }, [queryClient, applicationId]);
71
87
 
72
88
  const deleteFavorite = async (id: string) => {
73
89
  if (favorites) {
@@ -76,7 +92,7 @@ export const FavoritesProvider = ({
76
92
  targetFavoriteId: id,
77
93
  });
78
94
 
79
- sendUpdateMessage(response.favorites);
95
+ sendUpdateMessage(response.favorites, applicationId);
80
96
  onFavoritesChange?.(response.favorites);
81
97
  }
82
98
  };
@@ -84,8 +100,11 @@ export const FavoritesProvider = ({
84
100
  const addFavorite = async (id: string) => {
85
101
  if (!favorites) return false;
86
102
 
87
- if (favorites.length >= MAX_FAVORITES) {
88
- openMaxModal();
103
+ if (favorites.length >= maxFavorites) {
104
+ openMaxModal(applicationId);
105
+ if (onMaxFavoritesReached && typeof onMaxFavoritesReached === 'function') {
106
+ await onMaxFavoritesReached(favorites);
107
+ }
89
108
  return false;
90
109
  }
91
110
 
@@ -103,10 +122,10 @@ export const FavoritesProvider = ({
103
122
  targetFavoriteId: id,
104
123
  });
105
124
 
106
- sendUpdateMessage(response.favorites);
125
+ sendUpdateMessage(response.favorites, applicationId);
107
126
  onFavoritesChange?.(response.favorites);
108
127
 
109
- const isFavorited = response.favorites.find((f) => f.id === id);
128
+ const isFavorited = response.favorites.find((f: Favorite) => f.id === id);
110
129
 
111
130
  return !!isFavorited;
112
131
  };
@@ -128,7 +147,7 @@ export const FavoritesProvider = ({
128
147
  };
129
148
 
130
149
  // eslint-disable-next-line @typescript-eslint/no-empty-function
131
- const noOp = () => {};
150
+ const noOp = () => { };
132
151
 
133
152
  type MergedStatusUnion = 'initLoading' | 'reloading' | 'error' | 'success';
134
153
 
package/src/lib/utils.ts CHANGED
@@ -22,28 +22,28 @@ type MutationVariables = {
22
22
 
23
23
  type SettingsResponse = { data: { favorites: Favorite[] } };
24
24
 
25
- const submit = async ({ favorites, targetFavoriteId }: MutationVariables) => {
26
- const response: SettingsResponse = await avSettingsApi.setApplication(NAV_APP_ID, { favorites });
25
+ const submit = async ({ favorites, targetFavoriteId }: MutationVariables, applicationId: string) => {
26
+ const response: SettingsResponse = await avSettingsApi.setApplication(applicationId, { favorites });
27
27
  return { favorites: response.data.favorites, targetFavoriteId };
28
28
  }
29
29
 
30
- const getFavorites = async () => {
31
- const result = await avSettingsApi.getApplication(NAV_APP_ID);
30
+ const getFavorites = async (applicationId: string) => {
31
+ const result = await avSettingsApi.getApplication(applicationId);
32
32
  const unvalidatedFavorites = result?.data?.settings?.[0]?.favorites;
33
33
  const validatedFavorites = validateFavorites(unvalidatedFavorites);
34
34
 
35
35
  return validatedFavorites;
36
36
  };
37
37
 
38
- export const useFavoritesQuery = (enabled: boolean): UseQueryResult<Favorite[], unknown> => useQuery(['favorites'], getFavorites, { enabled });
38
+ export const useFavoritesQuery = (enabled: boolean, applicationId: string): UseQueryResult<Favorite[], unknown> => useQuery(['favorites'], () => getFavorites(applicationId), { enabled });
39
39
 
40
40
  type MutationOptions = {
41
41
  onMutationStart?: (targetFavoriteId: string) => void;
42
42
  };
43
43
 
44
- export const useSubmitFavorites = ({ onMutationStart }: MutationOptions) => {
44
+ export const useSubmitFavorites = ({ onMutationStart }: MutationOptions, applicationId: string) => {
45
45
  const queryClient = useQueryClient();
46
- const { mutateAsync: submitFavorites, ...rest } = useMutation(submit, {
46
+ const { mutateAsync: submitFavorites, ...rest } = useMutation(({ favorites, targetFavoriteId }: MutationVariables) => submit({ favorites, targetFavoriteId }, applicationId), {
47
47
  onMutate(variables) {
48
48
  onMutationStart?.(variables.targetFavoriteId);
49
49
  },
@@ -54,8 +54,15 @@ export const useSubmitFavorites = ({ onMutationStart }: MutationOptions) => {
54
54
  return { submitFavorites, ...rest };
55
55
  };
56
56
 
57
- export const sendUpdateMessage = (favorites: Favorite[]): void => {
58
- avMessages.send({ favorites, event: AV_INTERNAL_GLOBALS.FAVORITES_UPDATE });
57
+ export const sendUpdateMessage = (favorites: Favorite[], applicationId: string): void => {
58
+ if (applicationId === NAV_APP_ID) {
59
+ avMessages.send({ favorites, event: AV_INTERNAL_GLOBALS.FAVORITES_UPDATE });
60
+ }
59
61
  };
60
62
 
61
- export const openMaxModal = (): void => avMessages.send(AV_INTERNAL_GLOBALS.MAX_FAVORITES);
63
+ export const openMaxModal = (applicationId: string): void | null => {
64
+ if (applicationId === NAV_APP_ID) {
65
+ return avMessages.send(AV_INTERNAL_GLOBALS.MAX_FAVORITES);
66
+ }
67
+ return null;
68
+ };