forked from TanStack/query
-
Notifications
You must be signed in to change notification settings - Fork 0
/
createBaseQuery.ts
76 lines (66 loc) · 2.04 KB
/
createBaseQuery.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
import { QueryObserver } from '@tanstack/query-core'
import type { QueryKey, QueryObserverResult } from '@tanstack/query-core'
import { CreateBaseQueryOptions } from './types'
import { useQueryClient } from './QueryClientProvider'
import { onMount, onCleanup, createComputed, createResource } from 'solid-js'
import { createStore } from 'solid-js/store'
// Base Query Function that is used to create the query.
export function createBaseQuery<
TQueryFnData,
TError,
TData,
TQueryData,
TQueryKey extends QueryKey,
>(
options: CreateBaseQueryOptions<
TQueryFnData,
TError,
TData,
TQueryData,
TQueryKey
>,
Observer: typeof QueryObserver,
): QueryObserverResult<TData, TError> {
const queryClient = useQueryClient()
const defaultedOptions = queryClient.defaultQueryOptions(options)
defaultedOptions._optimisticResults = 'optimistic'
const observer = new Observer(queryClient, defaultedOptions)
const [state, setState] = createStore<QueryObserverResult<TData, TError>>(
// @ts-ignore
observer.getOptimisticResult(defaultedOptions),
)
const [dataResource, { refetch }] = createResource(() => {
return new Promise((resolve) => {
if (state.isSuccess) resolve(state.data)
if (state.isError && !state.isFetching) {
throw state.error
}
})
})
const unsubscribe = observer.subscribe((result) => {
const reconciledResult = result
// @ts-ignore
setState(reconciledResult)
refetch()
})
onCleanup(() => unsubscribe())
onMount(() => {
observer.setOptions(defaultedOptions, { listeners: false })
})
createComputed(() => {
const defaultedOptions = queryClient.defaultQueryOptions(options)
observer.setOptions(defaultedOptions)
})
const handler = {
get(
target: QueryObserverResult<TData, TError>,
prop: keyof QueryObserverResult<TData, TError>,
): any {
if (prop === 'data') {
return dataResource()
}
return Reflect.get(target, prop)
},
}
return new Proxy(state, handler) as QueryObserverResult<TData, TError>
}