@edifice.io/react 2.3.2-develop-b2school-actualites.20251027110554 → 2.3.2-develop-b2school-actualites.20251103102719

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.
@@ -15,6 +15,7 @@ export * from './useHasWorkflow';
15
15
  export * from './useHover';
16
16
  export * from './useHttpErrorToast';
17
17
  export * from './useImage';
18
+ export * from './useInfiniteScroll';
18
19
  export * from './useIsAdml';
19
20
  export * from './useKeyPress';
20
21
  export * from './useLibraryUrl';
@@ -0,0 +1 @@
1
+ export { default as useInfiniteScroll } from './useInfiniteScroll';
@@ -0,0 +1,33 @@
1
+ /**
2
+ * A custom React hook that provides infinite scroll functionality using the Intersection Observer API.
3
+ *
4
+ * This hook returns a ref callback that can be attached to a DOM element (typically at the bottom
5
+ * of a scrollable list). When that element becomes visible in the viewport, the provided callback
6
+ * function is executed, allowing you to load more content.
7
+ *
8
+ * @param params - Configuration object for the infinite scroll hook
9
+ * @param params.callback - Function to execute when the observed element intersects with the viewport
10
+ * @param params.options - Optional Intersection Observer configuration options (defaults to { threshold: 0.1 })
11
+ *
12
+ * @returns A ref callback function that should be attached to the target DOM element
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const loadMoreRef = useInfiniteScroll({
17
+ * // Load more data when the element is visible
18
+ * callback: loadMoreItems,
19
+ * options: { threshold: 0.5 } // Trigger when 50% of element is visible
20
+ * });
21
+ *
22
+ * return (
23
+ * <div>
24
+ * {items.map(item => <Item key={item.id} {...item} />)}
25
+ * <div ref={loadMoreRef}>Loading...</div>
26
+ * </div>
27
+ * );
28
+ * ```
29
+ */
30
+ export default function useInfiniteScroll({ callback, options, }: {
31
+ callback: () => void;
32
+ options?: IntersectionObserverInit;
33
+ }): (node: HTMLElement | null) => void;
@@ -0,0 +1,20 @@
1
+ import { useRef, useCallback } from "react";
2
+ function useInfiniteScroll({
3
+ callback,
4
+ options = {
5
+ threshold: 0.1
6
+ }
7
+ }) {
8
+ const observerRef = useRef(null);
9
+ return useCallback((node) => {
10
+ if (observerRef.current && (observerRef.current.disconnect(), observerRef.current = null), !node) return;
11
+ const observer = new IntersectionObserver(async (entries) => {
12
+ for (const entry of entries)
13
+ entry.isIntersecting && await callback();
14
+ }, options);
15
+ observer.observe(node), observerRef.current = observer;
16
+ }, [callback, options]);
17
+ }
18
+ export {
19
+ useInfiniteScroll as default
20
+ };
package/dist/index.js CHANGED
@@ -62,43 +62,44 @@ import { default as default61 } from "./hooks/useHasWorkflow/useHasWorkflow.js";
62
62
  import { default as default62 } from "./hooks/useHover/useHover.js";
63
63
  import { default as default63 } from "./hooks/useHttpErrorToast/useHttpErrorToast.js";
64
64
  import { default as default64 } from "./hooks/useImage/useImage.js";
