@refinedev/core 4.22.0 → 4.24.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.
Files changed (84) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/dist/components/canAccess/index.d.ts.map +1 -1
  3. package/dist/contexts/refine/IRefineContext.d.ts +3 -0
  4. package/dist/contexts/refine/IRefineContext.d.ts.map +1 -1
  5. package/dist/contexts/refine/index.d.ts.map +1 -1
  6. package/dist/definitions/helpers/generateDocumentTitle/index.d.ts.map +1 -1
  7. package/dist/definitions/helpers/handleRefineOptions/index.d.ts.map +1 -1
  8. package/dist/definitions/helpers/pick-resource/index.d.ts.map +1 -1
  9. package/dist/esm/index.js +6 -6
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/hooks/data/useCreate.d.ts +3 -2
  12. package/dist/hooks/data/useCreate.d.ts.map +1 -1
  13. package/dist/hooks/data/useCreateMany.d.ts +3 -2
  14. package/dist/hooks/data/useCreateMany.d.ts.map +1 -1
  15. package/dist/hooks/data/useCustom.d.ts +3 -2
  16. package/dist/hooks/data/useCustom.d.ts.map +1 -1
  17. package/dist/hooks/data/useCustomMutation.d.ts +3 -2
  18. package/dist/hooks/data/useCustomMutation.d.ts.map +1 -1
  19. package/dist/hooks/data/useDelete.d.ts +4 -3
  20. package/dist/hooks/data/useDelete.d.ts.map +1 -1
  21. package/dist/hooks/data/useDeleteMany.d.ts +4 -3
  22. package/dist/hooks/data/useDeleteMany.d.ts.map +1 -1
  23. package/dist/hooks/data/useInfiniteList.d.ts +3 -2
  24. package/dist/hooks/data/useInfiniteList.d.ts.map +1 -1
  25. package/dist/hooks/data/useList.d.ts +3 -2
  26. package/dist/hooks/data/useList.d.ts.map +1 -1
  27. package/dist/hooks/data/useMany.d.ts +3 -2
  28. package/dist/hooks/data/useMany.d.ts.map +1 -1
  29. package/dist/hooks/data/useOne.d.ts +3 -2
  30. package/dist/hooks/data/useOne.d.ts.map +1 -1
  31. package/dist/hooks/data/useUpdate.d.ts +4 -3
  32. package/dist/hooks/data/useUpdate.d.ts.map +1 -1
  33. package/dist/hooks/data/useUpdateMany.d.ts +4 -3
  34. package/dist/hooks/data/useUpdateMany.d.ts.map +1 -1
  35. package/dist/hooks/export/index.d.ts.map +1 -1
  36. package/dist/hooks/form/useForm.d.ts +4 -3
  37. package/dist/hooks/form/useForm.d.ts.map +1 -1
  38. package/dist/hooks/index.d.ts +1 -0
  39. package/dist/hooks/index.d.ts.map +1 -1
  40. package/dist/hooks/live/useResourceSubscription/index.d.ts +1 -1
  41. package/dist/hooks/live/useResourceSubscription/index.d.ts.map +1 -1
  42. package/dist/hooks/resource/useResource/index.d.ts +11 -1
  43. package/dist/hooks/resource/useResource/index.d.ts.map +1 -1
  44. package/dist/hooks/show/useShow.d.ts +4 -3
  45. package/dist/hooks/show/useShow.d.ts.map +1 -1
  46. package/dist/hooks/useLoadingOvertime/index.d.ts +49 -0
  47. package/dist/hooks/useLoadingOvertime/index.d.ts.map +1 -0
  48. package/dist/hooks/useSelect/index.d.ts +3 -2
  49. package/dist/hooks/useSelect/index.d.ts.map +1 -1
  50. package/dist/hooks/useTable/index.d.ts +4 -3
  51. package/dist/hooks/useTable/index.d.ts.map +1 -1
  52. package/dist/iife/index.js +6 -6
  53. package/dist/iife/index.js.map +1 -1
  54. package/dist/index.js +6 -6
  55. package/dist/index.js.map +1 -1
  56. package/package.json +1 -1
  57. package/src/components/canAccess/index.tsx +17 -92
  58. package/src/contexts/refine/IRefineContext.ts +3 -0
  59. package/src/contexts/refine/index.tsx +3 -0
  60. package/src/definitions/helpers/generateDocumentTitle/index.ts +5 -3
  61. package/src/definitions/helpers/handleRefineOptions/index.ts +1 -0
  62. package/src/definitions/helpers/pick-resource/index.ts +4 -3
  63. package/src/hooks/data/useCreate.ts +49 -23
  64. package/src/hooks/data/useCreateMany.ts +54 -26
  65. package/src/hooks/data/useCustom.ts +17 -3
  66. package/src/hooks/data/useCustomMutation.ts +16 -3
  67. package/src/hooks/data/useDelete.ts +60 -31
  68. package/src/hooks/data/useDeleteMany.ts +64 -31
  69. package/src/hooks/data/useInfiniteList.ts +30 -14
  70. package/src/hooks/data/useList.ts +30 -20
  71. package/src/hooks/data/useMany.ts +34 -23
  72. package/src/hooks/data/useOne.ts +36 -22
  73. package/src/hooks/data/useUpdate.ts +55 -32
  74. package/src/hooks/data/useUpdateMany.ts +69 -33
  75. package/src/hooks/export/index.ts +12 -11
  76. package/src/hooks/form/useForm.ts +46 -98
  77. package/src/hooks/import/index.tsx +17 -17
  78. package/src/hooks/index.ts +1 -0
  79. package/src/hooks/live/useResourceSubscription/index.ts +6 -3
  80. package/src/hooks/resource/useResource/index.ts +48 -1
  81. package/src/hooks/show/useShow.ts +34 -80
  82. package/src/hooks/useLoadingOvertime/index.ts +114 -0
  83. package/src/hooks/useSelect/index.ts +21 -14
  84. package/src/hooks/useTable/index.ts +22 -8
