@ventlio/tanstack-query 0.3.0 → 0.3.2

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.
Files changed (49) hide show
  1. package/dist/config/bootstrapQueryRequest.js +1 -1
  2. package/dist/config/useQueryConfig.js +1 -27
  3. package/dist/config/useQueryConfig.js.map +1 -1
  4. package/dist/config/useQueryHeaders.js +15 -4
  5. package/dist/config/useQueryHeaders.js.map +1 -1
  6. package/dist/config/useReactNativeEnv.js +3 -3
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +123 -120
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/model/useKeyTrackerModel.d.ts +1 -1
  13. package/dist/model/useKeyTrackerModel.js +1 -5
  14. package/dist/model/useKeyTrackerModel.js.map +1 -1
  15. package/dist/queries/useDeleteRequest.d.ts +4 -4
  16. package/dist/queries/useDeleteRequest.js +11 -10
  17. package/dist/queries/useDeleteRequest.js.map +1 -1
  18. package/dist/queries/useGetInfiniteRequest.d.ts +4 -4
  19. package/dist/queries/useGetInfiniteRequest.js +23 -17
  20. package/dist/queries/useGetInfiniteRequest.js.map +1 -1
  21. package/dist/queries/useGetRequest.d.ts +4 -4
  22. package/dist/queries/useGetRequest.js +20 -14
  23. package/dist/queries/useGetRequest.js.map +1 -1
  24. package/dist/queries/usePatchRequest.d.ts +4 -4
  25. package/dist/queries/usePatchRequest.js +13 -16
  26. package/dist/queries/usePatchRequest.js.map +1 -1
  27. package/dist/queries/usePostRequest.d.ts +4 -4
  28. package/dist/queries/usePostRequest.js +13 -11
  29. package/dist/queries/usePostRequest.js.map +1 -1
  30. package/dist/stores/index.d.ts +1 -0
  31. package/dist/stores/usePauseFutureRequests.d.ts +7 -0
  32. package/dist/stores/usePauseFutureRequests.js +19 -0
  33. package/dist/stores/usePauseFutureRequests.js.map +1 -0
  34. package/dist/types/index.d.ts +4 -7
  35. package/package.json +3 -2
  36. package/src/config/bootstrapQueryRequest.ts +1 -1
  37. package/src/config/useQueryConfig.ts +4 -41
  38. package/src/config/useQueryHeaders.ts +18 -6
  39. package/src/config/useReactNativeEnv.ts +3 -3
  40. package/src/index.ts +2 -0
  41. package/src/model/useKeyTrackerModel.ts +1 -5
  42. package/src/queries/useDeleteRequest.ts +14 -11
  43. package/src/queries/useGetInfiniteRequest.ts +27 -19
  44. package/src/queries/useGetRequest.ts +24 -16
  45. package/src/queries/usePatchRequest.ts +17 -17
  46. package/src/queries/usePostRequest.ts +16 -12
  47. package/src/stores/index.ts +1 -0
  48. package/src/stores/usePauseFutureRequests.ts +25 -0
  49. package/src/types/index.ts +4 -7
@@ -0,0 +1,19 @@
1
+ import { create } from 'zustand';
2
+
3
+ const usePauseFutureRequests = create((set) => {
4
+ const pauseFutureQueries = (status) => {
5
+ return set({ isFutureQueriesPaused: status });
6
+ };
7
+ const pauseFutureMutation = (status) => {
8
+ return set({ isFutureQueriesPaused: status });
9
+ };
10
+ return {
11
+ isFutureMutationsPaused: false,
12
+ isFutureQueriesPaused: false,
13
+ pauseFutureQueries,
14
+ pauseFutureMutation,
15
+ };
16
+ });
17
+
18
+ export { usePauseFutureRequests };
19
+ //# sourceMappingURL=usePauseFutureRequests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePauseFutureRequests.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -14,19 +14,16 @@ export interface BootstrapConfig {
14
14
  queryMiddleware?: (queryRequestConfig?: IMakeRequest & {
15
15
  queryKey: QueryKey;
16
16
  }) => Promise<boolean>;
17
- pauseFutureMutations?: boolean;
18
- pauseFutureQueries?: boolean;
19
- headers?: RawAxiosRequestHeaders;
20
17
  }
