@tanstack/react-query-persist-client 5.0.0-beta.9 → 5.0.0-rc.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.
@@ -46,31 +46,29 @@ var PersistQueryClientProvider = ({
46
46
  }) => {
47
47
  const [isRestoring, setIsRestoring] = React.useState(true);
48
48
  const refs = React.useRef({ persistOptions, onSuccess });
49
+ const didRestore = React.useRef(false);
49
50
  React.useEffect(() => {
50
51
  refs.current = { persistOptions, onSuccess };
51
52
  });
52
53
  React.useEffect(() => {
53
- let isStale = false;
54
- setIsRestoring(true);
55
- const [unsubscribe, promise] = (0, import_query_persist_client_core.persistQueryClient)({
54
+ const options = {
56
55
  ...refs.current.persistOptions,
57
56
  queryClient: client
58
- });
59
- promise.then(async () => {
60
- var _a, _b;
61
- if (!isStale) {
57
+ };
58
+ if (!didRestore.current) {
59
+ didRestore.current = true;
60
+ setIsRestoring(true);
61
+ (0, import_query_persist_client_core.persistQueryClientRestore)(options).then(async () => {
62
+ var _a, _b;
62
63
  try {
63
64
  await ((_b = (_a = refs.current).onSuccess) == null ? void 0 : _b.call(_a));
64
65
  } finally {
65
66
  setIsRestoring(false);
66
67
  }
67
- }
68
- });
69
- return () => {
70
- isStale = true;
71
- unsubscribe();
72
- };
73
- }, [client]);
68
+ });
69
+ }
70
+ return isRestoring ? void 0 : (0, import_query_persist_client_core.persistQueryClientSubscribe)(options);
71
+ }, [client, isRestoring]);
74
72
  return /* @__PURE__ */ React.createElement(import_react_query.QueryClientProvider, { client, ...props }, /* @__PURE__ */ React.createElement(import_react_query.IsRestoringProvider, { value: isRestoring }, children));
75
73
  };
76
74
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { persistQueryClient } from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n let isStale = false\n setIsRestoring(true)\n const [unsubscribe, promise] = persistQueryClient({\n ...refs.current.persistOptions,\n queryClient: client,\n })\n\n promise.then(async () => {\n if (!isStale) {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n }\n })\n\n return () => {\n isStale = true\n unsubscribe()\n }\n }, [client])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,uCAAmC;AACnC,yBAAyD;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AAEvD,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,QAAI,UAAU;AACd,mBAAe,IAAI;AACnB,UAAM,CAAC,aAAa,OAAO,QAAI,qDAAmB;AAAA,MAChD,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf,CAAC;AAED,YAAQ,KAAK,YAAY;AAnC7B;AAoCM,UAAI,CAAC,SAAS;AACZ,YAAI;AACF,kBAAM,gBAAK,SAAQ,cAAb;AAAA,QACR,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,gBAAU;AACV,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,oCAAC,0CAAoB,QAAiB,GAAG,SACvC,oCAAC,0CAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport {\n persistQueryClientRestore,\n persistQueryClientSubscribe,\n} from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n const didRestore = React.useRef(false)\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n const options = {\n ...refs.current.persistOptions,\n queryClient: client,\n }\n if (!didRestore.current) {\n didRestore.current = true\n setIsRestoring(true)\n persistQueryClientRestore(options).then(async () => {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n })\n }\n return isRestoring ? undefined : persistQueryClientSubscribe(options)\n }, [client, isRestoring])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,uCAGO;AACP,yBAAyD;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AACvD,QAAM,aAAmB,aAAO,KAAK;AAErC,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,UAAM,UAAU;AAAA,MACd,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf;AACA,QAAI,CAAC,WAAW,SAAS;AACvB,iBAAW,UAAU;AACrB,qBAAe,IAAI;AACnB,sEAA0B,OAAO,EAAE,KAAK,YAAY;AAvC1D;AAwCQ,YAAI;AACF,kBAAM,gBAAK,SAAQ,cAAb;AAAA,QACR,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,cAAc,aAAY,8DAA4B,OAAO;AAAA,EACtE,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,SACE,oCAAC,0CAAoB,QAAiB,GAAG,SACvC,oCAAC,0CAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
@@ -2,7 +2,10 @@
2
2
 
