@rozenite/tanstack-query-plugin 1.0.0-alpha.0 → 1.0.0-alpha.1

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("@rozenite/plugin-bridge"),O=require("react"),D=u=>{const e=d.useRozeniteDevToolsClient({pluginId:"@rozenite/tanstack-query-plugin"});O.useEffect(()=>{if(!e)return;const c=e.onMessage("DEVTOOLS_TO_DEVICE_INITIAL_DATA_REQUEST",()=>{e.send("DEVICE_TO_DEVTOOLS_INITIAL_DATA",{queries:u.getQueryCache().getAll(),mutations:u.getMutationCache().getAll()})});return()=>c.remove()},[e,u]);const o=O.useRef(new Set),a=O.useCallback(c=>{const n=T=>u.getQueryCache().getAll().find(E=>E.queryHash===T);(T=>{var f;const{type:E,queryHash:t,metadata:_,requestId:s}=T;if(E==="REFETCH"&&t&&((f=n(t))==null||f.fetch(),s&&(o.current.add(s),e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}),o.current.delete(s))),E==="INVALIDATE"&&t){const r=n(t);r&&u.invalidateQueries({queryKey:r.queryKey}),s&&(e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}))}if(E==="RESET"&&t){const r=n(t);r&&u.resetQueries({queryKey:r.queryKey}),s&&(e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}))}if(E==="REMOVE"&&t){const r=n(t);r&&u.removeQueries({queryKey:r.queryKey}),s&&(e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}))}if(E==="TRIGGER_LOADING"&&t){const r=n(t);r&&(r.setState({...r.state,fetchStatus:"fetching",status:"pending",error:null}),s&&(o.current.add(s),e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}),o.current.delete(s)))}if(E==="RESTORE_LOADING"&&t){const r=n(t);r&&(r.setState({...r.state,fetchStatus:"idle"}),s&&(o.current.add(s),e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}),o.current.delete(s)))}if(E==="TRIGGER_ERROR"&&t){const r=n(t);r&&(r.setState({...r.state,fetchStatus:"idle",status:"error",error:(_==null?void 0:_.error)||new Error("Forced error via devtools"),errorUpdateCount:(r.state.errorUpdateCount??0)+1,errorUpdatedAt:Date.now()}),s&&(o.current.add(s),e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}),o.current.delete(s)))}if(E==="RESTORE_ERROR"&&t){const r=n(t);r&&u.resetQueries({queryKey:r.queryKey}),s&&(e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}))}E==="CLEAR_MUTATION_CACHE"&&(u.getMutationCache().clear(),s&&(e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0}))),E==="CLEAR_QUERY_CACHE"&&(u.clear(),s&&(e==null||e.send("DEVICE_TO_DEVTOOLS_ACK",{requestId:s,success:!0})))})(c)},[u,e]);O.useEffect(()=>{if(!e)return;const c=e.onMessage("DEVTOOLS_TO_DEVICE",a);return()=>c.remove()},[a,e]),O.useEffect(()=>{if(e)return u.getQueryCache().subscribe(c=>{o.current.size>0||e.send("DEVICE_TO_DEVTOOLS",c)})},[e,u]),O.useEffect(()=>{if(e)return u.getMutationCache().subscribe(c=>{o.current.size>0||e.send("DEVICE_TO_DEVTOOLS",c)})},[e,u])};exports.useTanStackQueryDevTools=void 0;process.env.NODE_ENV!=="production"?exports.useTanStackQueryDevTools=D:exports.useTanStackQueryDevTools=()=>({isConnected:!1});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("@rozenite/plugin-bridge"),i=require("react"),a=require("@tanstack/react-query"),y=e=>{i.useEffect(()=>{if(!e)return;const s=a.onlineManager.subscribe(r=>{}),n=e.onMessage("online-status-changed",({online:r})=>{console.log("changed from ",a.onlineManager.isOnline(),"to",r)});return()=>{s(),n.remove()}},[e])},h=e=>{const s=a.useQueryClient();i.useEffect(()=>{if(!e)return;const n=e.onMessage("devtools-action",({type:r,queryHash:u})=>{const t=s.getQueryCache().get(u);if(!t){console.warn(`No active query found for hash: ${u}`);return}switch(r){case"TRIGGER_ERROR":{const o=t.options,c=new Error("Unknown error from devtools");t.setState({status:"error",error:c,fetchMeta:{...t.state.fetchMeta,__previousQueryOptions:o}});break}case"RESTORE_ERROR":{s.resetQueries(t);break}case"TRIGGER_LOADING":{if(!t)return;const o=t.options;t.fetch({...o,queryFn:()=>new Promise(()=>{}),gcTime:-1}),t.setState({data:void 0,status:"pending",fetchMeta:{...t.state.fetchMeta,__previousQueryOptions:o}});break}case"RESTORE_LOADING":{const o=t.state,c=t.state.fetchMeta?t.state.fetchMeta.__previousQueryOptions:null;t.cancel({silent:!0}),t.setState({...o,fetchStatus:"idle",fetchMeta:null}),c&&t.fetch(c);break}case"RESET":{s.resetQueries(t);break}case"REMOVE":{s.removeQueries(t);break}case"REFETCH":{t.fetch().catch(()=>{});break}case"INVALIDATE":{s.invalidateQueries(t);break}default:console.warn(`Unknown devtools action: ${r}`)}});return()=>{n.remove()}},[e])},f=e=>{const s=e.observers.map(n=>({queryHash:e.queryHash,options:n.options}));return{state:e.state,queryKey:e.queryKey,queryHash:e.queryHash,observers:s}},p=e=>({mutationId:e.mutationId,state:e.state,options:e.options}),d=e=>({queries:e.getQueryCache().getAll().map(f),mutations:e.getMutationCache().getAll().map(p)}),v=e=>{const s=a.useQueryClient();i.useEffect(()=>{if(!e)return;const n=()=>{const t=d(s);e.send("sync-data",{data:t})},r=s.getMutationCache().subscribe(n),u=s.getQueryCache().subscribe(n);return()=>{r(),u()}},[e,s])},g=e=>{const s=a.useQueryClient();i.useEffect(()=>{if(!e)return;const n=e.onMessage("request-initial-data",()=>{const r=d(s);e.send("sync-data",{data:r})});return()=>{n.remove()}},[e,s])},b=()=>{const e=l.useRozeniteDevToolsClient({pluginId:"@rozenite/tanstack-query-plugin"});y(e),h(e),v(e),g(e)};exports.useTanStackQueryDevTools=void 0;process.env.NODE_ENV!=="production"?exports.useTanStackQueryDevTools=b:exports.useTanStackQueryDevTools=()=>({isConnected:!1});
@@ -1,88 +1,152 @@
1
- import { useRozeniteDevToolsClient as D } from "@rozenite/plugin-bridge";
2
- import { useEffect as _, useRef as i, useCallback as V } from "react";
3
- const I = (u) => {
4
- const e = D({
5
- pluginId: "@rozenite/tanstack-query-plugin"
6
- });
7
- _(() => {
8
- if (!e) return;
9
- const n = e.onMessage("DEVTOOLS_TO_DEVICE_INITIAL_DATA_REQUEST", () => {
10
- e.send("DEVICE_TO_DEVTOOLS_INITIAL_DATA", {
11
- queries: u.getQueryCache().getAll(),
12
- mutations: u.getMutationCache().getAll()
13
- });
1
+ import { useRozeniteDevToolsClient as p } from "@rozenite/plugin-bridge";
2
+ import { useEffect as i } from "react";
3
+ import { onlineManager as d, useQueryClient as u } from "@tanstack/react-query";
4
+ const f = (e) => {
5
+ i(() => {
6
+ if (!e)
7
+ return;
8
+ const s = d.subscribe((r) => {
9
+ }), n = e.onMessage("online-status-changed", ({ online: r }) => {
10
+ console.log("changed from ", d.isOnline(), "to", r);
14
11
  });
15
- return () => n.remove();
16
- }, [e, u]);
17
- const o = i(/* @__PURE__ */ new Set()), a = V((n) => {
18
- const O = (c) => u.getQueryCache().getAll().find((E) => E.queryHash === c);
19
- ((c) => {
20
- var f;
21
- const { type: E, queryHash: t, metadata: T, requestId: s } = c;
22
- if (E === "REFETCH" && t && ((f = O(t)) == null || f.fetch(), s && (o.current.add(s), e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }), o.current.delete(s))), E === "INVALIDATE" && t) {
23
- const r = O(t);
24
- r && u.invalidateQueries({ queryKey: r.queryKey }), s && (e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }));
25
- }
26
- if (E === "RESET" && t) {
27
- const r = O(t);
28
- r && u.resetQueries({ queryKey: r.queryKey }), s && (e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }));
29
- }
30
- if (E === "REMOVE" && t) {
31
- const r = O(t);
32
- r && u.removeQueries({ queryKey: r.queryKey }), s && (e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }));
33
- }
34
- if (E === "TRIGGER_LOADING" && t) {
35
- const r = O(t);
36
- r && (r.setState({
37
- ...r.state,
38
- fetchStatus: "fetching",
39
- status: "pending",
40
- error: null
41
- }), s && (o.current.add(s), e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }), o.current.delete(s)));
42
- }
43
- if (E === "RESTORE_LOADING" && t) {
44
- const r = O(t);
45
- r && (r.setState({
46
- ...r.state,
47
- fetchStatus: "idle"
48
- }), s && (o.current.add(s), e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }), o.current.delete(s)));
12
+ return () => {
13
+ s(), n.remove();
14
+ };
15
+ }, [e]);
16
+ }, y = (e) => {
17
+ const s = u();
18
+ i(() => {
19
+ if (!e)
20
+ return;
21
+ const n = e.onMessage("devtools-action", ({ type: r, queryHash: a }) => {
22
+ const t = s.getQueryCache().get(a);
23
+ if (!t) {
24
+ console.warn(`No active query found for hash: ${a}`);
25
+ return;
49
26
  }
50
- if (E === "TRIGGER_ERROR" && t) {
51
- const r = O(t);
52
- r && (r.setState({
53
- ...r.state,
54
- fetchStatus: "idle",
55
- status: "error",
56
- error: (T == null ? void 0 : T.error) || new Error("Forced error via devtools"),
57
- errorUpdateCount: (r.state.errorUpdateCount ?? 0) + 1,
58
- errorUpdatedAt: Date.now()
59
- }), s && (o.current.add(s), e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }), o.current.delete(s)));
27
+ switch (r) {
28
+ case "TRIGGER_ERROR": {
29
+ const o = t.options, c = new Error("Unknown error from devtools");
30
+ t.setState({
31
+ status: "error",
32
+ error: c,
33
+ fetchMeta: {
34
+ ...t.state.fetchMeta,
35
+ // @ts-expect-error This does exist
36
+ __previousQueryOptions: o
37
+ }
38
+ });
39
+ break;
40
+ }
41
+ case "RESTORE_ERROR": {
42
+ s.resetQueries(t);
43
+ break;
44
+ }
45
+ case "TRIGGER_LOADING": {
46
+ if (!t) return;
47
+ const o = t.options;
48
+ t.fetch({
49
+ ...o,
50
+ queryFn: () => new Promise(() => {
51
+ }),
52
+ gcTime: -1
53
+ }), t.setState({
54
+ data: void 0,
55
+ status: "pending",
56
+ fetchMeta: {
57
+ ...t.state.fetchMeta,
58
+ // @ts-expect-error This does exist
59
+ __previousQueryOptions: o
60
+ }
61
+ });
62
+ break;
63
+ }
64
+ case "RESTORE_LOADING": {
65
+ const o = t.state, c = t.state.fetchMeta ? t.state.fetchMeta.__previousQueryOptions : null;
66
+ t.cancel({ silent: !0 }), t.setState({
67
+ ...o,
68
+ fetchStatus: "idle",
69
+ fetchMeta: null
70
+ }), c && t.fetch(c);
71
+ break;
72
+ }
73
+ case "RESET": {
74
+ s.resetQueries(t);
75
+ break;
76
+ }
77
+ case "REMOVE": {
78
+ s.removeQueries(t);
79
+ break;
80
+ }
81
+ case "REFETCH": {
82
+ t.fetch().catch(() => {
83
+ });
84
+ break;
85
+ }
86
+ case "INVALIDATE": {
87
+ s.invalidateQueries(t);
88
+ break;
89
+ }
90
+ default:
91
+ console.warn(`Unknown devtools action: ${r}`);
60
92
  }
61
- if (E === "RESTORE_ERROR" && t) {
62
- const r = O(t);
63
- r && u.resetQueries({ queryKey: r.queryKey }), s && (e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }));
64
- }
65
- E === "CLEAR_MUTATION_CACHE" && (u.getMutationCache().clear(), s && (e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 }))), E === "CLEAR_QUERY_CACHE" && (u.clear(), s && (e == null || e.send("DEVICE_TO_DEVTOOLS_ACK", { requestId: s, success: !0 })));
66
- })(n);
67
- }, [u, e]);
68
- _(() => {
69
- if (!e) return;
70
- const n = e.onMessage("DEVTOOLS_TO_DEVICE", a);
71
- return () => n.remove();
72
- }, [a, e]), _(() => {
73
- if (e)
74
- return u.getQueryCache().subscribe((n) => {
75
- o.current.size > 0 || e.send("DEVICE_TO_DEVTOOLS", n);
76
- });
77
- }, [e, u]), _(() => {
78
- if (e)
79
- return u.getMutationCache().subscribe((n) => {
80
- o.current.size > 0 || e.send("DEVICE_TO_DEVTOOLS", n);
81
- });
82
- }, [e, u]);
93
+ });
94
+ return () => {
95
+ n.remove();
96
+ };
97
+ }, [e]);
98
+ }, v = (e) => {
99
+ const s = e.observers.map((n) => ({
100
+ queryHash: e.queryHash,
101
+ options: n.options
102
+ }));
103
+ return {
104
+ state: e.state,
105
+ queryKey: e.queryKey,
106
+ queryHash: e.queryHash,
107
+ observers: s
108
+ };
109
+ }, b = (e) => ({
110
+ mutationId: e.mutationId,
111
+ state: e.state,
112
+ options: e.options
113
+ }), h = (e) => ({
114
+ queries: e.getQueryCache().getAll().map(v),
115
+ mutations: e.getMutationCache().getAll().map(b)
116
+ }), g = (e) => {
117
+ const s = u();
118
+ i(() => {
119
+ if (!e)
120
+ return;
121
+ const n = () => {
122
+ const t = h(s);
123
+ e.send("sync-data", { data: t });
124
+ }, r = s.getMutationCache().subscribe(n), a = s.getQueryCache().subscribe(n);
125
+ return () => {
126
+ r(), a();
127
+ };
128
+ }, [e, s]);
129
+ }, S = (e) => {
130
+ const s = u();
131
+ i(() => {
132
+ if (!e)
133
+ return;
134
+ const n = e.onMessage("request-initial-data", () => {
135
+ const r = h(s);
136
+ e.send("sync-data", { data: r });
137
+ });
138
+ return () => {
139
+ n.remove();
140
+ };
141
+ }, [e, s]);
142
+ }, m = () => {
143
+ const e = p({
144
+ pluginId: "@rozenite/tanstack-query-plugin"
145
+ });
146
+ f(e), y(e), g(e), S(e);
83
147
  };