21
18
  export interface BootstrapModelConfig {
22
19
  idColumn: string;
23
20
  }
24
21
  export type ContextType = 'app' | 'web' | 'electronjs';
25
22
  export interface TanstackQueryConfig {
26
- options: BootstrapConfig;
27
- setConfig: (options: BootstrapConfig) => void;
23
+ headers: RawAxiosRequestHeaders;
24
+ options?: BootstrapConfig;
28
25
  }
29
26
  export interface IUseQueryHeaders {
30
- getHeaders: () => BootstrapConfig['headers'];
31
- setQueryHeaders: (header: BootstrapConfig['headers']) => void;
27
+ getHeaders: () => TanstackQueryConfig['headers'];
28
+ setQueryHeaders: (header: TanstackQueryConfig['headers']) => void;
32
29
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ventlio/tanstack-query",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "contributors": [
@@ -88,6 +88,7 @@
88
88
  "dependencies": {
89
89
  "lodash.result": "^4.5.2",
90
90
  "lodash.set": "^4.3.2",
91
- "url-search-params-polyfill": "^8.2.5"
91
+ "url-search-params-polyfill": "^8.2.5",
92
+ "zustand": "^4.4.6"
92
93
  }
93
94
  }
@@ -10,7 +10,7 @@ export const bootstrapQueryRequest = (queryClient: QueryClient, options?: Bootst
10
10
  headers: {
11
11
  Authorization: ``,
12
12
  },
13
- ...options,
13
+ options,
14
14
  };
15
15
 