@@ -0,0 +1,114 @@
1
+ import { useEffect, useState } from "react";
2
+ import { useRefineContext } from "..";
3
+
4
+ export type UseLoadingOvertimeRefineContext = Omit<
5
+ UseLoadingOvertimeCoreProps,
6
+ "isLoading" | "interval"
7
+ > &
8
+ Required<Pick<UseLoadingOvertimeCoreProps, "interval">>;
9
+
10
+ export type UseLoadingOvertimeOptionsProps = {
11
+ overtimeOptions?: UseLoadingOvertimeCoreOptions;
12
+ };
13
+
14
+ export type UseLoadingOvertimeReturnType = {
15
+ overtime: {
16
+ elapsedTime?: number;
17
+ };
18
+ };
19
+
20
+ type UseLoadingOvertimeCoreOptions = Omit<
21
+ UseLoadingOvertimeCoreProps,
22
+ "isLoading"
23
+ >;
24
+
25
+ type UseLoadingOvertimeCoreReturnType = {
26
+ elapsedTime?: number;
27
+ };
28
+
29
+ export type UseLoadingOvertimeCoreProps = {
30
+ /**
31
+ * The loading state. If true, the elapsed time will be calculated.
32
+ */
33
+ isLoading: boolean;
34
+
35
+ /**
36
+ * The interval in milliseconds. If the loading time exceeds this time, the `onInterval` callback will be called.
37
+ * If not specified, the `interval` value from the `overtime` option of the `RefineProvider` will be used.
38
+ *
39
+ * @default: 1000 (1 second)
40
+ */
41
+ interval?: number;
42
+
43
+ /**
44
+ * The callback function that will be called when the loading time exceeds the specified time.
45
+ * If not specified, the `onInterval` value from the `overtime` option of the `RefineProvider` will be used.
46
+ *
47
+ * @param elapsedInterval The elapsed time in milliseconds.
48
+ */
49
+ onInterval?: (elapsedInterval: number) => void;
50
+ };
51
+
52
+ /**
53
+ * if you need to do something when the loading time exceeds the specified time, refine provides the `useLoadingOvertime` hook.
54
+ * It returns the elapsed time in milliseconds.
55
+ *
56
+ * @example
57
+ * const { elapsedTime } = useLoadingOvertime({
58
+ * isLoading,
59
+ * interval: 1000,
60
+ * onInterval(elapsedInterval) {
61
+ * console.log("loading overtime", elapsedInterval);
62
+ * },
63
+ * });
64
+ */
65
+ export const useLoadingOvertime = ({
66
+ isLoading,
67
+ interval: intervalProp,
68
+ onInterval: onIntervalProp,
69
+ }: UseLoadingOvertimeCoreProps): UseLoadingOvertimeCoreReturnType => {
70
+ const [elapsedTime, setElapsedTime] = useState<number | undefined>(
71
+ undefined,
72
+ );
73
+ // get overtime options from refine context
74
+ const { options } = useRefineContext();
75
+ const { overtime } = options;
76
+
77
+ // pick props or refine context options
78
+ const interval = intervalProp ?? overtime.interval;
79
+ const onInterval = onIntervalProp ?? overtime?.onInterval;
80
+
81
+ useEffect(() => {
82
+ let intervalFn: ReturnType<typeof setInterval>;
83
+
84
+ if (isLoading) {
85
+ intervalFn = setInterval(() => {
86
+ // increase elapsed time
87
+ setElapsedTime((prevElapsedTime) => {
88
+ if (prevElapsedTime === undefined) {
89
+ return interval;
90
+ }
91
+
92
+ return prevElapsedTime + interval;
93
+ });
94
+ }, interval);
95
+ }
96
+
97
+ return () => {
98
+ clearInterval(intervalFn);
99
+ // reset elapsed time
100
+ setElapsedTime(undefined);
101
+ };
102
+ }, [isLoading, interval]);
103
+
104
+ useEffect(() => {
105
+ // call onInterval callback
106
+ if (onInterval && elapsedTime) {
107
+ onInterval(elapsedTime);
108
+ }
109
+ }, [elapsedTime]);
110
+
111
+ return {
112
+ elapsedTime,
113
+ };
114
+ };
@@ -21,9 +21,13 @@ import {
21
21
  Prettify,
22
22
  } from "../../interfaces";
