@ventlio/tanstack-query 0.2.85 → 0.2.87

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 (36) hide show
  1. package/dist/config/bootstrapQueryRequest.js +7 -5
  2. package/dist/config/bootstrapQueryRequest.js.map +1 -1
  3. package/dist/config/useQueryConfig.js +3 -2
  4. package/dist/config/useQueryConfig.js.map +1 -1
  5. package/dist/config/useQueryHeaders.js +12 -14
  6. package/dist/config/useQueryHeaders.js.map +1 -1
  7. package/dist/config/useReactNativeEnv.js +5 -6
  8. package/dist/config/useReactNativeEnv.js.map +1 -1
  9. package/dist/index.mjs +161 -100
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/model/useQueryModel.js +4 -1
  12. package/dist/model/useQueryModel.js.map +1 -1
  13. package/dist/queries/useDeleteRequest.js +23 -11
  14. package/dist/queries/useDeleteRequest.js.map +1 -1
  15. package/dist/queries/useGetInfiniteRequest.js +21 -9
  16. package/dist/queries/useGetInfiniteRequest.js.map +1 -1
  17. package/dist/queries/useGetRequest.d.ts +4 -4
  18. package/dist/queries/useGetRequest.js +27 -14
  19. package/dist/queries/useGetRequest.js.map +1 -1
  20. package/dist/queries/usePatchRequest.js +29 -16
  21. package/dist/queries/usePatchRequest.js.map +1 -1
  22. package/dist/queries/usePostRequest.js +31 -16
  23. package/dist/queries/usePostRequest.js.map +1 -1
  24. package/dist/types/index.d.ts +8 -0
  25. package/package.json +1 -1
  26. package/src/config/bootstrapQueryRequest.ts +9 -6
  27. package/src/config/useQueryConfig.ts +3 -2
  28. package/src/config/useQueryHeaders.ts +12 -18
  29. package/src/config/useReactNativeEnv.ts +5 -7
  30. package/src/model/useQueryModel.ts +3 -2
  31. package/src/queries/useDeleteRequest.ts +27 -13
  32. package/src/queries/useGetInfiniteRequest.ts +25 -11
  33. package/src/queries/useGetRequest.ts +30 -16
  34. package/src/queries/usePatchRequest.ts +31 -18
  35. package/src/queries/usePostRequest.ts +36 -18
  36. package/src/types/index.ts +4 -0
@@ -2,38 +2,52 @@ import type { QueryKey, UseQueryOptions } from '@tanstack/react-query';
2
2
  import { useQuery } from '@tanstack/react-query';
3
3
  import type { RawAxiosRequestHeaders } from 'axios';
4
4
  import { useState } from 'react';
5
- import { useEnvironmentVariables, useQueryHeaders } from '../config';
5
+ import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
6
6
  import type { IRequestError, IRequestSuccess } from '../request';
7
- import { HttpMethod, makeRequest } from '../request';
7
+ import { makeRequest } from '../request';
8
8
  import type { DefaultRequestOptions } from './queries.interface';
9
9
 
