@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 CHANGED
@@ -1,3 +1,33 @@
1
- # Ventlio/TanstackQuery
1
+ # This is not a replacement for @tanstack/react-query
2
2
 
3
- ## _Work on progress, we are building an HTTP request handler that uses tanstack-query_
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1,3 @@
1
+ export * from './useKeyTrackerModel';
1
2
  export * from './useQueryModel';
3
+ export * from './useRefetchQuery';
@@ -0,0 +1,6 @@
1
+ export declare const useKeyTrackerModel: <T>(keyTracker: string) => {
2
+ refetchQuery: (innerKeyTracker?: string) => T | undefined;
3
+ getQueryKey: (innerKeyTracker?: string) => any[] | undefined;
4
+ queryKey: any[] | undefined;
5
+ data: T | undefined;
6
+ };
@@ -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,3 @@
1
+ export declare const useRefetchQuery: (queryKey: any[]) => Promise<{
2
+ refetchQuery: <T>(innerQueryKey?: any[]) => Promise<[import("@tanstack/react-query").QueryKey, T | undefined][]>;
3
+ }>;
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ventlio/tanstack-query",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "contributors": [