23
23
  import { pickNotDeprecated } from "@definitions/helpers";
24
- import { pickResource } from "@definitions/helpers/pick-resource";
25
24
  import { useResource } from "../resource/useResource/index";
26
25
  import { BaseListProps } from "../data/useList";
26
+ import {
27
+ useLoadingOvertime,
28
+ UseLoadingOvertimeOptionsProps,
29
+ UseLoadingOvertimeReturnType,
30
+ } from "../useLoadingOvertime";
27
31
 
28
32
  export type UseSelectProps<TQueryFnData, TError, TData> = {
29
33
  /**
@@ -132,14 +136,15 @@ export type UseSelectProps<TQueryFnData, TError, TData> = {
132
136
  TError,
133
137
  Prettify<BaseListProps>
134
138
  > &
135
- LiveModeProps;
139
+ LiveModeProps &
140
+ UseLoadingOvertimeOptionsProps;
136
141
 
137
142
  export type UseSelectReturnType<TData extends BaseRecord = BaseRecord> = {
138
143
  queryResult: QueryObserverResult<GetListResponse<TData>>;
139
144
  defaultValueQueryResult: QueryObserverResult<GetManyResponse<TData>>;
140
145
  onSearch: (value: string) => void;
141
146
  options: Option[];
142
- };
147
+ } & UseLoadingOvertimeReturnType;
143
148
 
144
149
  /**
145
150
  * `useSelect` hook is used to fetch data from the dataProvider and return the options for the select box.
@@ -189,20 +194,15 @@ export const useSelect = <
189
194
  meta,
190
195
  metaData,
191
196
  dataProviderName,
197
+ overtimeOptions,
192
198
  } = props;
193
199
 
194
- const { resources } = useResource();
195
- const getMeta = useMeta();
196
-
197
- /**
198
- * Since `identifier` is an optional but prioritized way to match resources, users can provide identifier instead of resource name.
199
- */
200
- const pickedResource = pickResource(resourceFromProps, resources);
200
+ const { resource, identifier } = useResource(resourceFromProps);
201
201
 
202
- const resource = pickedResource?.name ?? resourceFromProps;
202
+ const getMeta = useMeta();
203
203
 
204
204
  const combinedMeta = getMeta({
205
- resource: pickedResource,
205
+ resource,
206
206
  meta: pickNotDeprecated(meta, metaData),
207
207
  });
208
208
 
@@ -226,7 +226,7 @@ export const useSelect = <
226
226
  defaultValueQueryOptionsFromProps ?? (queryOptions as any);
227
227
 
228
228
  const defaultValueQueryResult = useMany<TQueryFnData, TError, TData>({
229
- resource,
229
+ resource: identifier,
230
230
  ids: defaultValues,
231
231
  queryOptions: {
232
232
  ...defaultValueQueryOptions,
@@ -259,7 +259,7 @@ export const useSelect = <
259
259
  );
260
260
 
261
261
  const queryResult = useList<TQueryFnData, TError, TData>({
262
- resource,
262
+ resource: identifier,
263
263
  sorters: pickNotDeprecated(sorters, sort),
264
264
  filters: filters.concat(search),
265
265
  pagination: {
@@ -305,6 +305,12 @@ export const useSelect = <
305
305
  }
306
306
  };
307
307
 
308
+ const { elapsedTime } = useLoadingOvertime({
309
+ isLoading: queryResult.isFetching || defaultValueQueryResult.isFetching,
310
+ interval: overtimeOptions?.interval,
311
+ onInterval: overtimeOptions?.onInterval,
312
+ });
313
+
308
314
  return {
309
315
  queryResult,
310
316
  defaultValueQueryResult,
@@ -313,5 +319,6 @@ export const useSelect = <
313
319
  [options, selectedOptions],
314
320
  ),
315
321
  onSearch: debounce(onSearch, debounceValue),
322
+ overtime: { elapsedTime },
316
323
  };
317
324
  };
@@ -40,6 +40,11 @@ import {
40
40
  } from "../../interfaces";
41
41
  import { useGo } from "@hooks/router/use-go";
42
42
  import { BaseListProps } from "../data/useList";
43
+ import {
44
+ useLoadingOvertime,
45
+ UseLoadingOvertimeOptionsProps,
46
+ UseLoadingOvertimeReturnType,
47
+ } from "../useLoadingOvertime";
43
48
 
44
49
  type SetFilterBehavior = "merge" | "replace";
45
50
 
@@ -173,7 +178,8 @@ export type useTableProps<TQueryFnData, TError, TData> = {
173
178
  TError,
174
179
  Prettify<BaseListProps>
175
180
  > &
176
- LiveModeProps;
181
+ LiveModeProps &
182
+ UseLoadingOvertimeOptionsProps;
177
183
 
178
184
  type ReactSetState<T> = React.Dispatch<React.SetStateAction<T>>;
179
185
 
@@ -211,7 +217,7 @@ export type useTableReturnType<
211
217
  pageSize: number;
212
218
  setPageSize: ReactSetState<useTableReturnType["pageSize"]>;
213
219
  pageCount: number;
214
- };
220
+ } & UseLoadingOvertimeReturnType;
215
221
 
216
222
  /**
217
223
  * By using useTable, you are able to get properties that are compatible with
@@ -256,6 +262,7 @@ export function useTable<
256
262
  meta,
257
263
  metaData,
258
264
  dataProviderName,
265
+ overtimeOptions,
259
266
  }: useTableProps<TQueryFnData, TError, TData> = {}): useTableReturnType<
260
267
  TData,
261
268
  TError
@@ -350,21 +357,19 @@ export function useTable<
350
357
  /** New way of `replace` calls to the router is using `useGo` */
351
358
  const go = useGo();
352
359
 
353
- const { resource } = useResource(resourceFromProp);
360
+ const { resource, identifier } = useResource(resourceFromProp);
354
361
 
355
362
  const combinedMeta = getMeta({
356
363
  resource,
357
364
  meta: preferredMeta,
358
365
  });
359
366
 
360
- const resourceInUse = resource?.name;
361
-
362
367
  React.useEffect(() => {
363
368
  warnOnce(
364
- typeof resourceInUse === "undefined",
369
+ typeof identifier === "undefined",
365
370
  `useTable: \`resource\` is not defined.`,
366
371
  );
367
- }, [resourceInUse]);
372
+ }, [identifier]);
368
373
 