10
10
  export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOptions) => {
11
11
  const { baseUrl, headers } = deleteOptions ?? {};
12
- const [requestPath, updateDeletePath] = useState<string>('');
12
+ const [requestPath, setRequestPath] = useState<string>('');
13
13
  const [options, setOptions] = useState<any>();
14
14
 
15
+ const { options: queryConfigOptions } = useQueryConfig();
16
+
15
17
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
16
18
 
17
19
  const { getHeaders } = useQueryHeaders();
18
20
 
19
- const sendRequest = async (res: (value: any) => void, rej: (reason?: any) => void, queryKey?: QueryKey) => {
21
+ const sendRequest = async (res: (value: any) => void, rej: (reason?: any) => void, queryKey: QueryKey) => {
20
22
  // get request headers
21
23
  const globalHeaders: RawAxiosRequestHeaders = getHeaders();
22
24
 
23
- const [url] = (queryKey ?? []) as string[];
25
+ const [url] = queryKey;
26
+ const requestUrl = (url ?? requestPath) as string;
24
27
 
25
- const postResponse = await makeRequest<TResponse>({
26
- path: url ?? requestPath,
28
+ const requestOptions = {
29
+ path: requestUrl,
27
30
  headers: { ...globalHeaders, ...headers },
28
- method: HttpMethod.DELETE,
29
31
  baseURL: baseUrl ?? API_URL,
30
32
  timeout: TIMEOUT,
31
- });
33
+ };
34
+
35
+ let shouldContinue = true;
36
+
37
+ if (queryConfigOptions?.queryMiddleware) {
38
+ shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
39
+ }
40
+
41
+ if (shouldContinue) {
42
+ const postResponse = await makeRequest<TResponse>(requestOptions);
32
43
 
33
- if (postResponse.status) {
34
- res(postResponse as IRequestSuccess<TResponse>);
44
+ if (postResponse.status) {
45
+ res(postResponse as IRequestSuccess<TResponse>);
46
+ } else {
47
+ rej(postResponse);
48
+ }
35
49
  } else {
36
- rej(postResponse);
50
+ rej(null);
37
51
  }
38
52
  };
39
53
 
@@ -45,7 +59,7 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
45
59
  );
46
60
 
47
61
  const updatedPathAsync = async (link: string) => {
48
- return updateDeletePath(link);
62
+ return setRequestPath(link);
49
63
  };
50
64
 
51
65
  const setOptionsAsync = async (fetchOptions: any) => {
@@ -1,8 +1,8 @@
1
- import type { InfiniteData, UseQueryOptions } from '@tanstack/react-query';
1
+ import type { InfiniteData, QueryKey, UseQueryOptions } from '@tanstack/react-query';
2
2
  import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query';
3
3
  import type { RawAxiosRequestHeaders } from 'axios';
4
4
  import { startTransition, useEffect, useMemo, useState } from 'react';
5
- import { useEnvironmentVariables, useQueryHeaders } from '../config';
5
+ import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
6
6
 
7
7
  import type { IRequestError, IRequestSuccess } from '../request';
8
8
  import { makeRequest } from '../request';
@@ -32,9 +32,10 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
32
32
  } & DefaultRequestOptions) => {
33
33
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
34
34
  const { getHeaders } = useQueryHeaders();
35
- const [requestPath, updatePath] = useState<string>(path);
35
+ const [requestPath, setRequestPath] = useState<string>(path);
36
36
 
37
37
  const [options, setOptions] = useState<any>(queryOptions);
38
+ const { options: queryConfigOptions } = useQueryConfig();
38
39
 
39
40
  let queryClient = useQueryClient();
40
41
 
@@ -49,23 +50,36 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
49
50
  | PromiseLike<IRequestError | IRequestSuccess<TResponse & { pagination: Pagination }>>
50
51
  ) => void,
51
52
  rej: (reason?: any) => void,
53
+ queryKey: QueryKey,
52
54
  pageParam?: string
53
55
  ) => {
54
56
  if (load) {
55
57
  // get request headers
56
58
  const globalHeaders: RawAxiosRequestHeaders = getHeaders();
57
59
 
58
- const getResponse = await makeRequest<TResponse>({
60
+ const requestOptions = {
59
61
  path: pageParam ?? requestPath,
60
62
  headers: { ...globalHeaders, ...headers },
61
63
  baseURL: baseUrl ?? API_URL,
62
64
  timeout: TIMEOUT,
63
- });
65
+ };
66
+
67
+ let shouldContinue = true;
68
+
69
+ if (queryConfigOptions?.queryMiddleware) {
70
+ shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
71
+ }
72
+
73
+ if (shouldContinue) {
74
+ const getResponse = await makeRequest<TResponse>(requestOptions);
64
75
 
65
- if (getResponse.status) {
66
- res(getResponse as IRequestSuccess<TResponse & { pagination: Pagination }>);
76
+ if (getResponse.status) {
77
+ res(getResponse as IRequestSuccess<TResponse & { pagination: Pagination }>);
78
+ } else {
79
+ rej(getResponse);
80
+ }
67
81
  } else {
68
- rej(getResponse);
82
+ rej(null);
69
83
  }
70
84
  } else {
71
85
  res(null as any);
@@ -96,9 +110,9 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
96
110
 
97
111
  const query = useInfiniteQuery<any, any, IRequestSuccess<TResponse & { pagination: Pagination }>>(
98
112
  [requestPath, {}],
99
- ({ pageParam = requestPath }) =>
113
+ ({ pageParam = requestPath, queryKey }) =>
100
114
  new Promise<IRequestSuccess<TResponse & { pagination: Pagination }> | IRequestError>((res, rej) =>
101
- sendRequest(res, rej, pageParam)
115
+ sendRequest(res, rej, queryKey, pageParam)
102
116
  ),
103
117
  {
104
118
  enabled: load,
@@ -140,7 +154,7 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
140
154
 
141
155
  const updatedPathAsync = async (link: string) => {
142
156
  startTransition(() => {
143
- updatePath(link);
157
+ setRequestPath(link);
144
158
  });
145
159
  };
146
160
 
@@ -2,7 +2,7 @@ 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
4
  import type { RawAxiosRequestHeaders } from '../../node_modules/axios/index';
5
- import { useEnvironmentVariables, useQueryHeaders } from '../config';
5
+ import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
6
6
 
7
7
  import type { IRequestError, IRequestSuccess } from '../request';
8
8
  import { makeRequest } from '../request';
@@ -21,12 +21,13 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
21
21
  queryOptions?: TanstackQueryOption<TResponse>;
22
22
  keyTracker?: string;
23
23
  } & DefaultRequestOptions) => {
24
- const [requestPath, updatePath] = useState<string>(path);
24
+ const [requestPath, setRequestPath] = useState<string>(path);
25
25
  const [options, setOptions] = useState<any>(queryOptions);
26
26
  const [page, setPage] = useState<number>(1);
27
27
 
28
28
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
29
29
  const { getHeaders } = useQueryHeaders();
30
+ const { options: queryConfigOptions } = useQueryConfig();
30
31
 
31
32
  let queryClient = useQueryClient();
32
33
 
@@ -38,25 +39,38 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
38
39
  value: IRequestError | IRequestSuccess<TResponse> | PromiseLike<IRequestError | IRequestSuccess<TResponse>>
39
40
  ) => void,
40
41
  rej: (reason?: any) => void,
41
- queryKey?: QueryKey
42
+ queryKey: QueryKey
42
43
  ) => {
43
44
  if (load) {
44
45
  // get request headers
45
46
  const globalHeaders: RawAxiosRequestHeaders = getHeaders();
46
47
 
47
- const [url] = (queryKey ?? []) as string[];
48
+ const [url] = queryKey;
49
+ const requestUrl = (url ?? requestPath) as string;
48
50
 
49
- const getResponse = await makeRequest<TResponse>({
50
- path: url ?? requestPath,
51
+ const requestOptions = {
52
+ path: requestUrl,
51
53
  headers: { ...globalHeaders, ...headers },
52
54
  baseURL: baseUrl ?? API_URL,
53
55
  timeout: TIMEOUT,
54
- });
56
+ };
57
+
58
+ let shouldContinue = true;
59
+
60
+ if (queryConfigOptions?.queryMiddleware) {
61
+ shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
62
+ }
63
+
64
+ if (shouldContinue) {
65
+ const getResponse = await makeRequest<TResponse>(requestOptions);
55
66
 
56
- if (getResponse.status) {
57
- res(getResponse as IRequestSuccess<TResponse>);
67
+ if (getResponse.status) {
68
+ res(getResponse as IRequestSuccess<TResponse>);
69
+ } else {
70
+ rej(getResponse);
71
+ }
58
72
  } else {
59
- rej(getResponse);
73
+ rej(null);
60
74
  }
61
75
  } else {
62
76
  res(null as any);
@@ -75,7 +89,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
75
89
 
76
90
  useEffect(() => {
77
91
  if (path) {
78
- updatePath(path);
92
+ setRequestPath(path);
79
93
  }
80
94
  }, [path]);
81
95
 
@@ -95,7 +109,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
95
109
  if (query.data?.data.pagination) {
96
110
  const pagination: IPagination = query.data.data.pagination;
97
111
  if (pagination.next_page !== pagination.current_page && pagination.next_page > pagination.current_page) {
98
- updatePath(constructPaginationLink(requestPath, pagination.next_page));
112
+ setRequestPath(constructPaginationLink(requestPath, pagination.next_page));
99
113
  }
100
114
  }
101
115
  };
@@ -104,7 +118,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
104
118
  if (query.data?.data.pagination) {
105
119
  const pagination: IPagination = query.data.data.pagination;
106
120
  if (pagination.previous_page !== pagination.current_page && pagination.previous_page < pagination.current_page) {
107
- updatePath(constructPaginationLink(requestPath, pagination.previous_page));
121
+ setRequestPath(constructPaginationLink(requestPath, pagination.previous_page));
108
122
  }
109
123
  }
110
124
  };
@@ -127,12 +141,12 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
127
141
  };
128
142
 
129
143
  const gotoPage = (pageNumber: number) => {
130
- updatePath(constructPaginationLink(requestPath, pageNumber));
144
+ setRequestPath(constructPaginationLink(requestPath, pageNumber));
131
145
  };
132
146
 
133
147
  const updatedPathAsync = async (link: string) => {
134
148
  startTransition(() => {
135
- updatePath(link);
149
+ setRequestPath(link);
136
150
  });
137
151
  };
138
152
 
@@ -159,7 +173,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
159
173
 
160
174
  return {
161
175
  ...query,
162
- updatePath,
176
+ setRequestPath,
163
177
  nextPage,
164
178
  prevPage,
165
179
  get,
@@ -1,12 +1,11 @@
1
1
  import type { MutateOptions } from '@tanstack/react-query';
2
- import { useMutation, useQueryClient } from '@tanstack/react-query';
2
+ import { useMutation } from '@tanstack/react-query';
3
3
  import type { RawAxiosRequestHeaders } from 'axios';
4
- import { useEnvironmentVariables, useQueryHeaders } from '../config';
4
+ import { useEnvironmentVariables, useQueryConfig, useQueryHeaders } from '../config';
5
5
  import { scrollToTop } from '../helpers';
6
6
  import { useUploadProgress } from '../hooks';
7
7
  import { HttpMethod, makeRequest } from '../request';
8
8
  import type { IRequestError, IRequestSuccess } from '../request/request.interface';
9
- import type { TanstackQueryConfig } from '../types';
10
9
  import type { DefaultRequestOptions } from './queries.interface';
11
10
 
12
11
  export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: string } & DefaultRequestOptions) => {
@@ -14,15 +13,14 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
14
13
  const { uploadProgressPercent, onUploadProgress } = useUploadProgress();
15
14
 
16
15
  const { getHeaders } = useQueryHeaders();
17
- const queryClient = useQueryClient();
18
16
 
19
- const config = queryClient.getQueryData<TanstackQueryConfig>(['config']);
17
+ const config = useQueryConfig();
20
18
 
21
19
  const sendRequest = async (res: (value: any) => void, rej: (reason?: any) => void, data: any) => {
22
20
  // get request headers
23
21
  const globalHeaders: RawAxiosRequestHeaders = getHeaders();
24
22
 
25
- const patchResponse = await makeRequest<TResponse>({
23
+ const requestOptions = {
26
24
  path: path,
27
25
  body: data,
28
26
  method: HttpMethod.PATCH,
@@ -30,20 +28,34 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
30
28
  baseURL: baseUrl ?? API_URL,
31
29
  timeout: TIMEOUT,
32
30
  onUploadProgress,
33
- });
31
+ };
34
32
 
35
- if (patchResponse.status) {
36
- // scroll to top after success
37
- if (config?.options?.context !== 'app') {
38
- scrollToTop();
33
+ let shouldContinue = true;
34
+
35
+ if (config.options?.mutationMiddleware) {
36
+ shouldContinue = await config.options.mutationMiddleware({
37
+ mutationKey: [path, { type: 'mutation' }],
38
+ ...requestOptions,
39
+ });
40
+ }
41
+
42
+ if (shouldContinue) {
43
+ const patchResponse = await makeRequest<TResponse>(requestOptions);
44
+ if (patchResponse.status) {
45
+ // scroll to top after success
46
+ if (config.options?.context !== 'app') {
47
+ scrollToTop();
48
+ }
49
+ res(patchResponse as IRequestSuccess<TResponse>);
50
+ } else {
51
+ // scroll to top after error
52
+ if (config.options?.context !== 'app') {
53
+ scrollToTop();
54
+ }
55
+ rej(patchResponse);
39
56
  }
40
- res(patchResponse as IRequestSuccess<TResponse>);
41
57
  } else {
42
- // scroll to top after error
43
- if (config?.options?.context !== 'app') {
44
- scrollToTop();
45
- }
46
- rej(patchResponse);
58
+ rej(null);
47
59
  }
48
60
  };
49
61
 
@@ -52,7 +64,8 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
52
64
  (dataData: any) =>
53
65
  new Promise<IRequestSuccess<TResponse>>((res, rej) => {
54
66
  return sendRequest(res, rej, dataData);
55
- })
67
+ }),
68
+ { mutationKey: [path, { type: 'mutation' }] }
56
69
  );
57
70
 
58
71
  const patch = async (
@@ -1,13 +1,12 @@
1
1
  import type { MutateOptions } from '@tanstack/react-query';
2
- import { useMutation, useQueryClient } from '@tanstack/react-query';
3
- import { useEnvironmentVariables, useQueryHeaders, useReactNativeEnv } from '../config';
2
+ import { useMutation } from '@tanstack/react-query';
3
+ import { useEnvironmentVariables, useQueryConfig, useQueryHeaders, useReactNativeEnv } from '../config';
4
4
 
5
5
  import type { RawAxiosRequestHeaders } from 'axios';
6
6
  import { scrollToTop } from '../helpers';
7
7
  import { useUploadProgress } from '../hooks';
8
8
  import type { IMakeRequest, IRequestError, IRequestSuccess } from '../request';
9
9
  import { HttpMethod, makeRequest } from '../request';
10
- import type { TanstackQueryConfig } from '../types';
11
10
  import type { DefaultRequestOptions } from './queries.interface';
12
11
 
13
12
  export const usePostRequest = <TResponse>({
@@ -22,7 +21,9 @@ export const usePostRequest = <TResponse>({
22
21
  fileSelectors?: string[];
23
22
  } & DefaultRequestOptions) => {
24
23
  const { API_URL, TIMEOUT } = useEnvironmentVariables();
25
- const queryClient = useQueryClient();
24
+
25
+ const config = useQueryConfig();
26
+
26
27
  const { getHeaders } = useQueryHeaders();
27
28
  const { isApp } = useReactNativeEnv();
28
29
  const { uploadProgressPercent, onUploadProgress } = useUploadProgress();
@@ -34,12 +35,12 @@ export const usePostRequest = <TResponse>({
34
35
  ) => {
35
36
  // get request headers
36
37
  const globalHeaders: RawAxiosRequestHeaders = getHeaders();
37
- const config = queryClient.getQueryData<TanstackQueryConfig>(['config']);
38
+
38
39
  const { data, requestConfig } = postData;
39
40
 
40
41
  delete requestConfig?.body;
41
42
 
42
- const postResponse = await makeRequest<TResponse>({
43
+ const requestOptions = {
43
44
  path,
44
45
  body: data,
45
46
  method: HttpMethod.POST,
@@ -53,21 +54,36 @@ export const usePostRequest = <TResponse>({
53
54
  },
54
55
  onUploadProgress,
55
56
  ...requestConfig,
56
- });
57
+ };
58
+
59
+ let shouldContinue = true;
57
60
 
58
- if (postResponse.status) {
59
- // scroll to top after success
61
+ if (config.options?.mutationMiddleware) {
62
+ shouldContinue = await config.options.mutationMiddleware({
63
+ mutationKey: [path, { type: 'mutation' }],
64
+ ...requestOptions,
65
+ });
66
+ }
67
+
68
+ if (shouldContinue) {
69
+ const postResponse = await makeRequest<TResponse>(requestOptions);
60
70
 
61
- if (config?.options?.context !== 'app') {
62
- scrollToTop();
71
+ if (postResponse.status) {
72
+ // scroll to top after success
73
+
74
+ if (config.options?.context !== 'app') {
75
+ scrollToTop();
76
+ }
77
+ res(postResponse as IRequestSuccess<TResponse>);
78
+ } else {
79
+ // scroll to top after error
80
+ if (config.options?.context !== 'app') {
81
+ scrollToTop();
82
+ }
83
+ rej(postResponse);
63
84
  }
64
- res(postResponse as IRequestSuccess<TResponse>);
65
85
  } else {
66
- // scroll to top after error
67
- if (config?.options?.context !== 'app') {
68
- scrollToTop();
69
- }
70
- rej(postResponse);
86
+ rej(null);
71
87
  }
72
88
  };
73
89
 
@@ -76,7 +92,9 @@ export const usePostRequest = <TResponse>({
76
92
  IRequestSuccess<TResponse>,
77
93
  IRequestError,
78
94
  { data: any; requestConfig?: Partial<Omit<IMakeRequest, 'body'>> }
79
- >(async (postData) => new Promise<IRequestSuccess<TResponse>>((res, rej) => sendRequest(res, rej, postData)));
95
+ >(async (postData) => new Promise<IRequestSuccess<TResponse>>((res, rej) => sendRequest(res, rej, postData)), {
96
+ mutationKey: [path, { type: 'mutation' }],
97
+ });
80
98
 
81
99
  const post = async <T>(
82
100
  data?: T,
@@ -1,4 +1,6 @@
1
+ import type { QueryKey } from '@tanstack/react-query';
1
2
  import type { RawAxiosRequestHeaders } from 'axios';
3
+ import type { IMakeRequest } from '../request';
2
4
 
3
5
  export interface BootstrapConfig {
4
6
  environments?: {
@@ -7,6 +9,8 @@ export interface BootstrapConfig {
7
9
  };
8
10
  context?: ContextType;
9
11
  modelConfig?: BootstrapModelConfig;
12
+ mutationMiddleware?: (mutateRequestConfig?: IMakeRequest & { mutationKey: QueryKey }) => Promise<boolean>;
13
+ queryMiddleware?: (queryRequestConfig?: IMakeRequest & { queryKey: QueryKey }) => Promise<boolean>;
10
14
  }
11
15
 
12
16
  export interface BootstrapModelConfig {