@rozenite/tanstack-query-plugin 1.0.0-alpha.4 → 1.0.0-alpha.6

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.
Files changed (36) hide show
  1. package/dist/assets/{CXEL7IU7-B737zydj.js → CXEL7IU7-B6IQn3K5.js} +1 -1
  2. package/dist/assets/{tanstack-query-DSN-k5Qe.js → tanstack-query-PB2x2Kty.js} +16 -16
  3. package/dist/react-native.cjs +1 -1
  4. package/dist/react-native.d.ts +1 -5
  5. package/dist/react-native.js +1 -1
  6. package/dist/rozenite.config.d.ts +7 -0
  7. package/dist/rozenite.json +1 -1
  8. package/dist/src/react-native/useHandleDevToolsMessages.d.ts +3 -0
  9. package/dist/src/react-native/useHandleInitialData.d.ts +3 -0
  10. package/dist/src/react-native/useSyncTanStackCache.d.ts +3 -0
  11. package/dist/src/react-native/useTanStackQueryDevTools.d.ts +2 -0
  12. package/dist/src/shared/dehydrate.d.ts +6 -0
  13. package/dist/src/shared/hydrate.d.ts +10 -0
  14. package/dist/src/shared/messaging.d.ts +34 -0
  15. package/dist/src/shared/types.d.ts +25 -0
  16. package/dist/src/shared/useSyncOnlineStatus.d.ts +2 -0
  17. package/dist/src/ui/tanstack-query.d.ts +1 -0
  18. package/dist/src/ui/useHandleSyncMessages.d.ts +2 -0
  19. package/dist/src/ui/useSyncDevToolsEvents.d.ts +2 -0
  20. package/dist/src/ui/useSyncInitialData.d.ts +2 -0
  21. package/dist/tanstack-query.html +1 -1
  22. package/dist/useTanstackQueryDevTools.cjs +1 -0
  23. package/dist/useTanstackQueryDevTools.js +312 -0
  24. package/package.json +13 -12
  25. package/src/react-native/useHandleDevToolsMessages.ts +2 -3
  26. package/src/react-native/useHandleInitialData.ts +2 -3
  27. package/src/react-native/useSyncTanStackCache.ts +223 -10
  28. package/src/react-native/{useTanStackQueryDevTools.ts → useTanstackQueryDevTools.ts} +5 -4
  29. package/src/shared/dehydrate.ts +8 -6
  30. package/src/shared/hydrate.ts +218 -74
  31. package/src/shared/messaging.ts +36 -1
  32. package/src/shared/types.ts +5 -0
  33. package/src/shared/useSyncOnlineStatus.ts +2 -3
  34. package/src/ui/tanstack-query.tsx +1 -1
  35. package/src/ui/useHandleSyncMessages.ts +45 -3
  36. package/dist/useTanStackQueryDevTools.js +0 -1
@@ -1,23 +1,236 @@
1
- import { useQueryClient } from '@tanstack/react-query';
2
- import { useEffect } from 'react';
1
+ import {
2
+ QueryClient,
3
+ QueryCacheNotifyEvent,
4
+ MutationCacheNotifyEvent,
5
+ } from '@tanstack/react-query';
6
+ import { useEffect, useMemo, useRef } from 'react';
7
+ import equal from 'fast-deep-equal';
3
8
  import { TanStackQueryPluginClient } from '../shared/messaging';
4
- import { dehydrateQueryClient } from '../shared/dehydrate';
9
+ import {
10
+ dehydrateQuery,
11
+ dehydrateMutation,
12
+ dehydrateObservers,
13
+ } from '../shared/dehydrate';
14
+ import { SerializableObserver, PartialQueryState } from '../shared/types';
5
15
 
