@ventlio/tanstack-query 0.2.8 → 0.2.10
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/README.md +32 -2
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -3
- package/dist/index.mjs.map +1 -1
- package/dist/model/index.d.ts +2 -0
- package/dist/model/useKeyTrackerModel.d.ts +6 -0
- package/dist/model/useKeyTrackerModel.js +27 -0
- package/dist/model/useKeyTrackerModel.js.map +1 -0
- package/dist/model/useRefetchQuery.d.ts +3 -0
- package/dist/model/useRefetchQuery.js +19 -0
- package/dist/model/useRefetchQuery.js.map +1 -0
- package/dist/queries/useGetRequest.d.ts +2 -1
- package/dist/queries/useGetRequest.js +9 -1
- package/dist/queries/useGetRequest.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
-
#
|
|
1
|
+
# This is not a replacement for @tanstack/react-query
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## WHY THIS PACKAGE?
|
|
4
|
+
|
|
5
|
+
We have been working on a project using ReactJS and React-Native and we were happy with the React-Query package, now known as Tanstack-Query, which had made our lives easier by managing most of the state management features needed for enterprise software development. This had helped us focus on building functionalities easily without worrying about server state management.
|
|
6
|
+
|
|
7
|
+
However, we still faced some challenges. For each project, we have to configure how Tanstack-Query would connect to the Backend API and manage GET, POST, PUT, and PATCH requests efficiently. One of the major challenges was handling dynamic queryKeys in Tanstack-Query. For example, when building a screen with pagination, useQuery will have re-call the queryFunction every time the key changed, which will load the current page data. This meant that the queryKey changed dynamically, and sometimes we needed to use the queryKey of the current page to perform certain tasks like updating a specific row in the view. This was always tedious.
|
|
8
|
+
|
|
9
|
+
But we were not discouraged. We knew that every challenge presented an opportunity for growth and development. So, we set out to find a solution. This package would handle dynamic queryKeys in Tanstack-Query and solve other related problems. It made configuring Tanstack-Query to connect to the Backend API and managing GET, POST, PUT, and PATCH requests a breeze. It also solved the problem of dynamic queryKeys, making it much easier to update specific rows in the view.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
> You must install @tanstack/react-query and axios first to use this package
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
npm install @tanstack/react-query axios
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
After that install this package
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
$ npm install @ventlio/tanstack-query
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
$ yarn add @ventlio/tanstack-query
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Getting Started
|
|
32
|
+
|
|
33
|
+
Follow the below instructions to have the package running on your project
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,9 @@ var useQueryConfig = require('./config/useQueryConfig.js');
|
|
|
5
5
|
var useQueryHeaders = require('./config/useQueryHeaders.js');
|
|
6
6
|
var useQueryTimeout = require('./config/useQueryTimeout.js');
|
|
7
7
|
var scrollToTop = require('./helpers/scrollToTop.js');
|
|
8
|
+
var useKeyTrackerModel = require('./model/useKeyTrackerModel.js');
|
|
8
9
|
var useQueryModel = require('./model/useQueryModel.js');
|
|
10
|
+
var useRefetchQuery = require('./model/useRefetchQuery.js');
|
|
9
11
|
var useDeleteRequest = require('./queries/useDeleteRequest.js');
|
|
10
12
|
var useGetRequest = require('./queries/useGetRequest.js');
|
|
11
13
|
var usePatchRequest = require('./queries/usePatchRequest.js');
|
|
@@ -23,7 +25,9 @@ exports.useQueryConfig = useQueryConfig.useQueryConfig;
|
|
|
23
25
|
exports.useQueryHeaders = useQueryHeaders.useQueryHeaders;
|
|
24
26
|
exports.useQueryTimeout = useQueryTimeout.useQueryTimeout;
|
|
25
27
|
exports.scrollToTop = scrollToTop.scrollToTop;
|
|
28
|
+
exports.useKeyTrackerModel = useKeyTrackerModel.useKeyTrackerModel;
|
|
26
29
|
exports.useQueryModel = useQueryModel.useQueryModel;
|
|
30
|
+
exports.useRefetchQuery = useRefetchQuery.useRefetchQuery;
|
|
27
31
|
exports.useDeleteRequest = useDeleteRequest.useDeleteRequest;
|
|
28
32
|
exports.useGetRequest = useGetRequest.useGetRequest;
|
|
29
33
|
exports.usePatchRequest = usePatchRequest.usePatchRequest;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useQueryClient, useQuery, useMutation } from '@tanstack/react-query';
|
|
2
|
-
import { useState, useEffect, startTransition } from 'react';
|
|
2
|
+
import { useState, useMemo, useEffect, startTransition } from 'react';
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
|
|
5
5
|
const useQueryConfig = () => {
|
|
@@ -53,11 +53,44 @@ const scrollToTop = () => {
|
|
|
53
53
|
});
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
+
const useKeyTrackerModel = (keyTracker) => {
|
|
57
|
+
const queryClient = useQueryClient();
|
|
58
|
+
const [data, setData] = useState();
|
|
59
|
+
const [queryKey, setQueryKey] = useState();
|
|
60
|
+
const getQueryKey = (innerKeyTracker) => {
|
|
61
|
+
const key = queryClient.getQueryData([
|
|
62
|
+
innerKeyTracker ?? keyTracker,
|
|
63
|
+
]);
|
|
64
|
+
setQueryKey(key);
|
|
65
|
+
return key;
|
|
66
|
+
};
|
|
67
|
+
const refetchQuery = (innerKeyTracker) => {
|
|
68
|
+
const key = getQueryKey(innerKeyTracker ?? keyTracker);
|
|
69
|
+
const queryData = queryClient.getQueryData(key);
|
|
70
|
+
setData(queryData);
|
|
71
|
+
return queryData;
|
|
72
|
+
};
|
|
73
|
+
return { refetchQuery, getQueryKey, queryKey, data };
|
|
74
|
+
};
|
|
75
|
+
|
|
56
76
|
const useQueryModel = (queryKey, filters) => {
|
|
57
77
|
const queryClient = useQueryClient();
|
|
58
78
|
return queryClient.getQueryData(queryKey, filters);
|
|
59
79
|
};
|
|
60
80
|
|
|
81
|
+
const useRefetchQuery = async (queryKey) => {
|
|
82
|
+
const queryClient = useQueryClient();
|
|
83
|
+
const refetchQuery = async (innerQueryKey) => {
|
|
84
|
+
await queryClient.refetchQueries({
|
|
85
|
+
queryKey,
|
|
86
|
+
exact: true,
|
|
87
|
+
type: 'active',
|
|
88
|
+
}, { throwOnError: true, cancelRefetch: true });
|
|
89
|
+
return queryClient.getQueriesData(innerQueryKey ?? queryKey);
|
|
90
|
+
};
|
|
91
|
+
return { refetchQuery };
|
|
92
|
+
};
|
|
93
|
+
|
|
61
94
|
const axiosInstance = ({ baseURL, timeout, headers, }) => {
|
|
62
95
|
return axios.create({
|
|
63
96
|
baseURL,
|
|
@@ -189,11 +222,14 @@ const useDeleteRequest = () => {
|
|
|
189
222
|
return { destroy, ...query };
|
|
190
223
|
};
|
|
191
224
|
|
|
192
|
-
const useGetRequest = ({ path, load = false, queryOptions, }) => {
|
|
225
|
+
const useGetRequest = ({ path, load = false, queryOptions, keyTracker, }) => {
|
|
193
226
|
const [requestPath, updatePath] = useState(path);
|
|
194
227
|
const [options, setOptions] = useState(queryOptions);
|
|
195
228
|
const [page, setPage] = useState(1);
|
|
196
229
|
const { headers, baseURL, timeout } = useQueryConfig();
|
|
230
|
+
let queryClient = useQueryClient();
|
|
231
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
232
|
+
queryClient = useMemo(() => queryClient, []);
|
|
197
233
|
const sendRequest = async (res, rej) => {
|
|
198
234
|
const postResponse = await makeRequest({
|
|
199
235
|
path: requestPath,
|
|
@@ -219,6 +255,11 @@ const useGetRequest = ({ path, load = false, queryOptions, }) => {
|
|
|
219
255
|
updatePath(path);
|
|
220
256
|
}
|
|
221
257
|
}, [path]);
|
|
258
|
+
useEffect(() => {
|
|
259
|
+
if (keyTracker) {
|
|
260
|
+
queryClient.setQueryData([keyTracker], [requestPath, {}]);
|
|
261
|
+
}
|
|
262
|
+
}, [keyTracker, requestPath, queryClient]);
|
|
222
263
|
const nextPage = () => {
|
|
223
264
|
if (query.data?.data.pagination) {
|
|
224
265
|
const pagination = query.data.data.pagination;
|
|
@@ -350,5 +391,5 @@ const usePostRequest = ({ path, isFormData = false, }) => {
|
|
|
350
391
|
return { post, ...mutation };
|
|
351
392
|
};
|
|
352
393
|
|
|
353
|
-
export { ContentType, HttpMethod, axiosInstance, buildFormData, errorTransformer, makeRequest, scrollToTop, successTransformer, useDeleteRequest, useGetRequest, usePatchRequest, usePostRequest, useQueryBaseURL, useQueryConfig, useQueryHeaders, useQueryModel, useQueryTimeout };
|
|
394
|
+
export { ContentType, HttpMethod, axiosInstance, buildFormData, errorTransformer, makeRequest, scrollToTop, successTransformer, useDeleteRequest, useGetRequest, useKeyTrackerModel, usePatchRequest, usePostRequest, useQueryBaseURL, useQueryConfig, useQueryHeaders, useQueryModel, useQueryTimeout, useRefetchQuery };
|
|
354
395
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/model/index.d.ts
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var reactQuery = require('@tanstack/react-query');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const useKeyTrackerModel = (keyTracker) => {
|
|
7
|
+
const queryClient = reactQuery.useQueryClient();
|
|
8
|
+
const [data, setData] = react.useState();
|
|
9
|
+
const [queryKey, setQueryKey] = react.useState();
|
|
10
|
+
const getQueryKey = (innerKeyTracker) => {
|
|
11
|
+
const key = queryClient.getQueryData([
|
|
12
|
+
innerKeyTracker ?? keyTracker,
|
|
13
|
+
]);
|
|
14
|
+
setQueryKey(key);
|
|
15
|
+
return key;
|
|
16
|
+
};
|
|
17
|
+
const refetchQuery = (innerKeyTracker) => {
|
|
18
|
+
const key = getQueryKey(innerKeyTracker ?? keyTracker);
|
|
19
|
+
const queryData = queryClient.getQueryData(key);
|
|
20
|
+
setData(queryData);
|
|
21
|
+
return queryData;
|
|
22
|
+
};
|
|
23
|
+
return { refetchQuery, getQueryKey, queryKey, data };
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
exports.useKeyTrackerModel = useKeyTrackerModel;
|
|
27
|
+
//# sourceMappingURL=useKeyTrackerModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyTrackerModel.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var reactQuery = require('@tanstack/react-query');
|
|
4
|
+
|
|
5
|
+
const useRefetchQuery = async (queryKey) => {
|
|
6
|
+
const queryClient = reactQuery.useQueryClient();
|
|
7
|
+
const refetchQuery = async (innerQueryKey) => {
|
|
8
|
+
await queryClient.refetchQueries({
|
|
9
|
+
queryKey,
|
|
10
|
+
exact: true,
|
|
11
|
+
type: 'active',
|
|
12
|
+
}, { throwOnError: true, cancelRefetch: true });
|
|
13
|
+
return queryClient.getQueriesData(innerQueryKey ?? queryKey);
|
|
14
|
+
};
|
|
15
|
+
return { refetchQuery };
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exports.useRefetchQuery = useRefetchQuery;
|
|
19
|
+
//# sourceMappingURL=useRefetchQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRefetchQuery.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
import type { UseQueryOptions } from '@tanstack/react-query';
|
|
3
3
|
import type { IRequestError, IRequestSuccess } from '../request';
|
|
4
4
|
import type { TanstackQueryOption } from './queries.interface';
|
|
5
|
-
export declare const useGetRequest: <TResponse extends Record<string, any>>({ path, load, queryOptions, }: {
|
|
5
|
+
export declare const useGetRequest: <TResponse extends Record<string, any>>({ path, load, queryOptions, keyTracker, }: {
|
|
6
6
|
path: string;
|
|
7
7
|
load?: boolean | undefined;
|
|
8
8
|
queryOptions?: TanstackQueryOption<TResponse> | undefined;
|
|
9
|
+
keyTracker?: string | undefined;
|
|
9
10
|
}) => {
|
|
10
11
|
updatePath: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
11
12
|
nextPage: () => void;
|
|
@@ -7,11 +7,14 @@ require('axios');
|
|
|
7
7
|
var makeRequest = require('../request/make-request.js');
|
|
8
8
|
require('../request/request.enum.js');
|
|
9
9
|
|
|
10
|
-
const useGetRequest = ({ path, load = false, queryOptions, }) => {
|
|
10
|
+
const useGetRequest = ({ path, load = false, queryOptions, keyTracker, }) => {
|
|
11
11
|
const [requestPath, updatePath] = react.useState(path);
|
|
12
12
|
const [options, setOptions] = react.useState(queryOptions);
|
|
13
13
|
const [page, setPage] = react.useState(1);
|
|
14
14
|
const { headers, baseURL, timeout } = useQueryConfig.useQueryConfig();
|
|
15
|
+
let queryClient = reactQuery.useQueryClient();
|
|
16
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
17
|
+
queryClient = react.useMemo(() => queryClient, []);
|
|
15
18
|
const sendRequest = async (res, rej) => {
|
|
16
19
|
const postResponse = await makeRequest.makeRequest({
|
|
17
20
|
path: requestPath,
|
|
@@ -37,6 +40,11 @@ const useGetRequest = ({ path, load = false, queryOptions, }) => {
|
|
|
37
40
|
updatePath(path);
|
|
38
41
|
}
|
|
39
42
|
}, [path]);
|
|
43
|
+
react.useEffect(() => {
|
|
44
|
+
if (keyTracker) {
|
|
45
|
+
queryClient.setQueryData([keyTracker], [requestPath, {}]);
|
|
46
|
+
}
|
|
47
|
+
}, [keyTracker, requestPath, queryClient]);
|
|
40
48
|
const nextPage = () => {
|
|
41
49
|
if (query.data?.data.pagination) {
|
|
42
50
|
const pagination = query.data.data.pagination;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetRequest.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useGetRequest.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|