@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.
- package/CHANGELOG.md +180 -0
- package/dist/components/canAccess/index.d.ts.map +1 -1
- package/dist/contexts/refine/IRefineContext.d.ts +3 -0
- package/dist/contexts/refine/IRefineContext.d.ts.map +1 -1
- package/dist/contexts/refine/index.d.ts.map +1 -1
- package/dist/definitions/helpers/generateDocumentTitle/index.d.ts.map +1 -1
- package/dist/definitions/helpers/handleRefineOptions/index.d.ts.map +1 -1
- package/dist/definitions/helpers/pick-resource/index.d.ts.map +1 -1
- package/dist/esm/index.js +6 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/hooks/data/useCreate.d.ts +3 -2
- package/dist/hooks/data/useCreate.d.ts.map +1 -1
- package/dist/hooks/data/useCreateMany.d.ts +3 -2
- package/dist/hooks/data/useCreateMany.d.ts.map +1 -1
- package/dist/hooks/data/useCustom.d.ts +3 -2
- package/dist/hooks/data/useCustom.d.ts.map +1 -1
- package/dist/hooks/data/useCustomMutation.d.ts +3 -2
- package/dist/hooks/data/useCustomMutation.d.ts.map +1 -1
- package/dist/hooks/data/useDelete.d.ts +4 -3
- package/dist/hooks/data/useDelete.d.ts.map +1 -1
- package/dist/hooks/data/useDeleteMany.d.ts +4 -3
- package/dist/hooks/data/useDeleteMany.d.ts.map +1 -1
- package/dist/hooks/data/useInfiniteList.d.ts +3 -2
- package/dist/hooks/data/useInfiniteList.d.ts.map +1 -1
- package/dist/hooks/data/useList.d.ts +3 -2
- package/dist/hooks/data/useList.d.ts.map +1 -1
- package/dist/hooks/data/useMany.d.ts +3 -2
- package/dist/hooks/data/useMany.d.ts.map +1 -1
- package/dist/hooks/data/useOne.d.ts +3 -2
- package/dist/hooks/data/useOne.d.ts.map +1 -1
- package/dist/hooks/data/useUpdate.d.ts +4 -3
- package/dist/hooks/data/useUpdate.d.ts.map +1 -1
- package/dist/hooks/data/useUpdateMany.d.ts +4 -3
- package/dist/hooks/data/useUpdateMany.d.ts.map +1 -1
- package/dist/hooks/export/index.d.ts.map +1 -1
- package/dist/hooks/form/useForm.d.ts +4 -3
- package/dist/hooks/form/useForm.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/live/useResourceSubscription/index.d.ts +1 -1
- package/dist/hooks/live/useResourceSubscription/index.d.ts.map +1 -1
- package/dist/hooks/resource/useResource/index.d.ts +11 -1
- package/dist/hooks/resource/useResource/index.d.ts.map +1 -1
- package/dist/hooks/show/useShow.d.ts +4 -3
- package/dist/hooks/show/useShow.d.ts.map +1 -1
- package/dist/hooks/useLoadingOvertime/index.d.ts +49 -0
- package/dist/hooks/useLoadingOvertime/index.d.ts.map +1 -0
- package/dist/hooks/useSelect/index.d.ts +3 -2
- package/dist/hooks/useSelect/index.d.ts.map +1 -1
- package/dist/hooks/useTable/index.d.ts +4 -3
- package/dist/hooks/useTable/index.d.ts.map +1 -1
- package/dist/iife/index.js +6 -6
- package/dist/iife/index.js.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/canAccess/index.tsx +17 -92
- package/src/contexts/refine/IRefineContext.ts +3 -0
- package/src/contexts/refine/index.tsx +3 -0
- package/src/definitions/helpers/generateDocumentTitle/index.ts +5 -3
- package/src/definitions/helpers/handleRefineOptions/index.ts +1 -0
- package/src/definitions/helpers/pick-resource/index.ts +4 -3
- package/src/hooks/data/useCreate.ts +49 -23
- package/src/hooks/data/useCreateMany.ts +54 -26
- package/src/hooks/data/useCustom.ts +17 -3
- package/src/hooks/data/useCustomMutation.ts +16 -3
- package/src/hooks/data/useDelete.ts +60 -31
- package/src/hooks/data/useDeleteMany.ts +64 -31
- package/src/hooks/data/useInfiniteList.ts +30 -14
- package/src/hooks/data/useList.ts +30 -20
- package/src/hooks/data/useMany.ts +34 -23
- package/src/hooks/data/useOne.ts +36 -22
- package/src/hooks/data/useUpdate.ts +55 -32
- package/src/hooks/data/useUpdateMany.ts +69 -33
- package/src/hooks/export/index.ts +12 -11
- package/src/hooks/form/useForm.ts +46 -98
- package/src/hooks/import/index.tsx +17 -17
- package/src/hooks/index.ts +1 -0
- package/src/hooks/live/useResourceSubscription/index.ts +6 -3
- package/src/hooks/resource/useResource/index.ts +48 -1
- package/src/hooks/show/useShow.ts +34 -80
- package/src/hooks/useLoadingOvertime/index.ts +114 -0
- package/src/hooks/useSelect/index.ts +21 -14
- 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 {
|
|
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
|
|
202
|
+
const getMeta = useMeta();
|
|
203
203
|
|
|
204
204
|
const combinedMeta = getMeta({
|
|
205
|
-
resource
|
|
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
|
|
369
|
+
typeof identifier === "undefined",
|
|
365
370
|
`useTable: \`resource\` is not defined.`,
|
|
366
371
|
);
|
|
367
|
-
}, [
|
|
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:
|
|
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
|
}
|