-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
Copy pathcreateBaseQuery.svelte.ts
83 lines (74 loc) · 2.19 KB
/
createBaseQuery.svelte.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { notifyManager } from '@tanstack/query-core'
import { useIsRestoring } from './useIsRestoring.js'
import { useQueryClient } from './useQueryClient.js'
import type {
CreateBaseQueryOptions,
CreateBaseQueryResult,
FunctionedParams,
} from './types.js'
import type {
QueryClient,
QueryKey,
QueryObserver,
QueryObserverResult,
} from '@tanstack/query-core'
export function createBaseQuery<
TQueryFnData,
TError,
TData,
TQueryData,
TQueryKey extends QueryKey,
>(
options: FunctionedParams<
CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>
>,
Observer: typeof QueryObserver,
queryClient?: QueryClient,
): CreateBaseQueryResult<TData, TError> {
/** Load query client */
const client = useQueryClient(queryClient)
const isRestoring = useIsRestoring()
/** Creates a store that has the default options applied */
const defaultedOptions = $derived(() => {
const defaultOptions = client.defaultQueryOptions(options())
defaultOptions._optimisticResults = isRestoring()
? 'isRestoring'
: 'optimistic'
defaultOptions.structuralSharing = false
return defaultOptions
})
/** Creates the observer */
const observer = new Observer<
TQueryFnData,
TError,
TData,
TQueryData,
TQueryKey
>(client, defaultedOptions())
const result = $state<QueryObserverResult<TData, TError>>(
observer.getOptimisticResult(defaultedOptions()),
)
function updateResult(r: QueryObserverResult<TData, TError>) {
Object.assign(result, r)
}
$effect(() => {
const unsubscribe = isRestoring()
? () => undefined
: observer.subscribe(() => {
notifyManager.batchCalls(() => {
updateResult(observer.getOptimisticResult(defaultedOptions()))
})()
})
observer.updateResult()
return () => unsubscribe()
})
/** Subscribe to changes in result and defaultedOptionsStore */
$effect.pre(() => {
observer.setOptions(defaultedOptions(), { listeners: false })
updateResult(observer.getOptimisticResult(defaultedOptions()))
})
// Handle result property usage tracking
return !defaultedOptions().notifyOnChangeProps
? observer.trackResult(result)
: result
}