369
374
  const [sorters, setSorters] = useState<CrudSorting>(
370
375
  setInitialSorters(preferredPermanentSorters, defaultSorter ?? []),
@@ -509,7 +514,7 @@ export function useTable<
509
514
  }, [syncWithLocation, current, pageSize, sorters, filters]);
510
515
 
511
516
  const queryResult = useList<TQueryFnData, TError, TData>({
512
- resource: resourceInUse,
517
+ resource: identifier,
513
518
  hasPagination,
514
519
  pagination: { current, pageSize, mode: pagination?.mode },
515
520
  filters: isServerSideFilteringEnabled
@@ -566,6 +571,12 @@ export function useTable<
566
571
  setSorters(() => unionSorters(preferredPermanentSorters, newSorter));
567
572
  };
568
573
 
574
+ const { elapsedTime } = useLoadingOvertime({
575
+ isLoading: queryResult.isFetching,
576
+ interval: overtimeOptions?.interval,
577
+ onInterval: overtimeOptions?.onInterval,
578
+ });
579
+
569
580
  return {
570
581
  tableQueryResult: queryResult,
571
582
  sorters,
@@ -582,5 +593,8 @@ export function useTable<
582
593
  ? Math.ceil((queryResult.data?.total ?? 0) / pageSize)
583
594
  : 1,
584
595
  createLinkForSyncWithLocation,
596
+ overtime: {
597
+ elapsedTime,
598
+ },
585
599
  };
586
600
  }