Skip to content

Commit 62d7e84

Browse files
authored
Merge pull request #1 from doeixd/solid-query
solid-query
2 parents c4fa60e + 272cee4 commit 62d7e84

File tree

10 files changed

+98
-94
lines changed

10 files changed

+98
-94
lines changed

src/react/Hydrate.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,34 @@
1-
import React from 'react'
1+
import {createMemo} from 'solid-js'
22

33
import { hydrate, HydrateOptions } from '../core'
44
import { useQueryClient } from './QueryClientProvider'
55

66
export function useHydrate(state: unknown, options?: HydrateOptions) {
77
const queryClient = useQueryClient()
88

9-
const optionsRef = React.useRef(options)
10-
optionsRef.current = options
9+
const optionsRef = options
1110

1211
// Running hydrate again with the same queries is safe,
1312
// it wont overwrite or initialize existing queries,
1413
// relying on useMemo here is only a performance optimization.
1514
// hydrate can and should be run *during* render here for SSR to work properly
16-
React.useMemo(() => {
15+
createMemo(() => {
1716
if (state) {
18-
hydrate(queryClient, state, optionsRef.current)
17+
hydrate(queryClient(), state(), optionsRef())
1918
}
20-
}, [queryClient, state])
19+
})
2120
}
2221

2322
export interface HydrateProps {
2423
state?: unknown
2524
options?: HydrateOptions
2625
}
2726

28-
export const Hydrate: React.FC<HydrateProps> = ({
27+
export const Hydrate = ({
2928
children,
3029
options,
3130
state,
32-
}) => {
31+
}:HydrateProps) => {
3332
useHydrate(state, options)
34-
return children as React.ReactElement<any>
33+
return children as JSX.Element
3534
}

src/react/QueryClientProvider.tsx

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import {createMutable, createEffect, createContext} from 'solid-js'
22

33
import { QueryClient } from '../core'
44

@@ -8,8 +8,8 @@ declare global {
88
}
99
}
1010

11-
const defaultContext = React.createContext<QueryClient | undefined>(undefined)
12-
const QueryClientSharingContext = React.createContext<boolean>(false)
11+
const defaultContext = createContext<QueryClient|undefined>(undefined)
12+
const QueryClientSharingContext = createContext<boolean>(false)
1313

1414
// if contextSharing is on, we share the first and at least one
1515
// instance of the context across the window
@@ -30,12 +30,12 @@ function getQueryClientContext(contextSharing: boolean) {
3030
}
3131

