-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
Copy pathwith-persist-query-client.ts
88 lines (85 loc) · 2.58 KB
/
with-persist-query-client.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
84
85
86
87
88
import {
QueryClient,
provideIsRestoring,
queryFeature,
} from '@tanstack/angular-query-experimental'
import {
DestroyRef,
ENVIRONMENT_INITIALIZER,
PLATFORM_ID,
inject,
signal,
} from '@angular/core'
import { isPlatformBrowser } from '@angular/common'
import {
persistQueryClientRestore,
persistQueryClientSubscribe,
} from '@tanstack/query-persist-client-core'
import type { PersistQueryClientOptions as PersistQueryClientOptionsCore } from '@tanstack/query-persist-client-core'
import type { PersistQueryClientFeature } from '@tanstack/angular-query-experimental'
type PersistQueryClientOptions = {
persistOptions: Omit<PersistQueryClientOptionsCore, 'queryClient'>
onSuccess?: () => Promise<unknown> | unknown
onError?: () => Promise<unknown> | unknown
}
/**
* Enables persistence.
*
* **Example**
*
* ```ts
* const localStoragePersister = createSyncStoragePersister({
* storage: window.localStorage,
* })
*
* export const appConfig: ApplicationConfig = {
* providers: [
* provideTanStackQuery(
* new QueryClient(),
* withPersistQueryClient({
* persistOptions: {
* persister: localStoragePersister,
* },
* onSuccess: () => console.log('Restoration completed successfully.'),
* })
* ),
* ],
* };
* ```
* @param persistQueryClientOptions - persistence options and optional onSuccess and onError callbacks which get called when the restoration process is complete.
* @returns A set of providers for use with `provideTanStackQuery`.
* @public
*/
export function withPersistQueryClient(
persistQueryClientOptions: PersistQueryClientOptions,
): PersistQueryClientFeature {
const isRestoring = signal(false)
const providers = [
provideIsRestoring(isRestoring.asReadonly()),
{
provide: ENVIRONMENT_INITIALIZER,
multi: true,
useValue: () => {
if (!isPlatformBrowser(inject(PLATFORM_ID))) return
const destroyRef = inject(DestroyRef)
const queryClient = inject(QueryClient)
isRestoring.set(true)
const { onSuccess, onError, persistOptions } = persistQueryClientOptions
const options = { queryClient, ...persistOptions }
persistQueryClientRestore(options)
.then(() => {
onSuccess?.()
})
.catch(() => {
onError?.()
})
.finally(() => {
isRestoring.set(false)
const cleanup = persistQueryClientSubscribe(options)
destroyRef.onDestroy(cleanup)
})
},
},
]
return queryFeature('PersistQueryClient', providers)
}