6
16
  export const useSyncTanStackCache = (
17
+ queryClient: QueryClient,
7
18
  client: TanStackQueryPluginClient | null
8
19
  ) => {
9
- const queryClient = useQueryClient();
20
+ const previousObserversRef = useRef<Map<string, SerializableObserver[]>>(
21
+ new Map()
22
+ );
23
+
24
+ const handler = useMemo(() => {
25
+ return (event: QueryCacheNotifyEvent | MutationCacheNotifyEvent): void => {
26
+ if (!client) {
27
+ return;
28
+ }
29
+
30
+ if (event.type === 'observerResultsUpdated') {
31
+ // We don't need to sync this type of events.
32
+ return;
33
+ }
34
+
35
+ if ('query' in event) {
36
+ const { query, type } = event;
37
+
38
+ if (type === 'added' || type === 'removed') {
39
+ if (type === 'removed') {
40
+ // We don't need to store observers for removed queries.
41
+ previousObserversRef.current.delete(query.queryHash);
42
+ }
43
+
44
+ const dehydratedQuery = dehydrateQuery(query);
45
+ client.send('sync-query-event', { type, data: dehydratedQuery });
46
+ return;
47
+ }
48
+
49
+ if (type === 'updated' && 'action' in event) {
50
+ const action = event.action;
51
+
52
+ switch (action.type) {
53
+ case 'fetch': {
54
+ // Only need loading state and fetch metadata
55
+ const fetchData: PartialQueryState = {
56
+ queryHash: query.queryHash,
57
+ state: {
58
+ status: query.state.status,
59
+ fetchStatus: query.state.fetchStatus,
60
+ fetchMeta: query.state.fetchMeta,
61
+ dataUpdatedAt: query.state.dataUpdatedAt,
62
+ errorUpdatedAt: query.state.errorUpdatedAt,
63
+ },
64
+ };
65
+ client.send('sync-query-event', {
66
+ type: 'updated',
67
+ action: 'fetch',
68
+ data: fetchData,
69
+ });
70
+ break;
71
+ }
72
+
73
+ case 'success': {
74
+ // Only need new data and success state
75
+ const successData: PartialQueryState = {
76
+ queryHash: query.queryHash,
77
+ state: {
78
+ status: query.state.status,
79
+ data: query.state.data,
80
+ dataUpdatedAt: query.state.dataUpdatedAt,
81
+ error: query.state.error,
82
+ errorUpdatedAt: query.state.errorUpdatedAt,
83
+ fetchStatus: query.state.fetchStatus,
84
+ },
85
+ };
86
+ client.send('sync-query-event', {
87
+ type: 'updated',
88
+ action: 'success',
89
+ data: successData,
90
+ });
91
+ break;
92
+ }
93
+
94
+ case 'error': {
95
+ // Only need error information
96
+ const errorData: PartialQueryState = {
97
+ queryHash: query.queryHash,
98
+ state: {
99
+ status: query.state.status,
100
+ error: query.state.error,
101
+ errorUpdatedAt: query.state.errorUpdatedAt,
102
+ fetchStatus: query.state.fetchStatus,
103
+ },
104
+ };
105
+ client.send('sync-query-event', {
106
+ type: 'updated',
107
+ action: 'error',
108
+ data: errorData,
109
+ });
110
+ break;
111
+ }
112
+
113
+ case 'setState': {
114
+ // Only need the specific state changes
115
+ const setStateData: PartialQueryState = {
116
+ queryHash: query.queryHash,
117
+ state: action.state, // Only the changed state parts
118
+ };
119
+ client.send('sync-query-event', {
120
+ type: 'updated',
121
+ action: 'setState',
122
+ data: setStateData,
123
+ });
124
+ break;
125
+ }
126
+
127
+ case 'invalidate': {
128
+ // Only need invalidation flag
129
+ const invalidateData: PartialQueryState = {
130
+ queryHash: query.queryHash,
131
+ state: {
132
+ isInvalidated: query.state.isInvalidated,
133
+ },
134
+ };
135
+ client.send('sync-query-event', {
136
+ type: 'updated',
137
+ action: 'invalidate',
138
+ data: invalidateData,
139
+ });
140
+ break;
141
+ }
142
+
143
+ case 'pause': {
144
+ // Need to sync the paused fetch status
145
+ const pauseData: PartialQueryState = {
146
+ queryHash: query.queryHash,
147
+ state: {
148
+ fetchStatus: query.state.fetchStatus,
149
+ },
150
+ };
151
+ client.send('sync-query-event', {
152
+ type: 'updated',
153
+ action: 'pause',
154
+ data: pauseData,
155
+ });
156
+ break;
157
+ }
158
+
159
+ case 'continue': {
160
+ // Need to sync the resumed fetch status
161
+ const continueData: PartialQueryState = {
162
+ queryHash: query.queryHash,
163
+ state: {
164
+ fetchStatus: query.state.fetchStatus,
165
+ },
166
+ };
167
+ client.send('sync-query-event', {
168
+ type: 'updated',
169
+ action: 'continue',
170
+ data: continueData,
171
+ });
172
+ break;
173
+ }
174
+
175
+ default: {
176
+ // Fallback to full data for unknown actions
177
+ const dehydratedQuery = dehydrateQuery(query);
178
+ client.send('sync-query-event', { type, data: dehydratedQuery });
179
+ }
180
+ }
181
+ return;
182
+ }
183
+
184
+ if (
185
+ type === 'observerAdded' ||
186
+ type === 'observerRemoved' ||
187
+ type === 'observerOptionsUpdated'
188
+ ) {
189
+ const dehydratedObservers = dehydrateObservers(query);
190
+ const previousObservers = previousObserversRef.current.get(
191
+ query.queryHash
192
+ );
193
+
194
+ // For observerOptionsUpdated, only send if the observers actually changed
195
+ if (type === 'observerOptionsUpdated' && previousObservers) {
196
+ if (equal(previousObservers, dehydratedObservers)) {
197
+ // No meaningful change, skip sending
198
+ return;
199
+ }
200
+ }
201
+
202
+ previousObserversRef.current.set(
203
+ query.queryHash,
204
+ dehydratedObservers
205
+ );
206
+
207
+ client.send('sync-query-event', {
208
+ type,
209
+ data: {
210
+ queryHash: query.queryHash,
211
+ observers: dehydratedObservers,
212
+ },
213
+ });
214
+ return;
215
+ }
216
+ }
217
+
218
+ const { mutation, type } = event;
219
+ if (mutation) {
220
+ const dehydratedMutation = dehydrateMutation(mutation);
221
+ client.send('sync-mutation-event', {
222
+ type,
223
+ data: dehydratedMutation,
224
+ });
225
+ }
226
+ };
227
+ }, [client]);
10
228
 
11
229
  useEffect(() => {
12
230
  if (!client) {
13
231
  return;
14
232
  }
15
233
 
16
- const handler = (): void => {
17
- const dehydratedState = dehydrateQueryClient(queryClient);
18
- client.send('sync-data', { data: dehydratedState });
19
- };
20
-
21
234
  const mutationCacheSubscription = queryClient
22
235
  .getMutationCache()
23
236
  .subscribe(handler);
@@ -29,5 +242,5 @@ export const useSyncTanStackCache = (
29
242
  mutationCacheSubscription();
30
243
  queryCacheSubscription();
31
244
  };
32
- }, [client, queryClient]);
245
+ }, [client, queryClient, handler]);
33
246
  };