3
3
  // src/PersistQueryClientProvider.tsx
4
4
  import * as React from "react";
5
- import { persistQueryClient } from "@tanstack/query-persist-client-core";
5
+ import {
6
+ persistQueryClientRestore,
7
+ persistQueryClientSubscribe
8
+ } from "@tanstack/query-persist-client-core";
6
9
  import { IsRestoringProvider, QueryClientProvider } from "@tanstack/react-query";
7
10
  var PersistQueryClientProvider = ({
8
11
  client,
@@ -13,31 +16,29 @@ var PersistQueryClientProvider = ({
13
16
  }) => {
14
17
  const [isRestoring, setIsRestoring] = React.useState(true);
15
18
  const refs = React.useRef({ persistOptions, onSuccess });
19
+ const didRestore = React.useRef(false);
16
20
  React.useEffect(() => {
17
21
  refs.current = { persistOptions, onSuccess };
18
22
  });
19
23
  React.useEffect(() => {
20
- let isStale = false;
21
- setIsRestoring(true);
22
- const [unsubscribe, promise] = persistQueryClient({
24
+ const options = {
23
25
  ...refs.current.persistOptions,
24
26
  queryClient: client
25
- });
26
- promise.then(async () => {
27
- var _a, _b;
28
- if (!isStale) {
27
+ };
28
+ if (!didRestore.current) {
29
+ didRestore.current = true;
30
+ setIsRestoring(true);
31
+ persistQueryClientRestore(options).then(async () => {
32
+ var _a, _b;
29
33
  try {
30
34
  await ((_b = (_a = refs.current).onSuccess) == null ? void 0 : _b.call(_a));
31
35
  } finally {
32
36
  setIsRestoring(false);
33
37
  }
34
- }
35
- });
36
- return () => {
37
- isStale = true;
38
- unsubscribe();
39
- };
40
- }, [client]);
38
+ });
39
+ }
40
+ return isRestoring ? void 0 : persistQueryClientSubscribe(options);
41
+ }, [client, isRestoring]);
41
42
  return /* @__PURE__ */ React.createElement(QueryClientProvider, { client, ...props }, /* @__PURE__ */ React.createElement(IsRestoringProvider, { value: isRestoring }, children));
42
43
  };