16
16
  queryClient.setDefaultOptions({
@@ -1,48 +1,11 @@
1
- import type { MutationMeta, QueryMeta } from '@tanstack/react-query';
2
1
  import { useQueryClient } from '@tanstack/react-query';
3
- import type { BootstrapConfig, TanstackQueryConfig } from '../types';
2
+ import type { TanstackQueryConfig } from '../types';
4
3
 
5
4
  export const useQueryConfig = (): TanstackQueryConfig => {
6
5
  const queryClient = useQueryClient();
7
6
 
8
- const setConfig = (options: BootstrapConfig) => {
9
- let mutationMeta: MutationMeta | undefined = queryClient.getMutationDefaults()?.meta ?? {};
10
- let queryMeta: QueryMeta | undefined = queryClient.getQueryDefaults()?.meta ?? {};
7
+ const mutationMeta = (queryClient.getDefaultOptions().mutations?.meta ?? {}) as unknown as TanstackQueryConfig;
8
+ const queryMeta = (queryClient.getDefaultOptions().queries?.meta ?? {}) as unknown as TanstackQueryConfig;
11
9
 
12
- const { pauseFutureMutations, pauseFutureQueries, mutationMiddleware, queryMiddleware, ...otherOptions } = options;
13
-
14
- if (pauseFutureMutations) {
15
- mutationMeta.pauseFutureMutations = pauseFutureMutations;
16
- }
17
-
18
- if (mutationMiddleware) {
19
- mutationMeta.mutationMiddleware = mutationMiddleware;
20
- }
21
-
22
- mutationMeta = { meta: { ...mutationMeta, ...otherOptions } };
23
-
24
- if (pauseFutureQueries) {
25
- queryMeta.pauseFutureQueries = pauseFutureQueries;
26
- }
27
-
28
- if (queryMiddleware) {
29
- queryMeta.mutationMiddleware = queryMiddleware;
30
- }
31
-
32
- queryMeta = { meta: { ...queryMeta, ...otherOptions } };
33
-
34
- const defaultMutationOptions = queryClient.defaultMutationOptions();
35
- const defaultQueryOptions = queryClient.defaultQueryOptions();
36
-
37
- queryClient.setDefaultOptions({
38
- queries: { ...defaultQueryOptions, meta: queryMeta },
39
- mutations: { ...defaultMutationOptions, meta: mutationMeta },
40
- });
41
- };
42
-
43
- const mutationMeta = (queryClient.getDefaultOptions().mutations?.meta ?? {}) as unknown as BootstrapConfig;
44
- const queryMeta = (queryClient.getDefaultOptions().queries?.meta ?? {}) as unknown as BootstrapConfig;
45
-
46
- const options: BootstrapConfig = { ...queryMeta, ...mutationMeta };
47
- return { options, setConfig };
10
+ return { ...queryMeta, ...mutationMeta };
48
11
  };
@@ -1,15 +1,27 @@
1
- import type { BootstrapConfig, IUseQueryHeaders } from '../types';
1
+ import { useQueryClient } from '@tanstack/react-query';
2
+ import type { IUseQueryHeaders, TanstackQueryConfig } from '../types';
2
3
  import { useQueryConfig } from './useQueryConfig';
3
4
 
4
5
  export const useQueryHeaders = (): IUseQueryHeaders => {
5
- const { setConfig, ...config } = useQueryConfig();
6
+ const queryClient = useQueryClient();
7
+ const { headers, options } = useQueryConfig();
6
8
 
7
- const getHeaders = (): BootstrapConfig['headers'] => {
8
- return config.options?.headers;
9
+ const getHeaders = (): TanstackQueryConfig['headers'] => {
10
+ return headers;
9
11
  };
10
12
 
11
- const setQueryHeaders = (headers: BootstrapConfig['headers']) => {
12
- setConfig({ headers });
13
+ const setQueryHeaders = (newHeaders: TanstackQueryConfig['headers']) => {
14
+ const defaultMeta = {
15
+ headers: { ...headers, ...newHeaders },
16
+ options,
17
+ };
18
+
19
+ queryClient.setDefaultOptions({
20
+ queries: {
21
+ meta: defaultMeta,
22
+ },
23
+ mutations: { meta: defaultMeta },
24
+ });
13
25
  };
14
26
 
15
27
  return { setQueryHeaders, getHeaders };
@@ -3,9 +3,9 @@ import { useQueryConfig } from './useQueryConfig';
3
3
  export const useReactNativeEnv = () => {
4
4
  const config = useQueryConfig();
5
5
 
6
- const appUrl: string | undefined = config.options.environments?.appBaseUrl;
7
- const appTimeout: number | undefined = config.options.environments?.appTimeout;
8
- const isApp = config.options.context === 'app';
6
+ const appUrl: string | undefined = config.options?.environments?.appBaseUrl;
7
+ const appTimeout: number | undefined = config.options?.environments?.appTimeout;
8
+ const isApp = config.options?.context === 'app';
9
9
 
10
10
  return { appUrl, appTimeout, isApp };
11
11
  };
package/src/index.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from './config';
2
2
  export * from './helpers';
3
+ export * from './hooks';
3
4
  export * from './model';
4
5
  export * from './queries';
5
6
  export * from './request';
7
+ export * from './stores';
6
8
  export * from './types';
@@ -4,11 +4,7 @@ export const useKeyTrackerModel = <T>(keyTracker: string) => {
4
4
  const queryClient = useQueryClient();
5
5
 
6
6
  const getQueryKey = (innerKeyTracker?: string) => {
7
- const meta = {
8
- ...queryClient.getDefaultOptions().mutations?.meta,
9
- ...queryClient.getDefaultOptions().queries?.meta,
10
- };
11
- const queryKey: any[] | undefined = meta[innerKeyTracker ?? keyTracker] as any[];
7
+ const queryKey: any[] | undefined = queryClient.getQueryData([innerKeyTracker ?? keyTracker]);
12
8
 
13
9
  return queryKey;
14
10
  };
@@ -1,18 +1,22 @@
1
1
  import type { QueryKey, UseQueryOptions } from '@tanstack/react-query';
2
2
  import { useQuery } from '@tanstack/react-query';
3
+ import type { RawAxiosRequestHeaders } from 'axios';
3
4
  import { useEffect, useState } from 'react';
4
5
  import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
5
6
  import type { IRequestError, IRequestSuccess } from '../request';
6
7
  import { makeRequest } from '../request';
8
+ import { usePauseFutureRequests } from '../stores';
7
9
  import type { DefaultRequestOptions } from './queries.interface';
8
10
 
9
11
  export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOptions) => {
10
12
  const { baseUrl, headers } = deleteOptions ?? {};
11
13
  const [requestPath, setRequestPath] = useState<string>('');
12
14
  const [options, setOptions] = useState<any>();
13
- const [destroyConfig, setDestroyConfig] = useState<{ link: string; internalDeleteOptions: any }>();
14
15
 
15
16
  const { options: queryConfigOptions } = useQueryConfig();
17
+ const [requestPayload, setRequestPayload] = useState<Record<any, any>>();
18
+
19
+ const isFutureQueriesPaused = usePauseFutureRequests((state) => state.isFutureQueriesPaused);
16
20
 
17
21
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
18
22
 
@@ -20,7 +24,7 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
20
24
 
21
25
  const sendRequest = async (res: (value: any) => void, rej: (reason?: any) => void, queryKey: QueryKey) => {
22
26
  // get request headers
23
- const globalHeaders = getHeaders();
27
+ const globalHeaders: RawAxiosRequestHeaders = getHeaders();
24
28
 
25
29
  const [url] = queryKey;
26
30
  const requestUrl = (url ?? requestPath) as string;
@@ -34,7 +38,7 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
34
38
 
35
39
  let shouldContinue = true;
36
40
 
37
- if (queryConfigOptions.queryMiddleware) {
41
+ if (queryConfigOptions?.queryMiddleware) {
38
42
  shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
39
43
  }
40
44
 
@@ -75,7 +79,7 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
75
79
  Array<any>
76
80
  > & { cached?: boolean }
77
81
  ): Promise<IRequestSuccess<TResponse> | undefined> => {
78
- if (!queryConfigOptions.pauseFutureQueries) {
82
+ if (!isFutureQueriesPaused) {
79
83
  // set enabled to be true for every delete
80
84
  internalDeleteOptions = internalDeleteOptions ?? {};
81
85
  internalDeleteOptions.enabled = true;
@@ -85,19 +89,18 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
85
89
 
86
90
  return query.data;
87
91
  } else {
88
- // save delete config
89
- setDestroyConfig({ link, internalDeleteOptions });
92
+ setRequestPayload({ link, internalDeleteOptions });
90
93
  return undefined;
91
94
  }
92
95
  };
93
96
 
94
97
  useEffect(() => {
95
- if (!queryConfigOptions.pauseFutureQueries && destroyConfig) {
96
- destroy(destroyConfig.link, destroyConfig.internalDeleteOptions);
97
- setDestroyConfig(undefined);
98
+ if (!isFutureQueriesPaused && requestPayload) {
99
+ destroy(requestPayload.link, requestPayload.internalDeleteOptions);
100
+ setRequestPayload(undefined);
98
101
  }
99
102
  // eslint-disable-next-line react-hooks/exhaustive-deps
100
- }, [queryConfigOptions.pauseFutureQueries]);
103
+ }, [isFutureQueriesPaused]);
101
104
 
102
- return { destroy, ...query, isLoading: query.isLoading || queryConfigOptions.pauseFutureQueries };
105
+ return { destroy, ...query, isLoading: query.isLoading || isFutureQueriesPaused };
103
106
  };
@@ -1,10 +1,12 @@
1
1
  import type { InfiniteData, QueryKey, UseQueryOptions } from '@tanstack/react-query';
2
2
  import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query';
3
+ import type { RawAxiosRequestHeaders } from 'axios';
3
4
  import { startTransition, useEffect, useMemo, useState } from 'react';
4
5
  import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
5
6
 
6
7
  import type { IRequestError, IRequestSuccess } from '../request';
7
8
  import { makeRequest } from '../request';
9
+ import { usePauseFutureRequests } from '../stores';
8
10
  import type { DefaultRequestOptions, TanstackInfiniteQueryOption } from './queries.interface';
9
11
 
10
12
  interface Pagination {
@@ -32,10 +34,12 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
32
34
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
33
35
  const { getHeaders } = useQueryHeaders();
34
36
  const [requestPath, setRequestPath] = useState<string>(path);
35
- const [queryConfig, setQueryConfig] = useState<{ link: string; fetchOptions: any }>();
36
37
 
37
38
  const [options, setOptions] = useState<any>(queryOptions);
38
- const { options: queryConfigOptions, setConfig } = useQueryConfig();
39
+ const { options: queryConfigOptions } = useQueryConfig();
40
+ const [requestPayload, setRequestPayload] = useState<Record<any, any>>();
41
+
42
+ const isFutureQueriesPaused = usePauseFutureRequests((state) => state.isFutureQueriesPaused);
39
43
 
40
44
  let queryClient = useQueryClient();
41
45
 
@@ -55,7 +59,7 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
55
59
  ) => {
56
60
  if (load) {
57
61
  // get request headers
58
- const globalHeaders = getHeaders();
62
+ const globalHeaders: RawAxiosRequestHeaders = getHeaders();
59
63
 
60
64
  const requestOptions = {
61
65
  path: pageParam ?? requestPath,
@@ -66,7 +70,7 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
66
70
 
67
71
  let shouldContinue = true;
68
72
 
69
- if (queryConfigOptions.queryMiddleware) {
73
+ if (queryConfigOptions?.queryMiddleware) {
70
74
  shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
71
75
  }
72
76
 
@@ -115,7 +119,7 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
115
119
  sendRequest(res, rej, queryKey, pageParam)
116
120
  ),
117
121
  {
118
- enabled: load || !queryConfigOptions.pauseFutureQueries,
122
+ enabled: load && !isFutureQueriesPaused,
119
123
  getNextPageParam: (lastPage) => constructPaginationLink('next_page', lastPage),
120
124
  getPreviousPageParam: (lastPage) => constructPaginationLink('previous_page', lastPage),
121
125
  ...options,
@@ -146,18 +150,25 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
146
150
  >
147
151
  | undefined
148
152
  > => {
149
- if (!queryConfigOptions.pauseFutureQueries) {
153
+ if (!isFutureQueriesPaused) {
150
154
  await setOptionsAsync(fetchOptions);
151
155
  await updatedPathAsync(link);
152
156
 
153
157
  return query.data;
154
158
  } else {
155
- setQueryConfig({ link, fetchOptions });
156
-
159
+ setRequestPayload({ link, fetchOptions });
157
160
  return undefined;
158
161
  }
159
162
  };
160
163
 
164
+ useEffect(() => {
165
+ if (!isFutureQueriesPaused && requestPayload) {
166
+ get(requestPayload.link, requestPayload.fetchOptions);
167
+ setRequestPayload(undefined);
168
+ }
169
+ // eslint-disable-next-line react-hooks/exhaustive-deps
170
+ }, [isFutureQueriesPaused]);
171
+
161
172
  const updatedPathAsync = async (link: string) => {
162
173
  startTransition(() => {
163
174
  setRequestPath(link);
@@ -166,22 +177,19 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
166
177
 
167
178
  useEffect(() => {
168
179
  if (keyTracker) {
169
- setConfig({ [keyTracker]: [requestPath, {}] });
170
- }
171
- // eslint-disable-next-line react-hooks/exhaustive-deps
172
- }, [keyTracker, requestPath]);
180
+ // set expiration time for the tracker
181
+ queryClient.setQueryDefaults([keyTracker], {
182
+ cacheTime: Infinity,
183
+ staleTime: Infinity,
184
+ });
173
185
 
174
- useEffect(() => {
175
- if (!queryConfigOptions.pauseFutureQueries && queryConfig) {
176
- get(queryConfig.link, queryConfig.fetchOptions);
177
- setQueryConfig(undefined);
186
+ queryClient.setQueryData([keyTracker], [requestPath, {}]);
178
187
  }
179
- // eslint-disable-next-line react-hooks/exhaustive-deps
180
- }, [queryConfigOptions.pauseFutureQueries]);
188
+ }, [keyTracker, requestPath, queryClient, queryOptions?.staleTime]);
181
189
 
182
190
  return {
183
191
  get,
184
192
  ...query,
185
- isLoading: query.isLoading || queryConfigOptions.pauseFutureQueries,
193
+ isLoading: query.isLoading || isFutureQueriesPaused,
186
194
  };
187
195
  };
@@ -1,10 +1,12 @@
1
1
  import type { QueryKey, UseQueryOptions } from '@tanstack/react-query';
2
2
  import { useQuery, useQueryClient } from '@tanstack/react-query';
3
3
  import { startTransition, useEffect, useMemo, useState } from 'react';
4
+ import type { RawAxiosRequestHeaders } from '../../node_modules/axios/index';
4
5
  import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
5
6
 
6
7
  import type { IRequestError, IRequestSuccess } from '../request';
7
8
  import { makeRequest } from '../request';
9
+ import { usePauseFutureRequests } from '../stores';
8
10
  import type { DefaultRequestOptions, IPagination, TanstackQueryOption } from './queries.interface';
9
11
 
10
12
  export const useGetRequest = <TResponse extends Record<string, any>>({
@@ -26,8 +28,10 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
26
28
 
27
29
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
28
30
  const { getHeaders } = useQueryHeaders();
29
- const { options: queryConfigOptions, setConfig } = useQueryConfig();
30
- const [queryConfig, setQueryConfig] = useState<{ link: string; fetchOptions: any }>();
31
+ const { options: queryConfigOptions } = useQueryConfig();
32
+ const [requestPayload, setRequestPayload] = useState<Record<any, any>>();
33
+
34
+ const isFutureQueriesPaused = usePauseFutureRequests((state) => state.isFutureQueriesPaused);
31
35
 
32
36
  let queryClient = useQueryClient();
33
37
 
@@ -43,7 +47,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
43
47
  ) => {
44
48
  if (load) {
45
49
  // get request headers
46
- const globalHeaders = getHeaders();
50
+ const globalHeaders: RawAxiosRequestHeaders = getHeaders();
47
51
 
48
52
  const [url] = queryKey;
49
53
  const requestUrl = (url ?? requestPath) as string;
@@ -57,7 +61,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
57
61
 
58
62
  let shouldContinue = true;
59
63
 
60
- if (queryConfigOptions.queryMiddleware) {
64
+ if (queryConfigOptions?.queryMiddleware) {
61
65
  shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
62
66
  }
63
67
 
@@ -82,7 +86,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
82
86
  ({ queryKey }) =>
83
87
  new Promise<IRequestSuccess<TResponse> | IRequestError>((res, rej) => sendRequest(res, rej, queryKey)),
84
88
  {
85
- enabled: load,
89
+ enabled: load && !isFutureQueriesPaused,
86
90
  ...options,
87
91
  }
88
92
  );
@@ -95,10 +99,15 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
95
99
 
96
100
  useEffect(() => {
97
101
  if (keyTracker) {
98
- setConfig({ [keyTracker]: [requestPath, {}] });
102
+ // set expiration time for the tracker
103
+ queryClient.setQueryDefaults([keyTracker], {
104
+ cacheTime: Infinity,
105
+ staleTime: Infinity,
106
+ });
107
+
108
+ queryClient.setQueryData([keyTracker], [requestPath, {}]);
99
109
  }
100
- // eslint-disable-next-line react-hooks/exhaustive-deps
101
- }, [keyTracker, requestPath]);
110
+ }, [keyTracker, requestPath, queryClient, queryOptions?.staleTime]);
102
111
 
103
112
  const nextPage = () => {
104
113
  if (query.data?.data.pagination) {
@@ -160,29 +169,28 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
160
169
  Array<any>
161
170
  >
162
171
  ): Promise<IRequestSuccess<TResponse> | undefined> => {
163
- if (!queryConfigOptions.pauseFutureQueries) {
172
+ if (!isFutureQueriesPaused) {
164
173
  await setOptionsAsync(fetchOptions);
165
174
  await updatedPathAsync(link);
166
175
 
167
176
  return query.data;
168
177
  } else {
169
- setQueryConfig({ link, fetchOptions });
170
-
178
+ setRequestPayload({ link, fetchOptions });
171
179
  return undefined;
172
180
  }
173
181
  };
174
182
 
175
183
  useEffect(() => {
176
- if (!queryConfigOptions.pauseFutureQueries && queryConfig) {
177
- get(queryConfig.link, queryConfig.fetchOptions);
178
- setQueryConfig(undefined);
184
+ if (!isFutureQueriesPaused && requestPayload) {
185
+ get(requestPayload.link, requestPayload.fetchOptions);
186
+ setRequestPayload(undefined);
179
187
  }
180
188
  // eslint-disable-next-line react-hooks/exhaustive-deps
181
- }, [queryConfigOptions.pauseFutureQueries]);
189
+ }, [isFutureQueriesPaused]);
182
190
 
183
191
  return {
184
192
  ...query,
185
- isLoading: query.isLoading || queryConfigOptions.pauseFutureQueries,
193
+ isLoading: query.isLoading || isFutureQueriesPaused,
186
194
  setRequestPath,
187
195
  nextPage,
188
196
  prevPage,
@@ -1,17 +1,22 @@
1
1
  import type { MutateOptions } from '@tanstack/react-query';
2
2
  import { useMutation } from '@tanstack/react-query';
3
+ import type { RawAxiosRequestHeaders } from 'axios';
3
4
  import { useEffect, useState } from 'react';
4
5
  import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
5
6
  import { scrollToTop } from '../helpers';
6
7
  import { useUploadProgress } from '../hooks';
7
8
  import { HttpMethod, makeRequest } from '../request';
8
9
  import type { IRequestError, IRequestSuccess } from '../request/request.interface';
10
+ import { usePauseFutureRequests } from '../stores';
9
11
  import type { DefaultRequestOptions } from './queries.interface';
10
12
 
11
13
  export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: string } & DefaultRequestOptions) => {
12
14
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
13
15
  const { uploadProgressPercent, onUploadProgress } = useUploadProgress();
14
- const [mutationConfig, setMutationConfig] = useState<{ data: any; options: any }>();
16
+
17
+ const [requestPayload, setRequestPayload] = useState<Record<any, any>>();
18
+
19
+ const isFutureMutationsPaused = usePauseFutureRequests((state) => state.isFutureMutationsPaused);
15
20
 
16
21
  const { getHeaders } = useQueryHeaders();
17
22
 
@@ -19,7 +24,7 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
19
24
 
20
25
  const sendRequest = async (res: (value: any) => void, rej: (reason?: any) => void, data: any) => {
21
26
  // get request headers
22
- const globalHeaders = getHeaders();
27
+ const globalHeaders: RawAxiosRequestHeaders = getHeaders();
23
28
 
24
29
  const requestOptions = {
25
30
  path: path,
@@ -33,7 +38,7 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
33
38
 
34
39
  let shouldContinue = true;
35
40
 
36
- if (config.options.mutationMiddleware) {
41
+ if (config.options?.mutationMiddleware) {
37
42
  shouldContinue = await config.options.mutationMiddleware({
38
43
  mutationKey: [path, { type: 'mutation' }],
39
44
  ...requestOptions,
@@ -44,13 +49,13 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
44
49
  const patchResponse = await makeRequest<TResponse>(requestOptions);
45
50
  if (patchResponse.status) {
46
51
  // scroll to top after success
47
- if (config.options.context !== 'app') {
52
+ if (config.options?.context !== 'app') {
48
53
  scrollToTop();
49
54
  }
50
55
  res(patchResponse as IRequestSuccess<TResponse>);
51
56
  } else {
52
57
  // scroll to top after error
53
- if (config.options.context !== 'app') {
58
+ if (config.options?.context !== 'app') {
54
59
  scrollToTop();
55
60
  }
56
61
  rej(patchResponse);
@@ -73,26 +78,21 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
73
78
  data: any,
74
79
  options?: MutateOptions<IRequestSuccess<TResponse>, IRequestError, void, unknown> | undefined
75
80
  ): Promise<IRequestSuccess<TResponse> | undefined> => {
76
- if (!config.options.pauseFutureMutations) {
81
+ if (!isFutureMutationsPaused) {
77
82
  return mutation.mutateAsync(data, options);
78
83
  } else {
79
- setMutationConfig({ data, options });
84
+ setRequestPayload({ data, options });
80
85
  return undefined;
81
86
  }
82
87
  };
83
88
 
84
89
  useEffect(() => {
85
- if (!config.options.pauseFutureMutations && mutationConfig) {
86
- patch(mutationConfig.data, mutationConfig.options);
87
- setMutationConfig(undefined);
90
+ if (!isFutureMutationsPaused && requestPayload) {
91
+ patch(requestPayload.data, requestPayload.options);
92
+ setRequestPayload(undefined);
88
93
  }
89
94
  // eslint-disable-next-line react-hooks/exhaustive-deps
90
- }, [config.options.pauseFutureMutations]);
95
+ }, [isFutureMutationsPaused]);
91
96
 
92
- return {
93
- patch,
94
- uploadProgressPercent,
95
- ...mutation,
96
- isLoading: mutation.isLoading || config.options.pauseFutureMutations,
97
- };
97
+ return { patch, uploadProgressPercent, ...mutation, isLoading: mutation.isLoading || isFutureMutationsPaused };
98
98
  };