@@ -1,3 +1,4 @@
1
+ import { QueryClient } from '@tanstack/react-query';
1
2
  import { useRozeniteDevToolsClient } from '@rozenite/plugin-bridge';
2
3
  import { TanStackQueryPluginEventMap } from '../shared/messaging';
3
4
  import { useSyncOnlineStatus } from '../shared/useSyncOnlineStatus';
@@ -5,16 +6,16 @@ import { useHandleDevToolsMessages } from './useHandleDevToolsMessages';
5
6
  import { useSyncTanStackCache } from './useSyncTanStackCache';
6
7
  import { useHandleInitialData } from './useHandleInitialData';
7
8
 
8
- export const useTanStackQueryDevTools = () => {
9
+ export const useTanStackQueryDevTools = (queryClient: QueryClient) => {
9
10
  const client = useRozeniteDevToolsClient<TanStackQueryPluginEventMap>({
10
11
  pluginId: '@rozenite/tanstack-query-plugin',
11
12
  });
12
13
 
13
14
  useSyncOnlineStatus(client);
14
15
 
15
- useHandleDevToolsMessages(client);
16
+ useHandleDevToolsMessages(queryClient, client);
16
17
 
17
- useSyncTanStackCache(client);
18
+ useSyncTanStackCache(queryClient, client);
18
19
 
19
- useHandleInitialData(client);
20
+ useHandleInitialData(queryClient, client);
20
21
  };
@@ -6,13 +6,15 @@ import type {
6
6
  SerializableQueryClient,
7
7
  } from './types';
8
8
 
9
+ export const dehydrateObservers = (query: Query): SerializableObserver[] => {
10
+ return query.observers.map((observer) => ({
11
+ queryHash: query.queryHash,
12
+ options: observer.options,
13
+ }));
14
+ };
15
+
9
16
  export const dehydrateQuery = (query: Query): SerializableQuery => {
10
- const dehydratedObservers: SerializableObserver[] = query.observers.map(
11
- (observer) => ({
12
- queryHash: query.queryHash,
13
- options: observer.options,
14
- })
15
- );
17
+ const dehydratedObservers: SerializableObserver[] = dehydrateObservers(query);
16
18
 
17
19
  return {
18
20
  state: query.state,
@@ -7,100 +7,244 @@ import {
7
7
  QueryObserverOptions,
8
8
  QueryState,
9
9
  } from '@tanstack/react-query';
10
- import { SerializableQueryClient } from './types';
10
+ import type {
11
+ SerializableQuery,
12
+ SerializableMutation,
13
+ SerializableQueryClient,
14
+ SerializableObserver,
15
+ PartialQueryState,
16
+ } from './types';
11
17
 
12
18
  const mockQueryFn = () => {
13
19
  return Promise.resolve(null);
14
20
  };
15
21
 
16
- export const hydrateQueryClient = (
22
+ const hydrateObservers = (
17
23
  client: QueryClient,
18
- dehydratedState: SerializableQueryClient
19
- ): void => {
20
- const queryCache = client.getQueryCache();
21
- const mutationCache = client.getMutationCache();
24
+ queryHash: string,
25
+ dehydratedObservers: SerializableObserver[]
26
+ ) => {
27
+ const query = client.getQueryCache().get(queryHash);
28
+
29
+ if (!query) {
30
+ return;
31
+ }
32
+
33
+ query.observers.forEach((observer) => {
34
+ query.removeObserver(observer);
35
+ });
22
36
 
23
- // Sync mutations
24
- dehydratedState.mutations.forEach(({ options, state }) => {
25
- const existingMutation = mutationCache.find({
26
- mutationKey: options.mutationKey,
27
- });
28
- const hydratedState: MutationState<unknown, Error, void, unknown> =
29
- state as MutationState<unknown, Error, void, unknown>;
30
- const hydratedOptions: MutationOptions = options;
31
-
32
- if (existingMutation) {
33
- mutationCache.remove(existingMutation);
37
+ dehydratedObservers.forEach((observerState) => {
38
+ const hydratedOptions: InfiniteQueryObserverOptions | QueryObserverOptions =
39
+ observerState.options;
40
+
41
+ if ('initialPageParam' in hydratedOptions) {
42
+ delete hydratedOptions.initialPageParam;
43
+ }
44
+
45
+ if ('behavior' in hydratedOptions) {
46
+ delete hydratedOptions.behavior;
34
47
  }
35
48
 
36
- mutationCache.build(client, hydratedOptions, hydratedState);
49
+ hydratedOptions.queryFn = mockQueryFn;
50
+
51
+ const observer = new QueryObserver(
52
+ client,
53
+ hydratedOptions as QueryObserverOptions
54
+ );
55
+ query.addObserver(observer);
56
+ });
57
+ };
58
+
59
+ const hydrateMutation = (
60
+ client: QueryClient,
61
+ dehydratedMutation: SerializableMutation
62
+ ) => {
63
+ const mutationCache = client.getMutationCache();
64
+ const { options, state } = dehydratedMutation;
65
+
66
+ const existingMutation = mutationCache.find({
67
+ mutationKey: options.mutationKey,
37
68
  });
69
+ const hydratedState: MutationState<unknown, Error, void, unknown> =
70
+ state as MutationState<unknown, Error, void, unknown>;
71
+ const hydratedOptions: MutationOptions = options;
72
+
73
+ if (existingMutation) {
74
+ mutationCache.remove(existingMutation);
75
+ }
76
+
77
+ mutationCache.build(client, hydratedOptions, hydratedState);
78
+ };
79
+
80
+ const hydrateQuery = (
81
+ client: QueryClient,
82
+ dehydratedQuery: SerializableQuery
83
+ ) => {
84
+ const queryCache = client.getQueryCache();
85
+ const { queryKey, state, queryHash, observers } = dehydratedQuery;
86
+
87
+ let query = queryCache.get(queryHash);
88
+ const data = state.data;
89
+ const hydratedState: QueryState = state;
90
+
91
+ // Do not hydrate if an existing query exists with newer data
92
+ if (query) {
93
+ if (
94
+ query.state.dataUpdatedAt < state.dataUpdatedAt ||
95
+ query.state.fetchStatus !== state.fetchStatus
96
+ ) {
97
+ query.setState({
98
+ ...hydratedState,
99
+ data,
100
+ });
101
+ query.setOptions({
102
+ ...query.options,
103
+ queryFn: mockQueryFn,
104
+ retry: 0,
105
+ });
106
+ }
107
+ } else {
108
+ // Restore query
109
+ query = queryCache.build(
110
+ client,
111
+ {
112
+ ...client.getDefaultOptions().hydrate?.queries,
113
+ queryKey,
114
+ queryHash,
115
+ queryFn: mockQueryFn,
116
+ },
117
+ {
118
+ ...hydratedState,
119
+ data,
120
+ }
121
+ );
122
+ }
123
+
124
+ hydrateObservers(client, queryHash, observers);
125
+ };
126
+
127
+ export const hydrateQueryClient = (
128
+ client: QueryClient,
129
+ dehydratedState: SerializableQueryClient
130
+ ): void => {
131
+ // Hydrate mutations
132
+ dehydratedState.mutations.forEach((mutation) =>
133
+ hydrateMutation(client, mutation)
134
+ );
38
135
 
39
136
  // Hydrate queries
40
- dehydratedState.queries.forEach(
41
- ({ queryKey, state, queryHash, observers }) => {
42
- let query = queryCache.get(queryHash);
43
- const data = state.data;
44
- const hydratedState: QueryState = state;
137
+ dehydratedState.queries.forEach((query) => hydrateQuery(client, query));
138
+ };
45
139
 
46
- // Do not hydrate if an existing query exists with newer data
47
- if (query) {
48
- if (
49
- query.state.dataUpdatedAt < state.dataUpdatedAt ||
50
- query.state.fetchStatus !== state.fetchStatus
51
- ) {
52
- query.setState({
53
- ...hydratedState,
54
- data,
55
- });
56
- query.setOptions({
57
- ...query.options,
58
- queryFn: mockQueryFn,
59
- retry: 0,
60
- });
61
- }
140
+ export const applyQueryEvent = (
141
+ queryClient: QueryClient,
142
+ type:
143
+ | 'added'
144
+ | 'updated'
145
+ | 'removed'
146
+ | 'observerAdded'
147
+ | 'observerRemoved'
148
+ | 'observerResultsUpdated'
149
+ | 'observerOptionsUpdated',
150
+ data: SerializableQuery | PartialQueryState,
151
+ action?: string
152
+ ): void => {
153
+ const queryCache = queryClient.getQueryCache();
154
+
155
+ switch (type) {
156
+ case 'added': {
157
+ hydrateQuery(queryClient, data as SerializableQuery);
158
+ break;
159
+ }
160
+ case 'updated': {
161
+ if (action && 'state' in data && !('queryKey' in data)) {
162
+ // Handle action-based partial state update
163
+ applyPartialQueryState(queryClient, data as PartialQueryState);
62
164
  } else {
63
- // Restore query
64
- query = queryCache.build(
65
- client,
66
- {
67
- ...client.getDefaultOptions().hydrate?.queries,
68
- queryKey,
69
- queryHash,
70
- queryFn: mockQueryFn,
71
- },
72
- {
73
- ...hydratedState,
74
- data,
75
- }
76
- );
165
+ // Handle full query update (backward compatibility)
166
+ hydrateQuery(queryClient, data as SerializableQuery);
77
167
  }
168
+ break;
169
+ }
170
+ case 'observerAdded':
171
+ case 'observerRemoved':
172
+ case 'observerOptionsUpdated': {
173
+ hydrateObservers(queryClient, data.queryHash, (data as any).observers);
174
+ break;
175
+ }
176
+ case 'removed': {
177
+ const query = queryCache.get(data.queryHash);
178
+ if (query) {
179
+ queryCache.remove(query);
180
+ }
181
+ break;
182
+ }
183
+ }
184
+ };
78
185
 
79
- query.observers.forEach((observer) => {
80
- query.removeObserver(observer);
81
- });
82
-
83
- observers.forEach((observerState) => {
84
- const hydratedOptions:
85
- | InfiniteQueryObserverOptions
86
- | QueryObserverOptions = observerState.options;
186
+ // New function to handle action-based partial state updates
187
+ export const applyPartialQueryState = (
188
+ queryClient: QueryClient,
189
+ data: PartialQueryState
190
+ ): void => {
191
+ const queryCache = queryClient.getQueryCache();
192
+ const query = queryCache.get(data.queryHash);
87
193
 
88
- if ('initialPageParam' in hydratedOptions) {
89
- delete hydratedOptions.initialPageParam;
90
- }
194
+ if (!query) {
195
+ // Query doesn't exist, we need to create it with minimal data
196
+ // This is a fallback for when we receive a partial update for a non-existent query
197
+ return;
198
+ }
91
199
 
92
- if ('behavior' in hydratedOptions) {
93
- delete hydratedOptions.behavior;
94
- }
200
+ // Apply the partial state changes
201
+ if (data.state) {
202
+ query.setState(data.state);
203
+ }
204
+ };
95
205
 
96
- hydratedOptions.queryFn = mockQueryFn;
206
+ export const applyMutationEvent = (
207
+ queryClient: QueryClient,
208
+ type:
209
+ | 'added'
210
+ | 'updated'
211
+ | 'removed'
212
+ | 'observerAdded'
213
+ | 'observerRemoved'
214
+ | 'observerResultsUpdated'
215
+ | 'observerOptionsUpdated',
216
+ data: SerializableMutation
217
+ ): void => {
218
+ const mutationCache = queryClient.getMutationCache();
97
219
 
98
- const observer = new QueryObserver(
99
- client,
100
- hydratedOptions as QueryObserverOptions
101
- );
102
- query.addObserver(observer);
220
+ switch (type) {
221
+ case 'added':
222
+ case 'updated':
223
+ case 'observerAdded':
224
+ case 'observerRemoved':
225
+ case 'observerResultsUpdated':
226
+ case 'observerOptionsUpdated': {
227
+ hydrateMutation(queryClient, data);
228
+ break;
229
+ }
230
+ case 'removed': {
231
+ const mutation = mutationCache.find({
232
+ mutationKey: data.options.mutationKey,
103
233
  });
234
+ if (mutation) {
235
+ mutationCache.remove(mutation);
236
+ }
237
+ break;
104
238
  }
105
- );
239
+ }
240
+ };
241
+
242
+ export const applyQueryObserverEvent = (
243
+ queryClient: QueryClient,
244
+ data: {
245
+ queryHash: string;
246
+ observers: SerializableObserver[];
247
+ }
248
+ ): void => {
249
+ hydrateObservers(queryClient, data.queryHash, data.observers);
106
250
  };
@@ -1,5 +1,12 @@
1
1
  import type { RozeniteDevToolsClient } from '@rozenite/plugin-bridge';
2
- import { DevToolsActionType, SerializableQueryClient } from './types';
2
+ import {
3
+ DevToolsActionType,
4
+ SerializableQueryClient,
5
+ SerializableQuery,
6
+ SerializableMutation,
7
+ SerializableObserver,
8
+ PartialQueryState,
9
+ } from './types';
3
10
 
4
11
  export type TanStackQueryPluginEventMap = {
5
12
  'online-status-changed': {
@@ -13,6 +20,34 @@ export type TanStackQueryPluginEventMap = {
13
20
  'sync-data': {
14
21
  data: SerializableQueryClient;
15
22
  };
23
+ 'sync-query-event':
24
+ | {
25
+ type: 'added' | 'removed';
26
+ data: SerializableQuery;
27
+ }
28
+ | {
29
+ type: 'updated';
30
+ action?: string; // Add action type for optimization
31
+ data: SerializableQuery | PartialQueryState; // Support both full and partial state
32
+ }
33
+ | {
34
+ type: 'observerAdded' | 'observerRemoved' | 'observerOptionsUpdated';
35
+ data: {
36
+ queryHash: string;
37
+ observers: SerializableObserver[];
38
+ };
39
+ };
40
+ 'sync-mutation-event': {
41
+ type:
42
+ | 'added'
43
+ | 'updated'
44
+ | 'removed'
45
+ | 'observerAdded'
46
+ | 'observerRemoved'
47
+ | 'observerResultsUpdated'
48
+ | 'observerOptionsUpdated';
49
+ data: SerializableMutation;
50
+ };
16
51
  };
17
52
 
18
53
  export type TanStackQueryPluginClient =
@@ -14,6 +14,11 @@ export type SerializableQuery = {
14
14
  observers: SerializableObserver[];
15
15
  };
16
16
 
17
+ export type PartialQueryState = {
18
+ queryHash: string;
19
+ state: Partial<QueryState>;
20
+ };
21
+
17
22
  export type SerializableMutation = {
18
23
  mutationId: number;
19
24
  options: MutationOptions;
@@ -11,14 +11,13 @@ export const useSyncOnlineStatus = (
11
11
  }
12
12
 
13
13
  const onlineManagerSubscription = onlineManager.subscribe((online) => {
14
- // client.send('online-status-changed', { online });
14
+ client.send('online-status-changed', { online });
15
15
  });
16
16
 
17
17
  const onlineMessageSubscription = client.onMessage(
18
18
  'online-status-changed',
19
19
  ({ online }) => {
20
- console.log('changed from ', onlineManager.isOnline(), 'to', online);
21
- // onlineManager.setOnline(online);
20
+ onlineManager.setOnline(online);
22
21
  }
23
22
  );
24
23