43
44
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { persistQueryClient } from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n let isStale = false\n setIsRestoring(true)\n const [unsubscribe, promise] = persistQueryClient({\n ...refs.current.persistOptions,\n queryClient: client,\n })\n\n promise.then(async () => {\n if (!isStale) {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n }\n })\n\n return () => {\n isStale = true\n unsubscribe()\n }\n }, [client])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB,SAAS,0BAA0B;AACnC,SAAS,qBAAqB,2BAA2B;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AAEvD,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,QAAI,UAAU;AACd,mBAAe,IAAI;AACnB,UAAM,CAAC,aAAa,OAAO,IAAI,mBAAmB;AAAA,MAChD,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf,CAAC;AAED,YAAQ,KAAK,YAAY;AAnC7B;AAoCM,UAAI,CAAC,SAAS;AACZ,YAAI;AACF,kBAAM,gBAAK,SAAQ,cAAb;AAAA,QACR,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,gBAAU;AACV,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,oCAAC,uBAAoB,QAAiB,GAAG,SACvC,oCAAC,uBAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport {\n persistQueryClientRestore,\n persistQueryClientSubscribe,\n} from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n const didRestore = React.useRef(false)\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n const options = {\n ...refs.current.persistOptions,\n queryClient: client,\n }\n if (!didRestore.current) {\n didRestore.current = true\n setIsRestoring(true)\n persistQueryClientRestore(options).then(async () => {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n })\n }\n return isRestoring ? undefined : persistQueryClientSubscribe(options)\n }, [client, isRestoring])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB,2BAA2B;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AACvD,QAAM,aAAmB,aAAO,KAAK;AAErC,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,UAAM,UAAU;AAAA,MACd,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf;AACA,QAAI,CAAC,WAAW,SAAS;AACvB,iBAAW,UAAU;AACrB,qBAAe,IAAI;AACnB,gCAA0B,OAAO,EAAE,KAAK,YAAY;AAvC1D;AAwCQ,YAAI;AACF,kBAAM,gBAAK,SAAQ,cAAb;AAAA,QACR,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,cAAc,SAAY,4BAA4B,OAAO;AAAA,EACtE,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,SACE,oCAAC,uBAAoB,QAAiB,GAAG,SACvC,oCAAC,uBAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
@@ -46,30 +46,28 @@ var PersistQueryClientProvider = ({
46
46
  }) => {
47
47
  const [isRestoring, setIsRestoring] = React.useState(true);
48
48
  const refs = React.useRef({ persistOptions, onSuccess });
49
+ const didRestore = React.useRef(false);
49
50
  React.useEffect(() => {
50
51
  refs.current = { persistOptions, onSuccess };
51
52
  });
52
53
  React.useEffect(() => {
53
- let isStale = false;
54
- setIsRestoring(true);
55
- const [unsubscribe, promise] = (0, import_query_persist_client_core.persistQueryClient)({
54
+ const options = {
56
55
  ...refs.current.persistOptions,
57
56
  queryClient: client
58
- });
59
- promise.then(async () => {
60
- if (!isStale) {
57
+ };
58
+ if (!didRestore.current) {
59
+ didRestore.current = true;
60
+ setIsRestoring(true);
61
+ (0, import_query_persist_client_core.persistQueryClientRestore)(options).then(async () => {
61
62
  try {
62
63
  await refs.current.onSuccess?.();
63
64
  } finally {
64
65
  setIsRestoring(false);
65
66
  }
66
- }
67
- });
68
- return () => {
69
- isStale = true;
70
- unsubscribe();
71
- };
72
- }, [client]);
67
+ });
68
+ }
69
+ return isRestoring ? void 0 : (0, import_query_persist_client_core.persistQueryClientSubscribe)(options);
70
+ }, [client, isRestoring]);
73
71
  return /* @__PURE__ */ React.createElement(import_react_query.QueryClientProvider, { client, ...props }, /* @__PURE__ */ React.createElement(import_react_query.IsRestoringProvider, { value: isRestoring }, children));
74
72
  };
75
73
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { persistQueryClient } from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n let isStale = false\n setIsRestoring(true)\n const [unsubscribe, promise] = persistQueryClient({\n ...refs.current.persistOptions,\n queryClient: client,\n })\n\n promise.then(async () => {\n if (!isStale) {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n }\n })\n\n return () => {\n isStale = true\n unsubscribe()\n }\n }, [client])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,uCAAmC;AACnC,yBAAyD;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AAEvD,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,QAAI,UAAU;AACd,mBAAe,IAAI;AACnB,UAAM,CAAC,aAAa,OAAO,QAAI,qDAAmB;AAAA,MAChD,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf,CAAC;AAED,YAAQ,KAAK,YAAY;AACvB,UAAI,CAAC,SAAS;AACZ,YAAI;AACF,gBAAM,KAAK,QAAQ,YAAY;AAAA,QACjC,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,gBAAU;AACV,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,oCAAC,0CAAoB,QAAiB,GAAG,SACvC,oCAAC,0CAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport {\n persistQueryClientRestore,\n persistQueryClientSubscribe,\n} from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n const didRestore = React.useRef(false)\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n const options = {\n ...refs.current.persistOptions,\n queryClient: client,\n }\n if (!didRestore.current) {\n didRestore.current = true\n setIsRestoring(true)\n persistQueryClientRestore(options).then(async () => {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n })\n }\n return isRestoring ? undefined : persistQueryClientSubscribe(options)\n }, [client, isRestoring])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,uCAGO;AACP,yBAAyD;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AACvD,QAAM,aAAmB,aAAO,KAAK;AAErC,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,UAAM,UAAU;AAAA,MACd,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf;AACA,QAAI,CAAC,WAAW,SAAS;AACvB,iBAAW,UAAU;AACrB,qBAAe,IAAI;AACnB,sEAA0B,OAAO,EAAE,KAAK,YAAY;AAClD,YAAI;AACF,gBAAM,KAAK,QAAQ,YAAY;AAAA,QACjC,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,cAAc,aAAY,8DAA4B,OAAO;AAAA,EACtE,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,SACE,oCAAC,0CAAoB,QAAiB,GAAG,SACvC,oCAAC,0CAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
@@ -2,7 +2,10 @@
2
2
 
