@qiaopeng/tanstack-query-plus 0.5.9 → 0.5.10
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/README.md +86 -55
- package/dist/{types/base.d.ts → base-CHnwqfyz.d.cts} +12 -14
- package/dist/base-CHnwqfyz.d.ts +52 -0
- package/dist/chunk-52ZO6Y67.cjs +1121 -0
- package/dist/chunk-52ZO6Y67.cjs.map +1 -0
- package/dist/chunk-5J6OXSLW.cjs +36 -0
- package/dist/chunk-5J6OXSLW.cjs.map +1 -0
- package/dist/chunk-6MAYHLTE.cjs +310 -0
- package/dist/chunk-6MAYHLTE.cjs.map +1 -0
- package/dist/chunk-ADS2QTMP.js +144 -0
- package/dist/chunk-ADS2QTMP.js.map +1 -0
- package/dist/chunk-APXNNHBD.cjs +374 -0
- package/dist/chunk-APXNNHBD.cjs.map +1 -0
- package/dist/chunk-AXMWOGNX.js +134 -0
- package/dist/chunk-AXMWOGNX.js.map +1 -0
- package/dist/chunk-B4KO3K3E.cjs +521 -0
- package/dist/chunk-B4KO3K3E.cjs.map +1 -0
- package/dist/chunk-BK3OTIBD.cjs +15 -0
- package/dist/chunk-BK3OTIBD.cjs.map +1 -0
- package/dist/chunk-BYAOQALW.js +13 -0
- package/dist/chunk-BYAOQALW.js.map +1 -0
- package/dist/chunk-CRTVS7VI.cjs +162 -0
- package/dist/chunk-CRTVS7VI.cjs.map +1 -0
- package/dist/chunk-EXITP7QO.js +288 -0
- package/dist/chunk-EXITP7QO.js.map +1 -0
- package/dist/chunk-GMO3PRZZ.js +565 -0
- package/dist/chunk-GMO3PRZZ.js.map +1 -0
- package/dist/chunk-HRO2DWKZ.js +12 -0
- package/dist/chunk-HRO2DWKZ.js.map +1 -0
- package/dist/chunk-JHDKUQSB.js +1069 -0
- package/dist/chunk-JHDKUQSB.js.map +1 -0
- package/dist/chunk-JN2Y6RSY.js +23 -0
- package/dist/chunk-JN2Y6RSY.js.map +1 -0
- package/dist/chunk-JRJSKRZW.cjs +29 -0
- package/dist/chunk-JRJSKRZW.cjs.map +1 -0
- package/dist/chunk-KC62H4VJ.js +123 -0
- package/dist/chunk-KC62H4VJ.js.map +1 -0
- package/dist/chunk-LHEHSLD5.js +31 -0
- package/dist/chunk-LHEHSLD5.js.map +1 -0
- package/dist/chunk-N4264P7N.cjs +156 -0
- package/dist/chunk-N4264P7N.cjs.map +1 -0
- package/dist/chunk-NF5QYPYC.cjs +133 -0
- package/dist/chunk-NF5QYPYC.cjs.map +1 -0
- package/dist/chunk-OFLCHKKE.cjs +28 -0
- package/dist/chunk-OFLCHKKE.cjs.map +1 -0
- package/dist/chunk-PCNSWVA5.cjs +602 -0
- package/dist/chunk-PCNSWVA5.cjs.map +1 -0
- package/dist/chunk-STOMAA2X.js +85 -0
- package/dist/chunk-STOMAA2X.js.map +1 -0
- package/dist/chunk-UVF5S6LX.cjs +15 -0
- package/dist/chunk-UVF5S6LX.cjs.map +1 -0
- package/dist/chunk-WEIXCDCA.cjs +90 -0
- package/dist/chunk-WEIXCDCA.cjs.map +1 -0
- package/dist/chunk-X3ZTSLBQ.js +355 -0
- package/dist/chunk-X3ZTSLBQ.js.map +1 -0
- package/dist/chunk-YEV73J4J.js +504 -0
- package/dist/chunk-YEV73J4J.js.map +1 -0
- package/dist/chunk-YW5PNTRU.cjs +14 -0
- package/dist/chunk-YW5PNTRU.cjs.map +1 -0
- package/dist/chunk-ZNXSWUIS.js +12 -0
- package/dist/chunk-ZNXSWUIS.js.map +1 -0
- package/dist/chunk-ZUEMBY4W.js +21 -0
- package/dist/chunk-ZUEMBY4W.js.map +1 -0
- package/dist/components/index.cjs +60 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +43 -0
- package/dist/components/index.d.ts +43 -4
- package/dist/components/index.js +3 -4
- package/dist/components/index.js.map +1 -0
- package/dist/core/devtools.cjs +25 -0
- package/dist/core/devtools.cjs.map +1 -0
- package/dist/core/devtools.d.cts +17 -0
- package/dist/core/devtools.d.ts +9 -7
- package/dist/core/devtools.js +4 -16
- package/dist/core/devtools.js.map +1 -0
- package/dist/core/index.cjs +220 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +196 -0
- package/dist/core/index.d.ts +196 -9
- package/dist/core/index.js +7 -8
- package/dist/core/index.js.map +1 -0
- package/dist/features/index.cjs +76 -0
- package/dist/features/index.cjs.map +1 -0
- package/dist/features/index.d.cts +86 -0
- package/dist/features/index.d.ts +86 -4
- package/dist/features/index.js +7 -3
- package/dist/features/index.js.map +1 -0
- package/dist/hooks/index.cjs +209 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +377 -0
- package/dist/hooks/index.d.ts +377 -10
- package/dist/hooks/index.js +8 -9
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useInViewPrefetch.cjs +33 -0
- package/dist/hooks/useInViewPrefetch.cjs.map +1 -0
- package/dist/hooks/useInViewPrefetch.d.cts +12 -0
- package/dist/hooks/useInViewPrefetch.d.ts +6 -4
- package/dist/hooks/useInViewPrefetch.js +30 -20
- package/dist/hooks/useInViewPrefetch.js.map +1 -0
- package/dist/index.cjs +811 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +36 -0
- package/dist/index.d.ts +36 -8
- package/dist/index.js +89 -7
- package/dist/index.js.map +1 -0
- package/dist/{types/offline.d.ts → offline-DVPtgoAS.d.ts} +15 -13
- package/dist/offline-xxeA_-6V.d.cts +99 -0
- package/dist/persistence-MRtkmhqq.d.cts +216 -0
- package/dist/persistence-tIrEb0pR.d.ts +216 -0
- package/dist/react-query/index.cjs +52 -0
- package/dist/react-query/index.cjs.map +1 -0
- package/dist/react-query/index.d.cts +1 -0
- package/dist/react-query/index.d.ts +1 -3
- package/dist/react-query/index.js +3 -1
- package/dist/react-query/index.js.map +1 -0
- package/dist/types/index.cjs +43 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +157 -0
- package/dist/types/index.d.ts +116 -12
- package/dist/types/index.js +6 -8
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.cjs +234 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +272 -0
- package/dist/utils/index.d.ts +272 -10
- package/dist/utils/index.js +9 -9
- package/dist/utils/index.js.map +1 -0
- package/package.json +13 -3
- package/dist/PersistQueryClientProvider.d.ts +0 -22
- package/dist/PersistQueryClientProvider.d.ts.map +0 -1
- package/dist/PersistQueryClientProvider.js +0 -57
- package/dist/components/LoadingFallback.d.ts +0 -16
- package/dist/components/LoadingFallback.d.ts.map +0 -1
- package/dist/components/LoadingFallback.js +0 -27
- package/dist/components/QueryErrorBoundary.d.ts +0 -12
- package/dist/components/QueryErrorBoundary.d.ts.map +0 -1
- package/dist/components/QueryErrorBoundary.js +0 -9
- package/dist/components/SuspenseWrapper.d.ts +0 -14
- package/dist/components/SuspenseWrapper.d.ts.map +0 -1
- package/dist/components/SuspenseWrapper.js +0 -9
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/internal/ErrorBoundary.d.ts +0 -27
- package/dist/components/internal/ErrorBoundary.d.ts.map +0 -1
- package/dist/components/internal/ErrorBoundary.js +0 -37
- package/dist/core/config.d.ts +0 -80
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js +0 -327
- package/dist/core/devtools.d.ts.map +0 -1
- package/dist/core/env.d.ts +0 -4
- package/dist/core/env.d.ts.map +0 -1
- package/dist/core/env.js +0 -26
- package/dist/core/focusManager.d.ts +0 -33
- package/dist/core/focusManager.d.ts.map +0 -1
- package/dist/core/focusManager.js +0 -122
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/keys.d.ts +0 -59
- package/dist/core/keys.d.ts.map +0 -1
- package/dist/core/keys.js +0 -107
- package/dist/core/queryOptions.d.ts +0 -19
- package/dist/core/queryOptions.d.ts.map +0 -1
- package/dist/core/queryOptions.js +0 -32
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/offline.d.ts +0 -49
- package/dist/features/offline.d.ts.map +0 -1
- package/dist/features/offline.js +0 -300
- package/dist/features/persistence.d.ts +0 -36
- package/dist/features/persistence.d.ts.map +0 -1
- package/dist/features/persistence.js +0 -187
- package/dist/hooks/batchQueries.d.ts +0 -129
- package/dist/hooks/batchQueries.d.ts.map +0 -1
- package/dist/hooks/batchQueries.js +0 -301
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useDataGuardMutation.d.ts +0 -39
- package/dist/hooks/useDataGuardMutation.d.ts.map +0 -1
- package/dist/hooks/useDataGuardMutation.js +0 -137
- package/dist/hooks/useDataGuardQuery.d.ts +0 -28
- package/dist/hooks/useDataGuardQuery.d.ts.map +0 -1
- package/dist/hooks/useDataGuardQuery.js +0 -71
- package/dist/hooks/useFocusManager.d.ts +0 -41
- package/dist/hooks/useFocusManager.d.ts.map +0 -1
- package/dist/hooks/useFocusManager.js +0 -109
- package/dist/hooks/useInViewPrefetch.d.ts.map +0 -1
- package/dist/hooks/useInfiniteQuery.d.ts +0 -33
- package/dist/hooks/useInfiniteQuery.d.ts.map +0 -1
- package/dist/hooks/useInfiniteQuery.js +0 -61
- package/dist/hooks/useMutation.d.ts +0 -25
- package/dist/hooks/useMutation.d.ts.map +0 -1
- package/dist/hooks/useMutation.js +0 -180
- package/dist/hooks/usePrefetch.d.ts +0 -54
- package/dist/hooks/usePrefetch.d.ts.map +0 -1
- package/dist/hooks/usePrefetch.js +0 -229
- package/dist/hooks/useQuery.d.ts +0 -21
- package/dist/hooks/useQuery.d.ts.map +0 -1
- package/dist/hooks/useQuery.js +0 -46
- package/dist/hooks/useSuspenseQuery.d.ts +0 -11
- package/dist/hooks/useSuspenseQuery.d.ts.map +0 -1
- package/dist/hooks/useSuspenseQuery.js +0 -19
- package/dist/index.d.ts.map +0 -1
- package/dist/react-query/index.d.ts.map +0 -1
- package/dist/types/base.d.ts.map +0 -1
- package/dist/types/base.js +0 -26
- package/dist/types/dataGuard.d.ts +0 -69
- package/dist/types/dataGuard.d.ts.map +0 -1
- package/dist/types/dataGuard.js +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/infinite.d.ts +0 -39
- package/dist/types/infinite.d.ts.map +0 -1
- package/dist/types/infinite.js +0 -1
- package/dist/types/offline.d.ts.map +0 -1
- package/dist/types/offline.js +0 -8
- package/dist/types/optimistic.d.ts +0 -126
- package/dist/types/optimistic.d.ts.map +0 -1
- package/dist/types/optimistic.js +0 -7
- package/dist/types/persistence.d.ts +0 -9
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js +0 -1
- package/dist/types/selectors.d.ts +0 -11
- package/dist/types/selectors.d.ts.map +0 -1
- package/dist/types/selectors.js +0 -1
- package/dist/types/suspense.d.ts +0 -67
- package/dist/types/suspense.d.ts.map +0 -1
- package/dist/types/suspense.js +0 -1
- package/dist/utils/dataGuard.d.ts +0 -37
- package/dist/utils/dataGuard.d.ts.map +0 -1
- package/dist/utils/dataGuard.js +0 -251
- package/dist/utils/fieldMapper.d.ts +0 -9
- package/dist/utils/fieldMapper.d.ts.map +0 -1
- package/dist/utils/fieldMapper.js +0 -27
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/network.d.ts +0 -9
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js +0 -43
- package/dist/utils/optimisticUtils.d.ts +0 -45
- package/dist/utils/optimisticUtils.d.ts.map +0 -1
- package/dist/utils/optimisticUtils.js +0 -116
- package/dist/utils/placeholderData.d.ts +0 -3
- package/dist/utils/placeholderData.d.ts.map +0 -1
- package/dist/utils/placeholderData.js +0 -28
- package/dist/utils/prefetchManager.d.ts +0 -111
- package/dist/utils/prefetchManager.d.ts.map +0 -1
- package/dist/utils/prefetchManager.js +0 -246
- package/dist/utils/queryKey.d.ts +0 -26
- package/dist/utils/queryKey.d.ts.map +0 -1
- package/dist/utils/queryKey.js +0 -89
- package/dist/utils/selectors.d.ts +0 -30
- package/dist/utils/selectors.d.ts.map +0 -1
- package/dist/utils/selectors.js +0 -18
- package/dist/utils/storage.d.ts +0 -7
- package/dist/utils/storage.d.ts.map +0 -1
- package/dist/utils/storage.js +0 -84
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
2
|
-
import { useMutation } from "./useMutation.js";
|
|
3
|
-
import { ConflictError } from "../types/dataGuard.js";
|
|
4
|
-
import { hashObject, markRecentlyUpdated, clearRecentlyUpdated, updateFamilyMetadata } from "../utils/dataGuard.js";
|
|
5
|
-
import { startsWithKeyPrefix } from "../utils/queryKey.js";
|
|
6
|
-
/**
|
|
7
|
-
* 带数据防护的 Mutation Hook
|
|
8
|
-
*
|
|
9
|
-
* 自动处理:
|
|
10
|
-
* 1. 乐观更新时递增版本号和更新时间戳
|
|
11
|
-
* 2. 标记最近更新的项
|
|
12
|
-
* 3. 成功后更新所有家族缓存的元数据
|
|
13
|
-
* 4. 冲突检测(409 错误)
|
|
14
|
-
* 5. 延迟清理更新标记
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const mutation = useDataGuardMutation(
|
|
19
|
-
* (updated) => api.updateProduct(updated.id, updated),
|
|
20
|
-
* ['products', 'list', { page: 1, pageSize: 20 }],
|
|
21
|
-
* {
|
|
22
|
-
* optimistic: {
|
|
23
|
-
* queryKey: ['products', 'list', { page: 1, pageSize: 20 }],
|
|
24
|
-
* updater: (old, updated) => ({
|
|
25
|
-
* ...old,
|
|
26
|
-
* items: old?.items?.map(p => p.id === updated.id ? updated : p)
|
|
27
|
-
* })
|
|
28
|
-
* },
|
|
29
|
-
* onConflict: (error) => {
|
|
30
|
-
* toast.error('数据冲突,请刷新')
|
|
31
|
-
* }
|
|
32
|
-
* }
|
|
33
|
-
* )
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export function useDataGuardMutation(mutationFn, queryKey, options) {
|
|
37
|
-
const queryClient = useQueryClient();
|
|
38
|
-
const { onConflict, onSuccess, optimistic, ...restOptions } = options || {};
|
|
39
|
-
// 增强的 mutation 函数:检测冲突
|
|
40
|
-
const enhancedMutationFn = async (data) => {
|
|
41
|
-
try {
|
|
42
|
-
const result = await mutationFn(data);
|
|
43
|
-
return result;
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
// 检测冲突错误(409 Conflict)
|
|
47
|
-
if (error && typeof error === 'object' &&
|
|
48
|
-
(error.status === 409 || error.code === "CONFLICT" || error.name === "ConflictError")) {
|
|
49
|
-
onConflict?.(error);
|
|
50
|
-
throw new ConflictError(error);
|
|
51
|
-
}
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
// 增强的乐观更新配置
|
|
56
|
-
const enhancedOptimistic = optimistic ? {
|
|
57
|
-
...optimistic,
|
|
58
|
-
updater: (old, variables) => {
|
|
59
|
-
// 调用原始 updater
|
|
60
|
-
const updated = optimistic.updater(old, variables);
|
|
61
|
-
if (!updated)
|
|
62
|
-
return updated;
|
|
63
|
-
// 检查 variables.id 是否存在
|
|
64
|
-
if (variables.id === undefined || variables.id === null) {
|
|
65
|
-
return updated;
|
|
66
|
-
}
|
|
67
|
-
// 标记最近更新的项
|
|
68
|
-
const withMark = markRecentlyUpdated(updated, variables.id);
|
|
69
|
-
// 乐观更新版本号(安全检查:确保 old 存在)
|
|
70
|
-
if (old && old.version !== undefined) {
|
|
71
|
-
withMark.version = old.version + 1;
|
|
72
|
-
}
|
|
73
|
-
// 乐观更新时间戳(安全检查:确保 old 存在)
|
|
74
|
-
if (old && old.updatedAt !== undefined) {
|
|
75
|
-
withMark.updatedAt = new Date().toISOString();
|
|
76
|
-
}
|
|
77
|
-
// 更新哈希(安全检查:确保 old 存在)
|
|
78
|
-
if (old && old._hash !== undefined) {
|
|
79
|
-
withMark._hash = hashObject(withMark.items);
|
|
80
|
-
}
|
|
81
|
-
return withMark;
|
|
82
|
-
}
|
|
83
|
-
} : undefined;
|
|
84
|
-
// 增强的成功回调
|
|
85
|
-
const enhancedOnSuccess = (data, variables, onMutateResult, context) => {
|
|
86
|
-
try {
|
|
87
|
-
// 更新所有家族缓存的元数据
|
|
88
|
-
const familyKey = Array.isArray(queryKey) ? queryKey.slice(0, -1) : [queryKey];
|
|
89
|
-
updateFamilyMetadata(queryClient, familyKey, data);
|
|
90
|
-
// 延迟清理最近更新标记(5秒后)
|
|
91
|
-
const cleanupDelay = 5000;
|
|
92
|
-
// 延迟清理最近更新标记
|
|
93
|
-
setTimeout(() => {
|
|
94
|
-
try {
|
|
95
|
-
// 检查 variables.id 是否存在
|
|
96
|
-
if (variables.id === undefined || variables.id === null) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
const cache = queryClient.getQueryCache();
|
|
100
|
-
const queries = cache.findAll({
|
|
101
|
-
predicate: (q) => startsWithKeyPrefix(q.queryKey, familyKey)
|
|
102
|
-
});
|
|
103
|
-
queries.forEach((q) => {
|
|
104
|
-
const old = queryClient.getQueryData(q.queryKey);
|
|
105
|
-
if (old?._recentlyUpdatedIds) {
|
|
106
|
-
const cleared = clearRecentlyUpdated(old, variables.id);
|
|
107
|
-
queryClient.setQueryData(q.queryKey, cleared);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
// 清理标记失败不应该影响用户操作(静默处理)
|
|
113
|
-
}
|
|
114
|
-
}, cleanupDelay);
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
// 元数据更新失败不应该影响用户操作(静默处理)
|
|
118
|
-
}
|
|
119
|
-
// 调用用户的 onSuccess
|
|
120
|
-
onSuccess?.(data, variables, onMutateResult, context);
|
|
121
|
-
};
|
|
122
|
-
return useMutation({
|
|
123
|
-
...restOptions,
|
|
124
|
-
mutationFn: enhancedMutationFn,
|
|
125
|
-
optimistic: enhancedOptimistic, // 类型复杂,暂时保留
|
|
126
|
-
onSuccess: enhancedOnSuccess,
|
|
127
|
-
onError: (error, variables, onMutateResult, context) => {
|
|
128
|
-
if (error instanceof ConflictError) {
|
|
129
|
-
// 冲突时失效所有家族缓存
|
|
130
|
-
const familyKey = Array.isArray(queryKey) ? queryKey.slice(0, -1) : [queryKey];
|
|
131
|
-
queryClient.invalidateQueries({ queryKey: familyKey });
|
|
132
|
-
}
|
|
133
|
-
// 调用用户的 onError
|
|
134
|
-
restOptions.onError?.(error, variables, onMutateResult, context);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { QueryKey, UseQueryOptions } from "@tanstack/react-query";
|
|
2
|
-
import type { DataGuardOptions, VersionedEntity, VersionedPaginatedResponse } from "../types/dataGuard.js";
|
|
3
|
-
/**
|
|
4
|
-
* Hook: 创建带数据防护的查询配置
|
|
5
|
-
*
|
|
6
|
-
* 自动根据后端返回的数据选择最佳防护策略:
|
|
7
|
-
* 1. 如果有 version 字段 → 使用版本号比较(最可靠)
|
|
8
|
-
* 2. 如果有 updatedAt 字段 → 使用时间戳比较(次优)
|
|
9
|
-
* 3. 都没有 → 使用内容哈希比较(兜底)
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const { data } = useEnhancedQuery(
|
|
14
|
-
* useDataGuardQueryConfig(
|
|
15
|
-
* ['products', 'list', { page: 1, pageSize: 20 }],
|
|
16
|
-
* () => fetchProducts(1, 20),
|
|
17
|
-
* {
|
|
18
|
-
* maxDataAge: 5000,
|
|
19
|
-
* onStaleDataDetected: (info) => {
|
|
20
|
-
* console.warn('检测到旧数据', info)
|
|
21
|
-
* }
|
|
22
|
-
* }
|
|
23
|
-
* )
|
|
24
|
-
* )
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export declare function useDataGuardQueryConfig<T extends VersionedEntity>(queryKey: QueryKey, fetchFn: () => Promise<VersionedPaginatedResponse<T>>, options?: DataGuardOptions): Pick<UseQueryOptions<VersionedPaginatedResponse<T>>, "queryKey" | "queryFn">;
|
|
28
|
-
//# sourceMappingURL=useDataGuardQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDataGuardQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useDataGuardQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAK3G;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,eAAe,EAC/D,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,EACrD,OAAO,CAAC,EAAE,gBAAgB,GACzB,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAwD9E"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
2
|
-
import { applyDataGuard, addHashToData } from "../utils/dataGuard.js";
|
|
3
|
-
import { isDev } from "../core/env.js";
|
|
4
|
-
/**
|
|
5
|
-
* Hook: 创建带数据防护的查询配置
|
|
6
|
-
*
|
|
7
|
-
* 自动根据后端返回的数据选择最佳防护策略:
|
|
8
|
-
* 1. 如果有 version 字段 → 使用版本号比较(最可靠)
|
|
9
|
-
* 2. 如果有 updatedAt 字段 → 使用时间戳比较(次优)
|
|
10
|
-
* 3. 都没有 → 使用内容哈希比较(兜底)
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const { data } = useEnhancedQuery(
|
|
15
|
-
* useDataGuardQueryConfig(
|
|
16
|
-
* ['products', 'list', { page: 1, pageSize: 20 }],
|
|
17
|
-
* () => fetchProducts(1, 20),
|
|
18
|
-
* {
|
|
19
|
-
* maxDataAge: 5000,
|
|
20
|
-
* onStaleDataDetected: (info) => {
|
|
21
|
-
* console.warn('检测到旧数据', info)
|
|
22
|
-
* }
|
|
23
|
-
* }
|
|
24
|
-
* )
|
|
25
|
-
* )
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
export function useDataGuardQueryConfig(queryKey, fetchFn, options) {
|
|
29
|
-
const queryClient = useQueryClient();
|
|
30
|
-
return {
|
|
31
|
-
queryKey,
|
|
32
|
-
queryFn: async () => {
|
|
33
|
-
const newData = await fetchFn();
|
|
34
|
-
const cached = queryClient.getQueryData(queryKey);
|
|
35
|
-
// 应用数据防护
|
|
36
|
-
const { shouldReject, reason, strategy, guardDetails } = applyDataGuard(newData, cached, queryKey, options);
|
|
37
|
-
// 触发回调
|
|
38
|
-
options?.onDataGuardApplied?.({
|
|
39
|
-
strategy,
|
|
40
|
-
passed: !shouldReject,
|
|
41
|
-
details: guardDetails
|
|
42
|
-
});
|
|
43
|
-
if (shouldReject) {
|
|
44
|
-
if (isDev) {
|
|
45
|
-
console.warn("[Data Guard] 拒绝旧数据", {
|
|
46
|
-
reason,
|
|
47
|
-
strategy,
|
|
48
|
-
queryKey,
|
|
49
|
-
guardDetails
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
options?.onStaleDataDetected?.({
|
|
53
|
-
reason,
|
|
54
|
-
strategy,
|
|
55
|
-
queryKey,
|
|
56
|
-
cached,
|
|
57
|
-
rejected: newData
|
|
58
|
-
});
|
|
59
|
-
return cached;
|
|
60
|
-
}
|
|
61
|
-
if (isDev) {
|
|
62
|
-
console.log("[Data Guard] 接受新数据", {
|
|
63
|
-
strategy,
|
|
64
|
-
guardDetails
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
// 添加哈希标记
|
|
68
|
-
return addHashToData(newData);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { QueryKey } from "@tanstack/react-query";
|
|
2
|
-
export interface UseFocusRefetchOptions {
|
|
3
|
-
enabled?: boolean;
|
|
4
|
-
minInterval?: number;
|
|
5
|
-
queryKeys?: QueryKey[];
|
|
6
|
-
}
|
|
7
|
-
export interface UsePauseFocusOptions {
|
|
8
|
-
autoPause?: boolean;
|
|
9
|
-
pauseWhen?: boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare function useFocusState(): boolean;
|
|
12
|
-
export declare function useFocusRefetch(options?: UseFocusRefetchOptions): void;
|
|
13
|
-
export declare function usePauseFocus(options?: UsePauseFocusOptions): {
|
|
14
|
-
pause: () => void;
|
|
15
|
-
resume: () => void;
|
|
16
|
-
};
|
|
17
|
-
export declare function useSmartFocusManager(): {
|
|
18
|
-
pause: () => void;
|
|
19
|
-
resume: () => void;
|
|
20
|
-
getStats: () => {
|
|
21
|
-
isPaused: boolean;
|
|
22
|
-
pauseCount: number;
|
|
23
|
-
isFocused: boolean;
|
|
24
|
-
};
|
|
25
|
-
stats: {
|
|
26
|
-
isPaused: boolean;
|
|
27
|
-
pauseCount: number;
|
|
28
|
-
isFocused: boolean;
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
export declare function useConditionalFocusRefetch(queryKey: QueryKey, condition: () => boolean, options?: {
|
|
32
|
-
minInterval?: number;
|
|
33
|
-
enabled?: boolean;
|
|
34
|
-
}): void;
|
|
35
|
-
export declare function useFocusCallback(callback: () => void, options?: {
|
|
36
|
-
minInterval?: number;
|
|
37
|
-
enabled?: boolean;
|
|
38
|
-
queryKey?: QueryKey;
|
|
39
|
-
}): void;
|
|
40
|
-
export declare function usePageVisibility(): boolean;
|
|
41
|
-
//# sourceMappingURL=useFocusManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFocusManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useFocusManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKtD,MAAM,WAAW,sBAAsB;IAAG,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAE;AAC3G,MAAM,WAAW,oBAAoB;IAAG,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE;AAElF,wBAAgB,aAAa,IAAI,OAAO,CAOvC;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,QAkBnE;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB;;;EAW/D;AAED,wBAAgB,oBAAoB;;;;;;;;;;;;;EAMnC;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,QAkBjJ;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAO,QAyBpI;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
2
|
-
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
-
import { focusManager, getSmartFocusManager, pauseFocusManager, resumeFocusManager } from "../core/focusManager.js";
|
|
4
|
-
export function useFocusState() {
|
|
5
|
-
const [focused, setFocused] = useState(focusManager.isFocused());
|
|
6
|
-
useEffect(() => {
|
|
7
|
-
const unsubscribe = focusManager.subscribe((isFocused) => { setFocused(isFocused); });
|
|
8
|
-
return unsubscribe;
|
|
9
|
-
}, []);
|
|
10
|
-
return focused;
|
|
11
|
-
}
|
|
12
|
-
export function useFocusRefetch(options = {}) {
|
|
13
|
-
const queryClient = useQueryClient();
|
|
14
|
-
const { enabled = true, minInterval = 5000, queryKeys = [] } = options;
|
|
15
|
-
const smartManager = getSmartFocusManager();
|
|
16
|
-
const queryKeysJson = JSON.stringify(queryKeys);
|
|
17
|
-
const stableQueryKeys = useMemo(() => queryKeys, [queryKeysJson]);
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
if (!enabled || stableQueryKeys.length === 0)
|
|
20
|
-
return;
|
|
21
|
-
const unsubscribe = focusManager.subscribe((isFocused) => {
|
|
22
|
-
if (!isFocused)
|
|
23
|
-
return;
|
|
24
|
-
stableQueryKeys.forEach((queryKey) => {
|
|
25
|
-
if (smartManager.shouldRefetch(queryKey, minInterval)) {
|
|
26
|
-
queryClient.invalidateQueries({ queryKey });
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
return unsubscribe;
|
|
31
|
-
}, [queryClient, enabled, minInterval, stableQueryKeys, smartManager]);
|
|
32
|
-
}
|
|
33
|
-
export function usePauseFocus(options = {}) {
|
|
34
|
-
const { autoPause = false, pauseWhen = false } = options;
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
if (autoPause || pauseWhen) {
|
|
37
|
-
pauseFocusManager();
|
|
38
|
-
return () => { resumeFocusManager(); };
|
|
39
|
-
}
|
|
40
|
-
}, [autoPause, pauseWhen]);
|
|
41
|
-
const pause = useCallback(() => { pauseFocusManager(); }, []);
|
|
42
|
-
const resume = useCallback(() => { resumeFocusManager(); }, []);
|
|
43
|
-
return { pause, resume };
|
|
44
|
-
}
|
|
45
|
-
export function useSmartFocusManager() {
|
|
46
|
-
const manager = getSmartFocusManager();
|
|
47
|
-
const pause = useCallback(() => { manager.pause(); }, [manager]);
|
|
48
|
-
const resume = useCallback(() => { manager.resume(); }, [manager]);
|
|
49
|
-
const getStats = useCallback(() => { return manager.getStats(); }, [manager]);
|
|
50
|
-
return { pause, resume, getStats, stats: manager.getStats() };
|
|
51
|
-
}
|
|
52
|
-
export function useConditionalFocusRefetch(queryKey, condition, options = {}) {
|
|
53
|
-
const queryClient = useQueryClient();
|
|
54
|
-
const { minInterval = 5000, enabled = true } = options;
|
|
55
|
-
const smartManager = getSmartFocusManager();
|
|
56
|
-
const queryKeyJson = JSON.stringify(queryKey);
|
|
57
|
-
const stableQueryKey = useMemo(() => queryKey, [queryKeyJson]);
|
|
58
|
-
const conditionRef = useRef(condition);
|
|
59
|
-
useEffect(() => { conditionRef.current = condition; }, [condition]);
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
if (!enabled)
|
|
62
|
-
return;
|
|
63
|
-
const unsubscribe = focusManager.subscribe((isFocused) => {
|
|
64
|
-
if (!isFocused || !conditionRef.current())
|
|
65
|
-
return;
|
|
66
|
-
if (smartManager.shouldRefetch(stableQueryKey, minInterval)) {
|
|
67
|
-
queryClient.invalidateQueries({ queryKey: stableQueryKey });
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
return unsubscribe;
|
|
71
|
-
}, [queryClient, stableQueryKey, minInterval, enabled, smartManager]);
|
|
72
|
-
}
|
|
73
|
-
export function useFocusCallback(callback, options = {}) {
|
|
74
|
-
const { minInterval = 0, enabled = true, queryKey } = options;
|
|
75
|
-
const lastCallTime = useRef(0);
|
|
76
|
-
const smartManager = getSmartFocusManager();
|
|
77
|
-
const queryKeyJson = JSON.stringify(queryKey);
|
|
78
|
-
const stableQueryKey = useMemo(() => queryKey, [queryKeyJson]);
|
|
79
|
-
const callbackRef = useRef(callback);
|
|
80
|
-
useEffect(() => { callbackRef.current = callback; }, [callback]);
|
|
81
|
-
useEffect(() => {
|
|
82
|
-
if (!enabled)
|
|
83
|
-
return;
|
|
84
|
-
const unsubscribe = focusManager.subscribe((isFocused) => {
|
|
85
|
-
if (!isFocused)
|
|
86
|
-
return;
|
|
87
|
-
if (stableQueryKey !== undefined) {
|
|
88
|
-
if (smartManager.shouldRefetch(stableQueryKey, minInterval)) {
|
|
89
|
-
callbackRef.current();
|
|
90
|
-
}
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const now = Date.now();
|
|
94
|
-
if (minInterval > 0 && now - lastCallTime.current < minInterval)
|
|
95
|
-
return;
|
|
96
|
-
lastCallTime.current = now;
|
|
97
|
-
callbackRef.current();
|
|
98
|
-
});
|
|
99
|
-
return unsubscribe;
|
|
100
|
-
}, [minInterval, enabled, stableQueryKey, smartManager]);
|
|
101
|
-
}
|
|
102
|
-
export function usePageVisibility() {
|
|
103
|
-
const [isVisible, setIsVisible] = useState(typeof document !== "undefined" ? !document.hidden : true);
|
|
104
|
-
useEffect(() => {
|
|
105
|
-
const unsubscribe = focusManager.subscribe((isFocused) => { setIsVisible(isFocused); });
|
|
106
|
-
return unsubscribe;
|
|
107
|
-
}, []);
|
|
108
|
-
return isVisible;
|
|
109
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useInViewPrefetch.d.ts","sourceRoot":"","sources":["../../src/hooks/useInViewPrefetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMrE,MAAM,WAAW,qBAAqB;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAEhJ,wBAAgB,iBAAiB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAE,qBAA0B,mCAcxI"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { DefaultError, QueryFunction, QueryKey, UseInfiniteQueryOptions, UseInfiniteQueryResult } from "@tanstack/react-query";
|
|
2
|
-
import type { CursorPaginatedResponse, OffsetPaginatedResponse, PageNumberPaginatedResponse } from "../types/infinite";
|
|
3
|
-
export declare function useEnhancedInfiniteQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown>(options: UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>): UseInfiniteQueryResult<TData, TError>;
|
|
4
|
-
export declare function createInfiniteQueryOptions<TQueryFnData = unknown, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown>(config: {
|
|
5
|
-
queryKey: TQueryKey;
|
|
6
|
-
queryFn: QueryFunction<TQueryFnData, TQueryKey, TPageParam>;
|
|
7
|
-
initialPageParam: TPageParam;
|
|
8
|
-
getNextPageParam: (lastPage: TQueryFnData, allPages: TQueryFnData[], lastPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
9
|
-
getPreviousPageParam?: (firstPage: TQueryFnData, allPages: TQueryFnData[], firstPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
10
|
-
staleTime?: number;
|
|
11
|
-
gcTime?: number;
|
|
12
|
-
}): UseInfiniteQueryOptions<TQueryFnData, DefaultError, TQueryFnData, TQueryKey, TPageParam>;
|
|
13
|
-
export declare function createCursorPaginationOptions<T>(config: {
|
|
14
|
-
queryKey: QueryKey;
|
|
15
|
-
queryFn: (cursor: string | null) => Promise<CursorPaginatedResponse<T>>;
|
|
16
|
-
initialCursor?: string | null;
|
|
17
|
-
staleTime?: number;
|
|
18
|
-
gcTime?: number;
|
|
19
|
-
}): UseInfiniteQueryOptions<CursorPaginatedResponse<T>, DefaultError, CursorPaginatedResponse<T>, QueryKey, string | null>;
|
|
20
|
-
export declare function createOffsetPaginationOptions<T>(config: {
|
|
21
|
-
queryKey: QueryKey;
|
|
22
|
-
queryFn: (offset: number, limit: number) => Promise<OffsetPaginatedResponse<T>>;
|
|
23
|
-
limit?: number;
|
|
24
|
-
staleTime?: number;
|
|
25
|
-
gcTime?: number;
|
|
26
|
-
}): UseInfiniteQueryOptions<OffsetPaginatedResponse<T>, DefaultError, OffsetPaginatedResponse<T>, QueryKey, number>;
|
|
27
|
-
export declare function createPageNumberPaginationOptions<T>(config: {
|
|
28
|
-
queryKey: QueryKey;
|
|
29
|
-
queryFn: (page: number) => Promise<PageNumberPaginatedResponse<T>>;
|
|
30
|
-
staleTime?: number;
|
|
31
|
-
gcTime?: number;
|
|
32
|
-
}): UseInfiniteQueryOptions<PageNumberPaginatedResponse<T>, DefaultError, PageNumberPaginatedResponse<T>, QueryKey, number>;
|
|
33
|
-
//# sourceMappingURL=useInfiniteQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useInfiniteQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useInfiniteQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEvH,wBAAgB,wBAAwB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,OAAO,EAAE,OAAO,EAAE,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAEtS;AACD,wBAAgB,0BAA0B,CAAC,YAAY,GAAG,OAAO,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,OAAO,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAAC,gBAAgB,EAAE,UAAU,CAAC;IAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IAAC,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAE9rB;AACD,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,CAUpV;AACD,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAmBtU;AACD,wBAAgB,iCAAiC,CAAC,CAAC,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,uBAAuB,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAiBrT"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { infiniteQueryOptions, useInfiniteQuery } from "@tanstack/react-query";
|
|
2
|
-
export function useEnhancedInfiniteQuery(options) {
|
|
3
|
-
return useInfiniteQuery(options);
|
|
4
|
-
}
|
|
5
|
-
export function createInfiniteQueryOptions(config) {
|
|
6
|
-
return infiniteQueryOptions(config);
|
|
7
|
-
}
|
|
8
|
-
export function createCursorPaginationOptions(config) {
|
|
9
|
-
return createInfiniteQueryOptions({
|
|
10
|
-
queryKey: config.queryKey,
|
|
11
|
-
queryFn: ({ pageParam }) => config.queryFn(pageParam),
|
|
12
|
-
initialPageParam: config.initialCursor ?? null,
|
|
13
|
-
getNextPageParam: (lastPage) => lastPage.cursor ?? null,
|
|
14
|
-
getPreviousPageParam: () => null,
|
|
15
|
-
staleTime: config.staleTime,
|
|
16
|
-
gcTime: config.gcTime
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
export function createOffsetPaginationOptions(config) {
|
|
20
|
-
const limit = config.limit ?? 20;
|
|
21
|
-
return createInfiniteQueryOptions({
|
|
22
|
-
queryKey: [...config.queryKey, limit],
|
|
23
|
-
queryFn: ({ pageParam }) => config.queryFn(pageParam, limit),
|
|
24
|
-
initialPageParam: 0,
|
|
25
|
-
getNextPageParam: (lastPage, allPages) => {
|
|
26
|
-
if (lastPage.hasMore === false)
|
|
27
|
-
return undefined;
|
|
28
|
-
const currentOffset = allPages.length * limit;
|
|
29
|
-
if (currentOffset >= lastPage.total)
|
|
30
|
-
return undefined;
|
|
31
|
-
return currentOffset;
|
|
32
|
-
},
|
|
33
|
-
getPreviousPageParam: (_firstPage, allPages) => {
|
|
34
|
-
if (allPages.length <= 1)
|
|
35
|
-
return undefined;
|
|
36
|
-
return (allPages.length - 2) * limit;
|
|
37
|
-
},
|
|
38
|
-
staleTime: config.staleTime,
|
|
39
|
-
gcTime: config.gcTime
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
export function createPageNumberPaginationOptions(config) {
|
|
43
|
-
return createInfiniteQueryOptions({
|
|
44
|
-
queryKey: config.queryKey,
|
|
45
|
-
queryFn: ({ pageParam }) => config.queryFn(pageParam),
|
|
46
|
-
initialPageParam: 1,
|
|
47
|
-
getNextPageParam: (lastPage, allPages) => {
|
|
48
|
-
const nextPage = allPages.length + 1;
|
|
49
|
-
if (nextPage > lastPage.totalPages)
|
|
50
|
-
return undefined;
|
|
51
|
-
return nextPage;
|
|
52
|
-
},
|
|
53
|
-
getPreviousPageParam: (_firstPage, allPages) => {
|
|
54
|
-
if (allPages.length <= 1)
|
|
55
|
-
return undefined;
|
|
56
|
-
return allPages.length - 1;
|
|
57
|
-
},
|
|
58
|
-
staleTime: config.staleTime,
|
|
59
|
-
gcTime: config.gcTime
|
|
60
|
-
});
|
|
61
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { MutationFunction, MutationKey, QueryClient, QueryKey, UseMutationOptions as TanStackUseMutationOptions, UseMutationResult } from "@tanstack/react-query";
|
|
2
|
-
import type { MutationOptions } from "../types";
|
|
3
|
-
import type { EntityWithId } from "../types/selectors";
|
|
4
|
-
export type { MutationKey };
|
|
5
|
-
export interface MutationDefaultsConfig {
|
|
6
|
-
[key: string]: TanStackUseMutationOptions<any, any, any, any>;
|
|
7
|
-
}
|
|
8
|
-
export declare function invalidateQueriesBatch(queryClient: QueryClient, tasks: any[]): void;
|
|
9
|
-
export declare function cancelQueriesBatch(queryClient: QueryClient, tasks: any[]): void;
|
|
10
|
-
export declare function setQueryDataBatch(queryClient: QueryClient, tasks: any[]): void;
|
|
11
|
-
export declare function useMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(options: MutationOptions<TData, TError, TVariables, TContext>): UseMutationResult<TData, TError, TVariables, TContext>;
|
|
12
|
-
export declare function setupMutationDefaults(queryClient: QueryClient, config: MutationDefaultsConfig): void;
|
|
13
|
-
export declare function useListMutation<T extends EntityWithId>(mutationFn: MutationFunction<T, {
|
|
14
|
-
operation: string;
|
|
15
|
-
data: Partial<T>;
|
|
16
|
-
}>, queryKey: QueryKey, options?: TanStackUseMutationOptions<T, Error, {
|
|
17
|
-
operation: string;
|
|
18
|
-
data: Partial<T>;
|
|
19
|
-
}> & {
|
|
20
|
-
mutationKey?: readonly unknown[];
|
|
21
|
-
}): UseMutationResult<T, Error, {
|
|
22
|
-
operation: string;
|
|
23
|
-
data: Partial<T>;
|
|
24
|
-
}, unknown>;
|
|
25
|
-
//# sourceMappingURL=useMutation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,IAAI,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvK,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IAAG,CAAC,GAAG,EAAE,MAAM,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE;AAkBzG,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,QAE5E;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,QAExE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,QAEvE;AAED,wBAAgB,WAAW,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAwIzN;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAEpG;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EACpD,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,EACxE,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,0BAA0B,CAAC,CAAC,EAAE,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE;eAAlE,MAAM;UAAQ,OAAO,CAAC,CAAC,CAAC;YAarF"}
|