@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.
- package/dist/config/bootstrapQueryRequest.js +1 -1
- package/dist/config/useQueryConfig.js +1 -27
- package/dist/config/useQueryConfig.js.map +1 -1
- package/dist/config/useQueryHeaders.js +15 -4
- package/dist/config/useQueryHeaders.js.map +1 -1
- package/dist/config/useReactNativeEnv.js +3 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +123 -120
- package/dist/index.mjs.map +1 -1
- package/dist/model/useKeyTrackerModel.d.ts +1 -1
- package/dist/model/useKeyTrackerModel.js +1 -5
- package/dist/model/useKeyTrackerModel.js.map +1 -1
- package/dist/queries/useDeleteRequest.d.ts +4 -4
- package/dist/queries/useDeleteRequest.js +11 -10
- package/dist/queries/useDeleteRequest.js.map +1 -1
- package/dist/queries/useGetInfiniteRequest.d.ts +4 -4
- package/dist/queries/useGetInfiniteRequest.js +23 -17
- package/dist/queries/useGetInfiniteRequest.js.map +1 -1
- package/dist/queries/useGetRequest.d.ts +4 -4
- package/dist/queries/useGetRequest.js +20 -14
- package/dist/queries/useGetRequest.js.map +1 -1
- package/dist/queries/usePatchRequest.d.ts +4 -4
- package/dist/queries/usePatchRequest.js +13 -16
- package/dist/queries/usePatchRequest.js.map +1 -1
- package/dist/queries/usePostRequest.d.ts +4 -4
- package/dist/queries/usePostRequest.js +13 -11
- package/dist/queries/usePostRequest.js.map +1 -1
- package/dist/stores/index.d.ts +1 -0
- package/dist/stores/usePauseFutureRequests.d.ts +7 -0
- package/dist/stores/usePauseFutureRequests.js +19 -0
- package/dist/stores/usePauseFutureRequests.js.map +1 -0
- package/dist/types/index.d.ts +4 -7
- package/package.json +3 -2
- package/src/config/bootstrapQueryRequest.ts +1 -1
- package/src/config/useQueryConfig.ts +4 -41
- package/src/config/useQueryHeaders.ts +18 -6
- package/src/config/useReactNativeEnv.ts +3 -3
- package/src/index.ts +2 -0
- package/src/model/useKeyTrackerModel.ts +1 -5
- package/src/queries/useDeleteRequest.ts +14 -11
- package/src/queries/useGetInfiniteRequest.ts +27 -19
- package/src/queries/useGetRequest.ts +24 -16
- package/src/queries/usePatchRequest.ts +17 -17
- package/src/queries/usePostRequest.ts +16 -12
- package/src/stores/index.ts +1 -0
- package/src/stores/usePauseFutureRequests.ts +25 -0
- 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":";;;;;;;;;;;;;;;;;;;"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
27
|
-
|
|
23
|
+
headers: RawAxiosRequestHeaders;
|
|
24
|
+
options?: BootstrapConfig;
|
|
28
25
|
}
|
|
29
26
|
export interface IUseQueryHeaders {
|
|
30
|
-
getHeaders: () =>
|
|
31
|
-
setQueryHeaders: (header:
|
|
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.
|
|
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
|
}
|
|
@@ -1,48 +1,11 @@
|
|
|
1
|
-
import type { MutationMeta, QueryMeta } from '@tanstack/react-query';
|
|
2
1
|
import { useQueryClient } from '@tanstack/react-query';
|
|
3
|
-
import type {
|
|
2
|
+
import type { TanstackQueryConfig } from '../types';
|
|
4
3
|
|
|
5
4
|
export const useQueryConfig = (): TanstackQueryConfig => {
|
|
6
5
|
const queryClient = useQueryClient();
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
6
|
+
const queryClient = useQueryClient();
|
|
7
|
+
const { headers, options } = useQueryConfig();
|
|
6
8
|
|
|
7
|
-
const getHeaders = ():
|
|
8
|
-
return
|
|
9
|
+
const getHeaders = (): TanstackQueryConfig['headers'] => {
|
|
10
|
+
return headers;
|
|
9
11
|
};
|
|
10
12
|
|
|
11
|
-
const setQueryHeaders = (
|
|
12
|
-
|
|
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
|
|
7
|
-
const appTimeout: number | undefined = config.options
|
|
8
|
-
const isApp = config.options
|
|
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
|
@@ -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
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
89
|
-
setDestroyConfig({ link, internalDeleteOptions });
|
|
92
|
+
setRequestPayload({ link, internalDeleteOptions });
|
|
90
93
|
return undefined;
|
|
91
94
|
}
|
|
92
95
|
};
|
|
93
96
|
|
|
94
97
|
useEffect(() => {
|
|
95
|
-
if (!
|
|
96
|
-
destroy(
|
|
97
|
-
|
|
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
|
-
}, [
|
|
103
|
+
}, [isFutureQueriesPaused]);
|
|
101
104
|
|
|
102
|
-
return { destroy, ...query, isLoading: query.isLoading ||
|
|
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
|
|
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
|
|
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
|
|
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 (!
|
|
153
|
+
if (!isFutureQueriesPaused) {
|
|
150
154
|
await setOptionsAsync(fetchOptions);
|
|
151
155
|
await updatedPathAsync(link);
|
|
152
156
|
|
|
153
157
|
return query.data;
|
|
154
158
|
} else {
|
|
155
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
180
|
+
// set expiration time for the tracker
|
|
181
|
+
queryClient.setQueryDefaults([keyTracker], {
|
|
182
|
+
cacheTime: Infinity,
|
|
183
|
+
staleTime: Infinity,
|
|
184
|
+
});
|
|
173
185
|
|
|
174
|
-
|
|
175
|
-
if (!queryConfigOptions.pauseFutureQueries && queryConfig) {
|
|
176
|
-
get(queryConfig.link, queryConfig.fetchOptions);
|
|
177
|
-
setQueryConfig(undefined);
|
|
186
|
+
queryClient.setQueryData([keyTracker], [requestPath, {}]);
|
|
178
187
|
}
|
|
179
|
-
|
|
180
|
-
}, [queryConfigOptions.pauseFutureQueries]);
|
|
188
|
+
}, [keyTracker, requestPath, queryClient, queryOptions?.staleTime]);
|
|
181
189
|
|
|
182
190
|
return {
|
|
183
191
|
get,
|
|
184
192
|
...query,
|
|
185
|
-
isLoading: query.isLoading ||
|
|
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
|
|
30
|
-
const [
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 (!
|
|
172
|
+
if (!isFutureQueriesPaused) {
|
|
164
173
|
await setOptionsAsync(fetchOptions);
|
|
165
174
|
await updatedPathAsync(link);
|
|
166
175
|
|
|
167
176
|
return query.data;
|
|
168
177
|
} else {
|
|
169
|
-
|
|
170
|
-
|
|
178
|
+
setRequestPayload({ link, fetchOptions });
|
|
171
179
|
return undefined;
|
|
172
180
|
}
|
|
173
181
|
};
|
|
174
182
|
|
|
175
183
|
useEffect(() => {
|
|
176
|
-
if (!
|
|
177
|
-
get(
|
|
178
|
-
|
|
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
|
-
}, [
|
|
189
|
+
}, [isFutureQueriesPaused]);
|
|
182
190
|
|
|
183
191
|
return {
|
|
184
192
|
...query,
|
|
185
|
-
isLoading: query.isLoading ||
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 (!
|
|
81
|
+
if (!isFutureMutationsPaused) {
|
|
77
82
|
return mutation.mutateAsync(data, options);
|
|
78
83
|
} else {
|
|
79
|
-
|
|
84
|
+
setRequestPayload({ data, options });
|
|
80
85
|
return undefined;
|
|
81
86
|
}
|
|
82
87
|
};
|
|
83
88
|
|
|
84
89
|
useEffect(() => {
|
|
85
|
-
if (!
|
|
86
|
-
patch(
|
|
87
|
-
|
|
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
|
-
}, [
|
|
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
|
};
|