3
3
  // src/PersistQueryClientProvider.tsx
4
4
  import * as React from "react";
5
- import { persistQueryClient } from "@tanstack/query-persist-client-core";
5
+ import {
6
+ persistQueryClientRestore,
7
+ persistQueryClientSubscribe
8
+ } from "@tanstack/query-persist-client-core";
6
9
  import { IsRestoringProvider, QueryClientProvider } from "@tanstack/react-query";
7
10
  var PersistQueryClientProvider = ({
8
11
  client,
@@ -13,30 +16,28 @@ var PersistQueryClientProvider = ({
13
16
  }) => {
14
17
  const [isRestoring, setIsRestoring] = React.useState(true);
15
18
  const refs = React.useRef({ persistOptions, onSuccess });
19
+ const didRestore = React.useRef(false);
16
20
  React.useEffect(() => {
17
21
  refs.current = { persistOptions, onSuccess };
18
22
  });
19
23
  React.useEffect(() => {
20
- let isStale = false;
21
- setIsRestoring(true);
22
- const [unsubscribe, promise] = persistQueryClient({
24
+ const options = {
23
25
  ...refs.current.persistOptions,
24
26
  queryClient: client
25
- });
26
- promise.then(async () => {
27
- if (!isStale) {
27
+ };
28
+ if (!didRestore.current) {
29
+ didRestore.current = true;
30
+ setIsRestoring(true);
31
+ persistQueryClientRestore(options).then(async () => {
28
32
  try {
29
33
  await refs.current.onSuccess?.();
30
34
  } finally {
31
35
  setIsRestoring(false);
32
36
  }
33
- }
34
- });
35
- return () => {
36
- isStale = true;
37
- unsubscribe();
38
- };
39
- }, [client]);
37
+ });
38
+ }
39
+ return isRestoring ? void 0 : persistQueryClientSubscribe(options);
40
+ }, [client, isRestoring]);
40
41
  return /* @__PURE__ */ React.createElement(QueryClientProvider, { client, ...props }, /* @__PURE__ */ React.createElement(IsRestoringProvider, { value: isRestoring }, children));
41
42
  };