3232
export const useQueryClient = () => {
33-
const queryClient = React.useContext(
34-
getQueryClientContext(React.useContext(QueryClientSharingContext))
33+
const queryClient = useContext(
34+
getQueryClientContext(QueryClientSharingContext)
3535
)
3636

3737
if (!queryClient) {
38-
throw new Error('No QueryClient set, use QueryClientProvider to set one')
38+
throw new Error('No QueryClient set')
3939
}
4040

4141
return queryClient
@@ -46,23 +46,20 @@ export interface QueryClientProviderProps {
4646
contextSharing?: boolean
4747
}
4848

49-
export const QueryClientProvider: React.FC<QueryClientProviderProps> = ({
50-
client,
51-
contextSharing = false,
52-
children,
53-
}) => {
54-
React.useEffect(() => {
55-
client.mount()
56-
return () => {
57-
client.unmount()
58-
}
59-
}, [client])
49+
export const QueryClientProvider = ({props}:QueryClientProviderProps) => {
50+
createEffect(() => {
51+
props.client.mount()
52+
})
53+
54+
onCleanup(() => {
55+
props.clien.unmount()
56+
})
6057

61-
const Context = getQueryClientContext(contextSharing)
58+
const Context = getQueryClientContext(props.contextSharing())
6259

6360
return (
64-
<QueryClientSharingContext.Provider value={contextSharing}>
65-
<Context.Provider value={client}>{children}</Context.Provider>
61+
<QueryClientSharingContext.Provider value={contextSharing()}>
62+
<Context.Provider value={props.client()}>{props.children()}</Context.Provider>
6663
</QueryClientSharingContext.Provider>
6764
)
6865
}

src/react/QueryErrorResetBoundary.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import {createContext, useContext, createMemo} from "solid-js"
22

33
// CONTEXT
44

@@ -23,29 +23,29 @@ function createValue(): QueryErrorResetBoundaryValue {
2323
}
2424
}
2525

26-
const QueryErrorResetBoundaryContext = React.createContext(createValue())
26+
const QueryErrorResetBoundaryContext = createContext(createValue())
2727

2828
// HOOK
2929

3030
export const useQueryErrorResetBoundary = () =>
31-
React.useContext(QueryErrorResetBoundaryContext)
31+
useContext(QueryErrorResetBoundaryContext)
3232

3333
// COMPONENT
3434

3535
export interface QueryErrorResetBoundaryProps {
3636
children:
37-
| ((value: QueryErrorResetBoundaryValue) => React.ReactNode)
38-
| React.ReactNode
37+
| ((value: QueryErrorResetBoundaryValue) => JSX.Element)
38+
| JSX.Element
3939
}
4040

41-
export const QueryErrorResetBoundary: React.FC<QueryErrorResetBoundaryProps> = ({
41+
export const QueryErrorResetBoundary = ({
4242
children,
43-
}) => {
44-
const value = React.useMemo(() => createValue(), [])
43+
}:QueryErrorResetBoundaryProps) => {
44+
const value = createMemo(() => createValue())
4545
return (
46-
<QueryErrorResetBoundaryContext.Provider value={value}>
46+
<QueryErrorResetBoundaryContext.Provider value={value()}>
4747
{typeof children === 'function'
48-
? (children as Function)(value)
48+
? (children as Function)(value())
4949
: children}
5050
</QueryErrorResetBoundaryContext.Provider>
5151
)

src/react/setBatchUpdatesFn.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { notifyManager } from '../core'
2-
import { unstable_batchedUpdates } from './reactBatchedUpdates'
2+
import {batch} from 'solid-js'
33

4-
notifyManager.setBatchNotifyFunction(unstable_batchedUpdates)
4+
notifyManager.setBatchNotifyFunction(batch)

src/react/useBaseQuery.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import React from 'react'
2-
31
import { QueryKey } from '../core'
42
import { notifyManager } from '../core/notifyManager'
53
import { QueryObserver } from '../core/queryObserver'
64
import { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'
75
import { useQueryClient } from './QueryClientProvider'
86
import { UseBaseQueryOptions } from './types'
97
import { shouldThrowError } from './utils'
8+
import {createSignal, createMemo, createEffect, onCleanup} from 'solid-js'
109

1110
export function useBaseQuery<
1211
TQueryFnData,
@@ -24,12 +23,12 @@ export function useBaseQuery<
2423
>,
2524
Observer: typeof QueryObserver
2625
) {
27-
const mountedRef = React.useRef(false)
28-
const [, forceUpdate] = React.useState(0)
26+
const [mountedRef] = createSignal(false)
27+
const [, forceUpdate] = createSignal(0)
2928

3029
const queryClient = useQueryClient()
3130
const errorResetBoundary = useQueryErrorResetBoundary()
32-
const defaultedOptions = queryClient.defaultQueryObserverOptions(options)
31+
const [defaultedOptions] = createSignal(queryClient.defaultQueryObserverOptions(options))
3332

3433
// Make sure results are optimistically set in fetching state before subscribing or updating options
3534
defaultedOptions.optimisticResults = true
@@ -74,7 +73,7 @@ export function useBaseQuery<
7473
}
7574
}
7675

77-
const [observer] = React.useState(
76+
const [observer] = createSignal(
7877
() =>
7978
new Observer<TQueryFnData, TError, TData, TQueryData, TQueryKey>(
8079
queryClient,
@@ -84,7 +83,7 @@ export function useBaseQuery<
8483

8584
let result = observer.getOptimisticResult(defaultedOptions)
8685

87-
React.useEffect(() => {
86+
createEffect(() => {
8887
mountedRef.current = true
8988

9089
errorResetBoundary.clearReset()
@@ -100,18 +99,19 @@ export function useBaseQuery<
10099
// Update result to make sure we did not miss any query updates
101100
// between creating the observer and subscribing to it.
102101
observer.updateResult()
103-
104-
return () => {
102+
onCleanup(() => {
105103
mountedRef.current = false
106104
unsubscribe()
107-
}
108-
}, [errorResetBoundary, observer])
105+
})
106+
})
107+
108+
109109

110-
React.useEffect(() => {
110+
createEffect(() => {
111111
// Do not notify on updates because of changes in the options because
112112
// these changes should already be reflected in the optimistic result.
113-
observer.setOptions(defaultedOptions, { listeners: false })
114-
}, [defaultedOptions, observer])
113+
observer.setOptions(defaultedOptions(), { listeners: false })
114+
})
115115

116116
// Handle suspense
117117
if (defaultedOptions.suspense && result.isLoading) {

src/react/useInfiniteQuery.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { QueryFunction, QueryKey } from '../core/types'
44
import { parseQueryArgs } from '../core/utils'
55
import { UseInfiniteQueryOptions, UseInfiniteQueryResult } from './types'
66
import { useBaseQuery } from './useBaseQuery'
7+
import {createSignal, createMemo, createEffect, onCleanup} from 'solid-js'
8+
79

810
// HOOK
911

src/react/useIsFetching.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import React from 'react'
1+
2+
import {createSignal, createMemo, createEffect, onCleanup} from 'solid-js'
23

34
import { notifyManager } from '../core/notifyManager'
45
import { QueryKey } from '../core/types'
@@ -14,21 +15,21 @@ export function useIsFetching(
1415
arg1?: QueryKey | QueryFilters,
1516
arg2?: QueryFilters
1617
): number {
17-
const mountedRef = React.useRef(false)
18+
const mountedRef = false
1819

1920
const queryClient = useQueryClient()
2021

2122
const [filters] = parseFilterArgs(arg1, arg2)
22-
const [isFetching, setIsFetching] = React.useState(
23+
const [isFetching, setIsFetching] = createSignal(
2324
queryClient.isFetching(filters)
2425
)
2526

26-
const filtersRef = React.useRef(filters)
27+
const filtersRef = filters
2728
filtersRef.current = filters
28-
const isFetchingRef = React.useRef(isFetching)
29+
const isFetchingRef = isFetching
2930
isFetchingRef.current = isFetching
3031

31-
React.useEffect(() => {
32+
createEffect(() => {
3233
mountedRef.current = true
3334

3435
const unsubscribe = queryClient.getQueryCache().subscribe(
@@ -42,11 +43,12 @@ export function useIsFetching(
4243
})
4344
)
4445

45-
return () => {
46+
onCleanup(()=>{
4647
mountedRef.current = false
4748
unsubscribe()
48-
}
49-
}, [queryClient])
49+
})
50+
51+
})
5052

5153
return isFetching
5254
}

src/react/useIsMutating.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import React from 'react'
1+
2+
import {createSignal, createMemo, createEffect, onCleanup} from 'solid-js'
23

34
import { notifyManager } from '../core/notifyManager'
45
import { QueryKey } from '../core/types'
@@ -14,12 +15,12 @@ export function useIsMutating(
1415
arg1?: QueryKey | MutationFilters,
1516
arg2?: MutationFilters
1617
): number {
17-
const mountedRef = React.useRef(false)
18+
const mountedRef = false
1819
const filters = parseMutationFilterArgs(arg1, arg2)
1920

2021
const queryClient = useQueryClient()
2122

22-
const [isMutating, setIsMutating] = React.useState(
23+
const [isMutating, setIsMutating] = createSignal(
2324
queryClient.isMutating(filters)
2425
)
2526

@@ -28,7 +29,7 @@ export function useIsMutating(
2829
const isMutatingRef = React.useRef(isMutating)
2930
isMutatingRef.current = isMutating
3031

31-
React.useEffect(() => {
32+
createEffect(() => {
3233
mountedRef.current = true
3334

3435
const unsubscribe = queryClient.getMutationCache().subscribe(
@@ -42,11 +43,12 @@ export function useIsMutating(
4243
})
4344
)
4445

45-
return () => {
46+
onCleanup(()=>{
4647
mountedRef.current = false
4748
unsubscribe()
48-
}
49-
}, [queryClient])
49+
})
50+
51+
})
5052

5153
return isMutating
5254
}

0 commit comments

Comments
 (0)