65
- import { default as default65 } from "./hooks/useIsAdml/useIsAdml.js";
66
- import { default as default66 } from "./hooks/useKeyPress/useKeyPress.js";
67
- import { default as default67 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
68
- import { default as default68 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
69
- import { default as default69 } from "./hooks/useScrollToTop/useScrollToTop.js";
70
- import { default as default70 } from "./hooks/useTitle/useTitle.js";
71
- import { default as default71 } from "./hooks/useToast/useToast.js";
72
- import { default as default72 } from "./hooks/useToggle/useToggle.js";
73
- import { default as default73 } from "./hooks/useTrapFocus/useTrapFocus.js";
74
- import { default as default74 } from "./hooks/useTrashedResource/useTrashedResource.js";
75
- import { default as default75 } from "./hooks/useUpload/useUpload.js";
76
- import { default as default76 } from "./hooks/useUploadFiles/useUploadFiles.js";
77
- import { default as default77 } from "./hooks/useUser/useUser.js";
78
- import { default as default78 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
79
- import { default as default79 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
80
- import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default80 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
81
- import { default as default81 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
82
- import { default as default82 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
83
- import { default as default83 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
84
- import { default as default84 } from "./modules/modals/ConfirmModal/ConfirmModal.js";
85
- import { default as default85 } from "./modules/modals/OnboardingModal/OnboardingModal.js";
86
- import { default as default86 } from "./modules/modals/PublishModal/PublishModal.js";
87
- import { default as default87 } from "./modules/modals/ResourceModal/apps/BlogPublic.js";
88
- import { default as default88 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
89
- import { default as default89 } from "./modules/modals/ShareModal/ShareModal.js";
90
- import { default as default90 } from "./modules/modals/ShareModal/apps/ShareBlog.js";
91
- import { default as default91 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
92
- import { default as default92 } from "./modules/multimedia/AudioRecorder/AudioRecorder.js";
93
- import { default as default93 } from "./modules/multimedia/Embed/Embed.js";
94
- import { default as default94 } from "./modules/multimedia/ImageEditor/components/ImageEditor.js";
95
- import { default as default95 } from "./modules/multimedia/ImagePicker/ImagePicker.js";
96
- import { default as default96 } from "./modules/multimedia/FileCard/FileCard.js";
97
- import { default as default97 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
98
- import { default as default98 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
99
- import { default as default99 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
100
- import { default as default100 } from "./modules/multimedia/Workspace/Workspace.js";
101
- import { default as default101 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
65
+ import { default as default65 } from "./hooks/useInfiniteScroll/useInfiniteScroll.js";
66
+ import { default as default66 } from "./hooks/useIsAdml/useIsAdml.js";
67
+ import { default as default67 } from "./hooks/useKeyPress/useKeyPress.js";
68
+ import { default as default68 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
69
+ import { default as default69 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
70
+ import { default as default70 } from "./hooks/useScrollToTop/useScrollToTop.js";
71
+ import { default as default71 } from "./hooks/useTitle/useTitle.js";
72
+ import { default as default72 } from "./hooks/useToast/useToast.js";
73
+ import { default as default73 } from "./hooks/useToggle/useToggle.js";
74
+ import { default as default74 } from "./hooks/useTrapFocus/useTrapFocus.js";
75
+ import { default as default75 } from "./hooks/useTrashedResource/useTrashedResource.js";
76
+ import { default as default76 } from "./hooks/useUpload/useUpload.js";
77
+ import { default as default77 } from "./hooks/useUploadFiles/useUploadFiles.js";
78
+ import { default as default78 } from "./hooks/useUser/useUser.js";
79
+ import { default as default79 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
80
+ import { default as default80 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
81
+ import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default81 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
82
+ import { default as default82 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
83
+ import { default as default83 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
84
+ import { default as default84 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
85
+ import { default as default85 } from "./modules/modals/ConfirmModal/ConfirmModal.js";
86
+ import { default as default86 } from "./modules/modals/OnboardingModal/OnboardingModal.js";
87
+ import { default as default87 } from "./modules/modals/PublishModal/PublishModal.js";
88
+ import { default as default88 } from "./modules/modals/ResourceModal/apps/BlogPublic.js";
89
+ import { default as default89 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
90
+ import { default as default90 } from "./modules/modals/ShareModal/ShareModal.js";
91
+ import { default as default91 } from "./modules/modals/ShareModal/apps/ShareBlog.js";
92
+ import { default as default92 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
93
+ import { default as default93 } from "./modules/multimedia/AudioRecorder/AudioRecorder.js";
94
+ import { default as default94 } from "./modules/multimedia/Embed/Embed.js";
95
+ import { default as default95 } from "./modules/multimedia/ImageEditor/components/ImageEditor.js";
96
+ import { default as default96 } from "./modules/multimedia/ImagePicker/ImagePicker.js";
97
+ import { default as default97 } from "./modules/multimedia/FileCard/FileCard.js";
98
+ import { default as default98 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
99
+ import { default as default99 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
100
+ import { default as default100 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
101
+ import { default as default101 } from "./modules/multimedia/Workspace/Workspace.js";
102
+ import { default as default102 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
102
103
  import { AccessiblePalette, DefaultPalette } from "./components/ColorPicker/ColorPalette.js";
103
104
  import { Divider } from "./components/Divider/Divider.js";
104
105
  import { DropzoneContext, useDropzoneContext } from "./components/Dropzone/DropzoneContext.js";
@@ -128,6 +129,7 @@ import { useEdificeTheme } from "./providers/EdificeThemeProvider/EdificeThemePr
128
129
  import { MockedProvider } from "./providers/MockedProvider/MockedProvider.js";
129
130
  import { checkUserRight } from "./utilities/check-user-rights/check-user-rights.js";
130
131
  import { emptyScreenMapping } from "./utilities/emptyscreen-mapping/emptyscreen-mapping.js";
132
+ import { invalidateQueriesWithFirstPage } from "./utilities/react-query/react-query-utils.js";
131
133
  import { mergeRefs, setRef } from "./utilities/refs/ref.js";
132
134
  export {
133
135
  AccessiblePalette,
@@ -136,11 +138,11 @@ export {
136
138
  default4 as AppHeader,
137
139
  default5 as AppIcon,
138
140
  default6 as Attachment,
139
- default92 as AudioRecorder,
141
+ default93 as AudioRecorder,
140
142
  default7 as Avatar,
141
143
  default8 as AvatarGroup,
142
144
  default9 as Badge,
143
- default87 as BlogPublic,
145
+ default88 as BlogPublic,
144
146
  default10 as Breadcrumb,
145
147
  default11 as Button,
146
148
  default37 as ButtonSkeleton,
@@ -150,7 +152,7 @@ export {
150
152
  default17 as ColorPickerItem,
151
153
  Column,
152
154
  default18 as Combobox,
153
- default84 as ConfirmModal,
155
+ default85 as ConfirmModal,
154
156
  DefaultPalette,
155
157
  Divider,
156
158
  DndTree,
@@ -161,10 +163,10 @@ export {
161
163
  EdificeClientProvider,
162
164
  EdificeThemeContext,
163
165
  EdificeThemeProvider,
164
- default93 as Embed,
166
+ default94 as Embed,
165
167
  default21 as EmptyScreen,
166
168
  ExternalLinker,
167
- default96 as FileCard,
169
+ default97 as FileCard,
168
170
  default22 as Flex,
169
171
  default24 as FormControl,
170
172
  default23 as FormText,
@@ -172,8 +174,8 @@ export {
172
174
  default25 as Heading,
173
175
  default12 as IconButton,
174
176
  default26 as Image,
175
- default94 as ImageEditor,
176
- default95 as ImagePicker,
177
+ default95 as ImageEditor,
178
+ default96 as ImagePicker,
177
179
  default27 as Input,
178
180
  InternalLinker,
179
181
  default28 as Label,
@@ -182,25 +184,25 @@ export {
182
184
  default29 as Loading,
183
185
  default30 as LoadingScreen,
184
186
  default31 as Logo,
185
- default97 as MediaLibrary,
187
+ default98 as MediaLibrary,
186
188
  Menu,
187
189
  MockedProvider,
188
190
  default32 as Modal,
189
- default85 as OnboardingModal,
191
+ default86 as OnboardingModal,
190
192
  Popover,
191
193
  PopoverBody,
192
194
  PopoverFooter,
193
195
  PopoverHeader,
194
196
  default33 as PreventPropagation,
195
- default86 as PublishModal,
197
+ default87 as PublishModal,
196
198
  default34 as Radio,
197
199
  ResourceModal,
198
200
  default35 as SearchBar,
199
201
  default13 as SearchButton,
200
202
  default36 as Select,
201
203
  SeparatedInfo,
202
- default90 as ShareBlog,
203
- default89 as ShareModal,
204
+ default91 as ShareBlog,
205
+ default90 as ShareModal,
204
206
  default45 as SortableTree,
205
207
  default39 as StackedGroup,
206
208
  default40 as Stepper,
@@ -215,13 +217,13 @@ export {
215
217
  TreeNode,
216
218
  TreeNodeFolderWrapper,
217
219
  default47 as TreeView,
218
- default98 as VideoEmbed,
219
- default99 as VideoRecorder,
220
+ default99 as VideoEmbed,
221
+ default100 as VideoRecorder,
220
222
  default48 as VisuallyHidden,
221
223
  WORKSPACE_SHARED_FOLDER_ID,
222
224
  WORKSPACE_USER_FOLDER_ID,
223
- default100 as Workspace,
224
- default101 as WorkspaceFolders,
225
+ default101 as Workspace,
226
+ default102 as WorkspaceFolders,
225
227
  addNode,
226
228
  arrayUnique,
227
229
  buildTree,
@@ -243,6 +245,7 @@ export {
243
245
  getIndicesToUpdate,
244
246
  getProjection,
245
247
  hasChildren,
248
+ invalidateQueriesWithFirstPage,
246
249
  mergeRefs,
247
250
  modifyNode,
248
251
  moveNode,
@@ -269,28 +272,29 @@ export {
269
272
  default62 as useHover,
270
273
  default63 as useHttpErrorToast,
271
274
  default64 as useImage,
272
- default65 as useIsAdml,
273
- default66 as useKeyPress,
274
- default67 as useLibraryUrl,
275
- default68 as useMediaLibrary,
276
- default69 as useScrollToTop,
277
- default91 as useShareMutation,
278
- default70 as useTitle,
279
- default71 as useToast,
280
- default72 as useToggle,
281
- default73 as useTrapFocus,
282
- default74 as useTrashedResource,
275
+ default65 as useInfiniteScroll,
276
+ default66 as useIsAdml,
277
+ default67 as useKeyPress,
278
+ default68 as useLibraryUrl,
279
+ default69 as useMediaLibrary,
280
+ default70 as useScrollToTop,
281
+ default92 as useShareMutation,
282
+ default71 as useTitle,
283
+ default72 as useToast,
284
+ default73 as useToggle,
285
+ default74 as useTrapFocus,
286
+ default75 as useTrashedResource,
283
287
  useTreeSortable,
284
288
  useTreeView,
285
- default88 as useUpdateMutation,
286
- default75 as useUpload,
287
- default76 as useUploadFiles,
288
- default77 as useUser,
289
- default78 as useWorkspaceFile,
290
- default79 as useWorkspaceFolders,
291
- default80 as useWorkspaceFoldersTree,
292
- default81 as useWorkspaceSearch,
293
- default82 as useXitiTrackPageLoad,
294
- default83 as useZendeskGuide,
289
+ default89 as useUpdateMutation,
290
+ default76 as useUpload,
291
+ default77 as useUploadFiles,
292
+ default78 as useUser,
293
+ default79 as useWorkspaceFile,
294
+ default80 as useWorkspaceFolders,
295
+ default81 as useWorkspaceFoldersTree,
296
+ default82 as useWorkspaceSearch,
297
+ default83 as useXitiTrackPageLoad,
298
+ default84 as useZendeskGuide,
295
299
  wrapTreeNode
296
300
  };
@@ -1,3 +1,4 @@
1
1
  export * from './check-user-rights';
2
2
  export * from './emptyscreen-mapping';
3
+ export * from './react-query';
3
4
  export * from './refs';
@@ -0,0 +1 @@
1
+ export * from './react-query-utils';
@@ -0,0 +1,21 @@
1
+ import { InvalidateQueryFilters, QueryClient } from '../../node_modules/@tanstack/react-query';
2
+ /**
3
+ * Invalidates queries and resets infinite query data to only contain the first page.
4
+ *
5
+ * This utility function is useful when you want to invalidate a query but also ensure
6
+ * that any infinite query data is reset to show only the first page, removing any
7
+ * previously loaded subsequent pages.
8
+ *
9
+ * @param queryClient - The TanStack Query client instance used to manage queries
10
+ * @param options - The invalidate query filters that specify which queries to invalidate
11
+ * @returns The result of the invalidateQueries operation, or undefined if no queryKey is provided
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Invalidate user queries and reset to first page only
16
+ * invalidateQueriesWithFirstPage(queryClient, {
17
+ * queryKey: ['users']
18
+ * });
19
+ * ```
20
+ */
21
+ export declare function invalidateQueriesWithFirstPage(queryClient: QueryClient, options: InvalidateQueryFilters): Promise<void> | undefined;
@@ -0,0 +1,13 @@
1
+ function invalidateQueriesWithFirstPage(queryClient, options) {
2
+ if (options.queryKey)
3
+ return queryClient.setQueriesData({
4
+ queryKey: options.queryKey
5
+ }, (oldData) => oldData != null && oldData.pages ? {
6
+ ...oldData,
7
+ pages: [oldData.pages[0]],
8
+ pageParams: [oldData.pageParams[0]]
9
+ } : oldData), queryClient.invalidateQueries(options);
10
+ }
11
+ export {
12
+ invalidateQueriesWithFirstPage
13
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edifice.io/react",
3
- "version": "2.3.2-develop-b2school-actualites.20251027110554",
3
+ "version": "2.3.2-develop-b2school-actualites.20251103102719",
4
4
  "description": "Edifice React Library",
5
5
  "keywords": [
6
6
  "react",
@@ -131,9 +131,9 @@
131
131
  "react-slugify": "^3.0.3",
132
132
  "swiper": "^10.1.0",
133
133
  "ua-parser-js": "^1.0.36",
134
- "@edifice.io/bootstrap": "2.3.2-develop-b2school-actualites.20251027110554",
135
- "@edifice.io/utilities": "2.3.2-develop-b2school-actualites.20251027110554",
136
- "@edifice.io/tiptap-extensions": "2.3.2-develop-b2school-actualites.20251027110554"
134
+ "@edifice.io/bootstrap": "2.3.2-develop-b2school-actualites.20251103102719",
135
+ "@edifice.io/tiptap-extensions": "2.3.2-develop-b2school-actualites.20251103102719",
136
+ "@edifice.io/utilities": "2.3.2-develop-b2school-actualites.20251103102719"
137
137
  },
138
138
  "devDependencies": {
139
139
  "@babel/plugin-transform-react-pure-annotations": "^7.23.3",
@@ -164,8 +164,8 @@
164
164
  "vite": "^5.4.11",
165
165
  "vite-plugin-dts": "^4.1.0",
166
166
  "vite-tsconfig-paths": "^5.0.1",
167
- "@edifice.io/config": "2.3.2-develop-b2school-actualites.20251027110554",
168
- "@edifice.io/client": "2.3.2-develop-b2school-actualites.20251027110554"
167
+ "@edifice.io/client": "2.3.2-develop-b2school-actualites.20251103102719",
168
+ "@edifice.io/config": "2.3.2-develop-b2school-actualites.20251103102719"
169
169
  },
170
170
  "peerDependencies": {
171
171
  "@react-spring/web": "^9.7.5",