42
43
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { persistQueryClient } from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n let isStale = false\n setIsRestoring(true)\n const [unsubscribe, promise] = persistQueryClient({\n ...refs.current.persistOptions,\n queryClient: client,\n })\n\n promise.then(async () => {\n if (!isStale) {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n }\n })\n\n return () => {\n isStale = true\n unsubscribe()\n }\n }, [client])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB,SAAS,0BAA0B;AACnC,SAAS,qBAAqB,2BAA2B;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AAEvD,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,QAAI,UAAU;AACd,mBAAe,IAAI;AACnB,UAAM,CAAC,aAAa,OAAO,IAAI,mBAAmB;AAAA,MAChD,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf,CAAC;AAED,YAAQ,KAAK,YAAY;AACvB,UAAI,CAAC,SAAS;AACZ,YAAI;AACF,gBAAM,KAAK,QAAQ,YAAY;AAAA,QACjC,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,gBAAU;AACV,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,oCAAC,uBAAoB,QAAiB,GAAG,SACvC,oCAAC,uBAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/PersistQueryClientProvider.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport {\n persistQueryClientRestore,\n persistQueryClientSubscribe,\n} from '@tanstack/query-persist-client-core'\nimport { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'\nimport type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'\nimport type { QueryClientProviderProps } from '@tanstack/react-query'\n\nexport type PersistQueryClientProviderProps = QueryClientProviderProps & {\n persistOptions: Omit<PersistQueryClientOptions, 'queryClient'>\n onSuccess?: () => Promise<unknown> | unknown\n}\n\nexport const PersistQueryClientProvider = ({\n client,\n children,\n persistOptions,\n onSuccess,\n ...props\n}: PersistQueryClientProviderProps): JSX.Element => {\n const [isRestoring, setIsRestoring] = React.useState(true)\n const refs = React.useRef({ persistOptions, onSuccess })\n const didRestore = React.useRef(false)\n\n React.useEffect(() => {\n refs.current = { persistOptions, onSuccess }\n })\n\n React.useEffect(() => {\n const options = {\n ...refs.current.persistOptions,\n queryClient: client,\n }\n if (!didRestore.current) {\n didRestore.current = true\n setIsRestoring(true)\n persistQueryClientRestore(options).then(async () => {\n try {\n await refs.current.onSuccess?.()\n } finally {\n setIsRestoring(false)\n }\n })\n }\n return isRestoring ? undefined : persistQueryClientSubscribe(options)\n }, [client, isRestoring])\n\n return (\n <QueryClientProvider client={client} {...props}>\n <IsRestoringProvider value={isRestoring}>{children}</IsRestoringProvider>\n </QueryClientProvider>\n )\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB,2BAA2B;AASlD,IAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoD;AAClD,QAAM,CAAC,aAAa,cAAc,IAAU,eAAS,IAAI;AACzD,QAAM,OAAa,aAAO,EAAE,gBAAgB,UAAU,CAAC;AACvD,QAAM,aAAmB,aAAO,KAAK;AAErC,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU,EAAE,gBAAgB,UAAU;AAAA,EAC7C,CAAC;AAED,EAAM,gBAAU,MAAM;AACpB,UAAM,UAAU;AAAA,MACd,GAAG,KAAK,QAAQ;AAAA,MAChB,aAAa;AAAA,IACf;AACA,QAAI,CAAC,WAAW,SAAS;AACvB,iBAAW,UAAU;AACrB,qBAAe,IAAI;AACnB,gCAA0B,OAAO,EAAE,KAAK,YAAY;AAClD,YAAI;AACF,gBAAM,KAAK,QAAQ,YAAY;AAAA,QACjC,UAAE;AACA,yBAAe,KAAK;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,cAAc,SAAY,4BAA4B,OAAO;AAAA,EACtE,GAAG,CAAC,QAAQ,WAAW,CAAC;AAExB,SACE,oCAAC,uBAAoB,QAAiB,GAAG,SACvC,oCAAC,uBAAoB,OAAO,eAAc,QAAS,CACrD;AAEJ;","names":[]}
package/package.json CHANGED
@@ -1,10 +1,14 @@
1
1
  {
2
2
  "name": "@tanstack/react-query-persist-client",
3
- "version": "5.0.0-beta.9",
3
+ "version": "5.0.0-rc.1",
4
4
  "description": "React bindings to work with persisters in TanStack/react-query",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
7
- "repository": "tanstack/query",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/TanStack/query.git",
10
+ "directory": "packages/react-query-persist-client"
11
+ },
8
12
  "homepage": "https://tanstack.com/query",
9
13
  "funding": {
10
14
  "type": "github",
@@ -33,19 +37,19 @@
33
37
  "src"
34
38
  ],
35
39
  "dependencies": {
36
- "@tanstack/query-persist-client-core": "5.0.0-beta.9"
40
+ "@tanstack/query-persist-client-core": "5.0.0-rc.1"
37
41
  },
38
42
  "devDependencies": {
39
43
  "@types/react": "^18.2.4",
40
44
  "@types/react-dom": "^18.2.4",
41
45
  "react": "^18.2.0",
42
46
  "react-dom": "^18.2.0",
43
- "@tanstack/react-query": "5.0.0-beta.9"
47
+ "@tanstack/react-query": "5.0.0-rc.1"
44
48
  },
45
49
  "peerDependencies": {
46
50
  "react": "^18.0.0",
47
51
  "react-dom": "^18.0.0",
48
- "@tanstack/react-query": "5.0.0-beta.9"
52
+ "@tanstack/react-query": "^5.0.0-rc.1"
49
53
  },
50
54
  "scripts": {
51
55
  "clean": "rimraf ./build && rimraf ./coverage",
@@ -1,7 +1,10 @@
1
1
  'use client'
2
2
  import * as React from 'react'
3
3
 
4
- import { persistQueryClient } from '@tanstack/query-persist-client-core'
4
+ import {
5
+ persistQueryClientRestore,
6
+ persistQueryClientSubscribe,
7
+ } from '@tanstack/query-persist-client-core'
5
8
  import { IsRestoringProvider, QueryClientProvider } from '@tanstack/react-query'
6
9
  import type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core'
7
10
  import type { QueryClientProviderProps } from '@tanstack/react-query'
@@ -20,34 +23,30 @@ export const PersistQueryClientProvider = ({
20
23
  }: PersistQueryClientProviderProps): JSX.Element => {
21
24
  const [isRestoring, setIsRestoring] = React.useState(true)
22
25
  const refs = React.useRef({ persistOptions, onSuccess })
26
+ const didRestore = React.useRef(false)
23
27
 
24
28
  React.useEffect(() => {
25
29
  refs.current = { persistOptions, onSuccess }
26
30
  })
27
31
 
28
32
  React.useEffect(() => {
29
- let isStale = false
30
- setIsRestoring(true)
31
- const [unsubscribe, promise] = persistQueryClient({
33
+ const options = {
32
34
  ...refs.current.persistOptions,
33
35
  queryClient: client,
34
- })
35
-
36
- promise.then(async () => {
37
- if (!isStale) {
36
+ }
37
+ if (!didRestore.current) {
38
+ didRestore.current = true
39
+ setIsRestoring(true)
40
+ persistQueryClientRestore(options).then(async () => {
38
41
  try {
39
42
  await refs.current.onSuccess?.()
40
43
  } finally {
41
44
  setIsRestoring(false)
42
45
  }
43
- }
44
- })
45
-
46
- return () => {
47
- isStale = true
48
- unsubscribe()
46
+ })
49
47
  }
50
- }, [client])
48
+ return isRestoring ? undefined : persistQueryClientSubscribe(options)
49
+ }, [client, isRestoring])
51
50
 
52
51
  return (
53
52
  <QueryClientProvider client={client} {...props}>
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react'
2
- import { render, waitFor } from '@testing-library/react'
2
+ import { fireEvent, render, waitFor } from '@testing-library/react'
3
3
  import { vi } from 'vitest'
4
4
 
5
5
  import { QueryClient, useQueries, useQuery } from '@tanstack/react-query'
@@ -55,7 +55,7 @@ const createMockErrorPersister = (
55
55
  describe('PersistQueryClientProvider', () => {
56
56
  test('restores cache from persister', async () => {
57
57
  const key = queryKey()
58
- const states: UseQueryResult<string>[] = []
58
+ const states: Array<UseQueryResult<string>> = []
59
59
 
60
60
  const queryClient = createQueryClient()
61
61
  await queryClient.prefetchQuery({
@@ -128,9 +128,73 @@ describe('PersistQueryClientProvider', () => {
128
128
  })
129
129
  })
130
130
 
131
+ test('should subscribe correctly in StrictMode', async () => {
132
+ const key = queryKey()
133
+
134
+ const queryClient = createQueryClient()
135
+ await queryClient.prefetchQuery({
136
+ queryKey: key,
137
+ queryFn: () => Promise.resolve('hydrated'),
138
+ })
139
+
140
+ const persister = createMockPersister()
141
+
142
+ await persistQueryClientSave({ queryClient, persister })
143
+
144
+ queryClient.clear()
145
+
146
+ function Page() {
147
+ const state = useQuery({
148
+ queryKey: key,
149
+ queryFn: async () => {
150
+ await sleep(10)
151
+ return 'fetched'
152
+ },
153
+ })
154
+
155
+ return (
156
+ <div>
157
+ <h1>{state.data}</h1>
158
+ <h2>fetchStatus: {state.fetchStatus}</h2>
159
+ <button
160
+ onClick={() => {
161
+ queryClient.setQueryData(key, 'updated')
162
+ }}
163
+ >
164
+ update
165
+ </button>
166
+ </div>
167
+ )
168
+ }
169
+
170
+ const rendered = render(
171
+ <React.StrictMode>
172
+ <PersistQueryClientProvider
173
+ client={queryClient}
174
+ persistOptions={{ persister }}
175
+ >
176
+ <Page />
177
+ </PersistQueryClientProvider>
178
+ ,
179
+ </React.StrictMode>,
180
+ )
181
+
182
+ await waitFor(() => rendered.getByText('fetchStatus: idle'))
183
+ await waitFor(() => rendered.getByText('hydrated'))
184
+ await waitFor(() => rendered.getByText('fetched'))
185
+
186
+ fireEvent.click(rendered.getByRole('button', { name: /update/i }))
187
+
188
+ await waitFor(() => rendered.getByText('updated'))
189
+
190
+ const state = await persister.restoreClient()
191
+
192
+ expect(state?.clientState.queries[0]?.state.data).toBe('updated')
193
+ })
194
+
131
195
  test('should also put useQueries into idle state', async () => {
132
196
  const key = queryKey()
133
- const states: UseQueryResult[] = []
197
+ const states: Array<UseQueryResult> = []
134
198
 
135
199
  const queryClient = createQueryClient()
136
200
  await queryClient.prefetchQuery({
@@ -209,7 +273,7 @@ describe('PersistQueryClientProvider', () => {
209
273
 
210
274
  test('should show initialData while restoring', async () => {
211
275
  const key = queryKey()
212
- const states: DefinedUseQueryResult<string>[] = []
276
+ const states: Array<DefinedUseQueryResult<string>> = []
213
277
 
214
278
  const queryClient = createQueryClient()
215
279
  await queryClient.prefetchQuery({
@@ -289,7 +353,7 @@ describe('PersistQueryClientProvider', () => {
289
353
 
290
354
  test('should not refetch after restoring when data is fresh', async () => {
291
355
  const key = queryKey()
292
- const states: UseQueryResult<string>[] = []
356
+ const states: Array<UseQueryResult<string>> = []
293
357
 
294
358
  const queryClient = createQueryClient()
295
359
  await queryClient.prefetchQuery({
@@ -515,7 +579,7 @@ describe('PersistQueryClientProvider', () => {
515
579
 
516
580
  test('should be able to persist into multiple clients', async () => {
517
581
  const key = queryKey()
518
- const states: UseQueryResult[] = []
582
+ const states: Array<UseQueryResult> = []
519
583
 
520
584
  const queryClient = createQueryClient()
521
585
  await queryClient.prefetchQuery({
@@ -629,4 +693,77 @@ describe('PersistQueryClientProvider', () => {
629
693
  data: 'queryFn2',
630
694
  })
631
695
  })
696
+
697
+ test('should only restore once in StrictMode', async () => {
698
+ let restoreCount = 0
699
+ const createPersister = (): Persister => {
700
+ let storedState: PersistedClient | undefined
701
+
702
+ return {
703
+ async persistClient(persistClient) {
704
+ storedState = persistClient
705
+ },
706
+ async restoreClient() {
707
+ restoreCount++
708
+ await sleep(10)
709
+ return storedState
710
+ },
711
+ removeClient() {
712
+ storedState = undefined
713
+ },
714
+ }
715
+ }
716
+
717
+ const key = queryKey()
718
+
719
+ const queryClient = createQueryClient()
720
+ await queryClient.prefetchQuery({
721
+ queryKey: key,
722
+ queryFn: () => Promise.resolve('hydrated'),
723
+ })
724
+
725
+ const persister = createPersister()
726
+
727
+ const onSuccess = vi.fn()
728
+
729
+ await persistQueryClientSave({ queryClient, persister })
730
+
731
+ queryClient.clear()
732
+
733
+ function Page() {
734
+ const state = useQuery({
735
+ queryKey: key,
736
+ queryFn: async () => {
737
+ await sleep(10)
738
+ return 'fetched'
739
+ },
740
+ })
741
+
742
+ return (
743
+ <div>
744
+ <h1>{state.data}</h1>
745
+ <h2>fetchStatus: {state.fetchStatus}</h2>
746
+ </div>
747
+ )
748
+ }
749
+
750
+ const rendered = render(
751
+ <React.StrictMode>
752
+ <PersistQueryClientProvider
753
+ client={queryClient}
754
+ persistOptions={{ persister }}
755
+ onSuccess={onSuccess}
756
+ >
757
+ <Page />
758
+ </PersistQueryClientProvider>
759
+ </React.StrictMode>,
760
+ )
761
+
762
+ await waitFor(() => rendered.getByText('fetchStatus: idle'))
763
+ await waitFor(() => rendered.getByText('hydrated'))
764
+ await waitFor(() => rendered.getByText('fetched'))
765
+
766
+ expect(onSuccess).toHaveBeenCalledTimes(1)
767
+ expect(restoreCount).toBe(1)
768
+ })
632
769
  })