@tanstack/react-query-persist-client 5.0.0-beta.9 → 5.0.0-rc.0
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.
- package/build/legacy/PersistQueryClientProvider.cjs +12 -14
- package/build/legacy/PersistQueryClientProvider.cjs.map +1 -1
- package/build/legacy/PersistQueryClientProvider.js +16 -15
- package/build/legacy/PersistQueryClientProvider.js.map +1 -1
- package/build/modern/PersistQueryClientProvider.cjs +11 -13
- package/build/modern/PersistQueryClientProvider.cjs.map +1 -1
- package/build/modern/PersistQueryClientProvider.js +15 -14
- package/build/modern/PersistQueryClientProvider.js.map +1 -1
- package/package.json +9 -5
- package/src/PersistQueryClientProvider.tsx +14 -15
- package/src/__tests__/PersistQueryClientProvider.test.tsx +143 -6
|
@@ -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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
21
|
-
setIsRestoring(true);
|
|
22
|
-
const [unsubscribe, promise] = persistQueryClient({
|
|
24
|
+
const options = {
|
|
23
25
|
...refs.current.persistOptions,
|
|
24
26
|
queryClient: client
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
21
|
-
setIsRestoring(true);
|
|
22
|
-
const [unsubscribe, promise] = persistQueryClient({
|
|
24
|
+
const options = {
|
|
23
25
|
...refs.current.persistOptions,
|
|
24
26
|
queryClient: client
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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 {
|
|
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-
|
|
3
|
+
"version": "5.0.0-rc.0",
|
|
4
4
|
"description": "React bindings to work with persisters in TanStack/react-query",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"repository":
|
|
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-
|
|
40
|
+
"@tanstack/query-persist-client-core": "5.0.0-rc.0"
|
|
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-
|
|
47
|
+
"@tanstack/react-query": "5.0.0-rc.0"
|
|
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-
|
|
52
|
+
"@tanstack/react-query": "^5.0.0-rc.0"
|
|
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 {
|
|
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
|
-
|
|
30
|
-
setIsRestoring(true)
|
|
31
|
-
const [unsubscribe, promise] = persistQueryClient({
|
|
33
|
+
const options = {
|
|
32
34
|
...refs.current.persistOptions,
|
|
33
35
|
queryClient: client,
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
})
|