84
- let d;
85
- process.env.NODE_ENV !== "production" ? d = I : d = () => ({ isConnected: !1 });
148
+ let l;
149
+ process.env.NODE_ENV !== "production" ? l = m : l = () => ({ isConnected: !1 });
86
150
  export {
87
- d as useTanStackQueryDevTools
151
+ l as useTanStackQueryDevTools
88
152
  };
@@ -1 +1 @@
1
- {"name":"@rozenite/tanstack-query-plugin","version":"1.0.0-alpha.1","description":"TanStack Query for Rozenite.","panels":[{"name":"Tanstack Query","source":"/tanstack-query.html"}]}
1
+ {"name":"@rozenite/tanstack-query-plugin","version":"1.0.0-alpha.0","description":"TanStack Query for Rozenite.","panels":[{"name":"Tanstack Query","source":"/tanstack-query.html"}]}
@@ -22,7 +22,7 @@
22
22
  <script>
23
23
  var __ROZENITE_PANEL__ = true;
24
24
  </script>
25
- <script type="module" crossorigin src="./assets/tanstack-query-CXp_Psxe.js"></script>
25
+ <script type="module" crossorigin src="./assets/tanstack-query-4kxOTB8B.js"></script>
26
26
  </head>
27
27
  <body>
28
28
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rozenite/tanstack-query-plugin",
3
- "version": "1.0.0-alpha.0",
3
+ "version": "1.0.0-alpha.1",
4
4
  "description": "TanStack Query for Rozenite.",
