@availity/mui-favorites 1.0.0 → 1.1.1
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 +14 -0
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +59 -38
- package/dist/index.mjs +59 -38
- package/package.json +7 -7
- package/src/lib/Favorites.test.tsx +4 -3
- package/src/lib/Favorites.tsx +50 -31
- package/src/lib/utils.ts +17 -10
- package/tsconfig.spec.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [1.1.1](https://github.com/Availity/element/compare/@availity/mui-favorites@1.1.0...@availity/mui-favorites@1.1.1) (2025-03-07)
|
|
6
|
+
|
|
7
|
+
### Dependency Updates
|
|
8
|
+
|
|
9
|
+
* `mui-icon` updated to version `1.1.0`
|
|
10
|
+
* `mui-progress` updated to version `1.1.0`
|
|
11
|
+
* `mui-tooltip` updated to version `1.1.0`
|
|
12
|
+
## [1.1.0](https://github.com/Availity/element/compare/@availity/mui-favorites@1.0.0...@availity/mui-favorites@1.1.0) (2025-03-06)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* **mui-favorites:** add applicationId, maxFavorites, onMaxFavoritesReached props ([015e297](https://github.com/Availity/element/commit/015e2977cb17a2166971d82588055880027662a0))
|
|
18
|
+
|
|
5
19
|
## [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
20
|
|
|
7
21
|
### 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(
|
|
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(
|
|
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
|
-
|
|
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
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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 >=
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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 >=
|
|
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.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Availity MUI Favorites Component - part of the @availity/element design system",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"@tanstack/react-query": "^4.36.1"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@availity/mui-icon": "^1.0.
|
|
49
|
-
"@availity/mui-progress": "^1.0.
|
|
50
|
-
"@availity/mui-tooltip": "^1.0.
|
|
48
|
+
"@availity/mui-icon": "^1.0.1",
|
|
49
|
+
"@availity/mui-progress": "^1.0.1",
|
|
50
|
+
"@availity/mui-tooltip": "^1.0.1",
|
|
51
51
|
"@mui/material": "^6.4.5",
|
|
52
52
|
"react": "18.2.0",
|
|
53
53
|
"react-dom": "18.2.0",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"typescript": "^5.4.5"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
|
-
"@availity/mui-icon": "^1.0.
|
|
59
|
-
"@availity/mui-progress": "^1.0.
|
|
60
|
-
"@availity/mui-tooltip": "^1.0.
|
|
58
|
+
"@availity/mui-icon": "^1.0.1",
|
|
59
|
+
"@availity/mui-progress": "^1.0.1",
|
|
60
|
+
"@availity/mui-tooltip": "^1.0.1",
|
|
61
61
|
"@mui/material": "^6.4.5",
|
|
62
62
|
"react": ">=16.3.0"
|
|
63
63
|
},
|
|
@@ -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
|
-
|
|
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
|
});
|
package/src/lib/Favorites.tsx
CHANGED
|
@@ -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
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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 >=
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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 =>
|
|
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
|
+
};
|
package/tsconfig.spec.json
CHANGED