5
5
  "type": "module",
6
6
  "main": "./dist/react-native.cjs",
@@ -15,7 +15,7 @@
15
15
  "vite": "^6.0.0",
16
16
  "react": "*",
17
17
  "react-native": "*",
18
- "rozenite": "1.0.0-alpha.2",
18
+ "rozenite": "1.0.0-alpha.0",
19
19
  "@rozenite/vite-plugin": "1.0.0-alpha.1"
20
20
  },
21
21
  "peerDependencies": {
@@ -0,0 +1,120 @@
1
+ import { useEffect } from 'react';
2
+ import { useQueryClient } from '@tanstack/react-query';
3
+ import { TanStackQueryPluginClient } from '../shared/messaging';
4
+
5
+ export const useHandleDevToolsMessages = (
6
+ client: TanStackQueryPluginClient | null
7
+ ) => {
8
+ const queryClient = useQueryClient();
9
+
10
+ useEffect(() => {
11
+ if (!client) {
12
+ return;
13
+ }
14
+
15
+ const subscription = client.onMessage(
16
+ 'devtools-action',
17
+ ({ type, queryHash }) => {
18
+ const activeQuery = queryClient.getQueryCache().get(queryHash);
19
+
20
+ if (!activeQuery) {
21
+ console.warn(`No active query found for hash: ${queryHash}`);
22
+ return;
23
+ }
24
+
25
+ switch (type) {
26
+ case 'TRIGGER_ERROR': {
27
+ const __previousQueryOptions = activeQuery.options;
28
+ const error = new Error('Unknown error from devtools');
29
+
30
+ activeQuery.setState({
31
+ status: 'error',
32
+ error,
33
+ fetchMeta: {
34
+ ...activeQuery.state.fetchMeta,
35
+ // @ts-expect-error This does exist
36
+ __previousQueryOptions,
37
+ },
38
+ });
39
+ break;
40
+ }
41
+ case 'RESTORE_ERROR': {
42
+ queryClient.resetQueries(activeQuery);
43
+ break;
44
+ }
45
+ case 'TRIGGER_LOADING': {
46
+ if (!activeQuery) return;
47
+ const __previousQueryOptions = activeQuery.options;
48
+ // Trigger a fetch in order to trigger suspense as well.
49
+ activeQuery.fetch({
50
+ ...__previousQueryOptions,
51
+ queryFn: () => {
52
+ return new Promise(() => {
53
+ // Never resolve - simulates perpetual loading
54
+ });
55
+ },
56
+ gcTime: -1,
57
+ });
58
+ activeQuery.setState({
59
+ data: undefined,
60
+ status: 'pending',
61
+ fetchMeta: {
62
+ ...activeQuery.state.fetchMeta,
63
+ // @ts-expect-error This does exist
64
+ __previousQueryOptions,
65
+ },
66
+ });
67
+ break;
68
+ }
69
+ case 'RESTORE_LOADING': {
70
+ const previousState = activeQuery.state;
71
+ const previousOptions = activeQuery.state.fetchMeta
72
+ ? (
73
+ activeQuery.state.fetchMeta as unknown as {
74
+ __previousQueryOptions: unknown;
75
+ }
76
+ ).__previousQueryOptions
77
+ : null;
78
+
79
+ activeQuery.cancel({ silent: true });
80
+ activeQuery.setState({
81
+ ...previousState,
82
+ fetchStatus: 'idle',
83
+ fetchMeta: null,
84
+ });
85
+
86
+ if (previousOptions) {
87
+ activeQuery.fetch(previousOptions);
88
+ }
89
+ break;
90
+ }
91
+ case 'RESET': {
92
+ queryClient.resetQueries(activeQuery);
93
+ break;
94
+ }
95
+ case 'REMOVE': {
96
+ queryClient.removeQueries(activeQuery);
97
+ break;
98
+ }
99
+ case 'REFETCH': {
100
+ activeQuery.fetch().catch(() => {
101
+ // Ignore errors
102
+ });
103
+ break;
104
+ }
105
+ case 'INVALIDATE': {
106
+ queryClient.invalidateQueries(activeQuery);
107
+ break;
108
+ }
109
+ default: {
110
+ console.warn(`Unknown devtools action: ${type}`);
111
+ }
112
+ }
113
+ }
114
+ );
115
+
116
+ return () => {
117
+ subscription.remove();
118
+ };
119
+ }, [client]);
120
+ };
@@ -0,0 +1,25 @@
1
+ import { useEffect } from 'react';
2
+ import { TanStackQueryPluginClient } from '../shared/messaging';
3
+ import { useQueryClient } from '@tanstack/react-query';
4
+ import { dehydrateQueryClient } from '../shared/dehydrate';
5
+
6
+ export const useHandleInitialData = (
7
+ client: TanStackQueryPluginClient | null
8
+ ) => {
9
+ const queryClient = useQueryClient();
10
+
11
+ useEffect(() => {
12
+ if (!client) {
13
+ return;
14
+ }
15
+
16
+ const subscription = client.onMessage('request-initial-data', () => {
17
+ const dehydratedState = dehydrateQueryClient(queryClient);
18
+ client.send('sync-data', { data: dehydratedState });
19
+ });
20
+
21
+ return () => {
22
+ subscription.remove();
23
+ };
24
+ }, [client, queryClient]);
25
+ };
@@ -0,0 +1,33 @@
1
+ import { useQueryClient } from '@tanstack/react-query';
2
+ import { useEffect } from 'react';
3
+ import { TanStackQueryPluginClient } from '../shared/messaging';
4
+ import { dehydrateQueryClient } from '../shared/dehydrate';
5
+
6
+ export const useSyncTanStackCache = (
7
+ client: TanStackQueryPluginClient | null
8
+ ) => {
9
+ const queryClient = useQueryClient();
10
+
11
+ useEffect(() => {
12
+ if (!client) {
13
+ return;
14
+ }
15
+
16
+ const handler = (): void => {
17
+ const dehydratedState = dehydrateQueryClient(queryClient);
18
+ client.send('sync-data', { data: dehydratedState });
19
+ };
20
+
21
+ const mutationCacheSubscription = queryClient
22
+ .getMutationCache()
23
+ .subscribe(handler);
24
+ const queryCacheSubscription = queryClient
25
+ .getQueryCache()
26
+ .subscribe(handler);
27
+
28
+ return () => {
29
+ mutationCacheSubscription();
30
+ queryCacheSubscription();
31
+ };
32
+ }, [client, queryClient]);
33
+ };