@ventlio/tanstack-query 0.5.4 → 0.5.6

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 (76) hide show
  1. package/dist/config/bootstrapQueryRequest.d.ts +4 -4
  2. package/dist/config/bootstrapQueryRequest.js +15 -15
  3. package/dist/config/config.interface.d.ts +4 -4
  4. package/dist/config/index.d.ts +6 -6
  5. package/dist/config/useEnvironmentVariables.d.ts +2 -2
  6. package/dist/config/useEnvironmentVariables.js +8 -8
  7. package/dist/config/useQueryConfig.d.ts +2 -2
  8. package/dist/config/useQueryConfig.js +5 -5
  9. package/dist/config/useQueryHeaders.d.ts +2 -2
  10. package/dist/config/useQueryHeaders.js +9 -9
  11. package/dist/config/useReactNativeEnv.d.ts +5 -5
  12. package/dist/config/useReactNativeEnv.js +6 -6
  13. package/dist/helpers/index.d.ts +2 -2
  14. package/dist/helpers/scrollToTop.d.ts +1 -1
  15. package/dist/helpers/scrollToTop.js +5 -5
  16. package/dist/helpers/timeFuncs.d.ts +1 -1
  17. package/dist/helpers/timeFuncs.js +7 -7
  18. package/dist/hooks/index.d.ts +1 -1
  19. package/dist/hooks/useUploadProgress.d.ts +5 -5
  20. package/dist/hooks/useUploadProgress.js +8 -8
  21. package/dist/index.d.ts +8 -8
  22. package/dist/index.mjs +827 -830
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/model/index.d.ts +4 -4
  25. package/dist/model/model.interface.d.ts +11 -11
  26. package/dist/model/useKeyTrackerModel.d.ts +4 -4
  27. package/dist/model/useKeyTrackerModel.js +14 -14
  28. package/dist/model/useQueryModel.d.ts +2 -2
  29. package/dist/model/useQueryModel.js +115 -115
  30. package/dist/model/useRefetchQuery.d.ts +3 -3
  31. package/dist/model/useRefetchQuery.js +10 -10
  32. package/dist/queries/index.d.ts +6 -6
  33. package/dist/queries/queries.interface.d.ts +17 -17
  34. package/dist/queries/useDeleteRequest.d.ts +60 -60
  35. package/dist/queries/useDeleteRequest.js +72 -71
  36. package/dist/queries/useDeleteRequest.js.map +1 -1
  37. package/dist/queries/useGetInfiniteRequest.d.ts +108 -110
  38. package/dist/queries/useGetInfiniteRequest.js +103 -102
  39. package/dist/queries/useGetInfiniteRequest.js.map +1 -1
  40. package/dist/queries/useGetRequest.d.ts +73 -74
  41. package/dist/queries/useGetRequest.js +129 -133
  42. package/dist/queries/useGetRequest.js.map +1 -1
  43. package/dist/queries/usePatchRequest.d.ts +86 -86
  44. package/dist/queries/usePatchRequest.js +70 -70
  45. package/dist/queries/usePostRequest.d.ts +149 -157
  46. package/dist/queries/usePostRequest.js +77 -78
  47. package/dist/queries/usePostRequest.js.map +1 -1
  48. package/dist/queries/usePutRequest.d.ts +86 -86
  49. package/dist/request/axios-instance.d.ts +3 -3
  50. package/dist/request/axios-instance.js +6 -6
  51. package/dist/request/buildFormData.d.ts +1 -1
  52. package/dist/request/buildFormData.js +40 -40
  53. package/dist/request/index.d.ts +6 -6
  54. package/dist/request/make-request.d.ts +2 -2
  55. package/dist/request/make-request.js +80 -80
  56. package/dist/request/request.enum.d.ts +11 -11
  57. package/dist/request/request.enum.js +12 -12
  58. package/dist/request/request.interface.d.ts +48 -48
  59. package/dist/request/transformer.d.ts +7 -7
  60. package/dist/request/transformer.js +18 -18
  61. package/dist/stores/index.d.ts +2 -2
  62. package/dist/stores/useHeaderStore.d.ts +7 -7
  63. package/dist/stores/useHeaderStore.js +5 -5
  64. package/dist/stores/usePauseFutureRequests.d.ts +7 -7
  65. package/dist/stores/usePauseFutureRequests.js +13 -13
  66. package/dist/types/index.d.ts +27 -29
  67. package/package.json +2 -2
  68. package/src/queries/useDeleteRequest.ts +13 -14
  69. package/src/queries/useGetInfiniteRequest.ts +17 -19
  70. package/src/queries/useGetRequest.ts +29 -36
  71. package/src/queries/usePatchRequest.ts +24 -22
  72. package/src/queries/usePostRequest.ts +20 -23
  73. package/src/queries/usePutRequest.ts +19 -22
  74. package/src/request/make-request.ts +2 -2
  75. package/src/request/transformer.ts +1 -1
  76. package/src/types/index.ts +5 -4
@@ -1,21 +1,21 @@
1
- //
2
- const errorTransformer = (data) => {
3
- return {
4
- timeStamp: new Date(),
5
- status: false,
6
- data: data.data,
7
- ...data,
8
- };
9
- };
10
- //
11
- const successTransformer = (data) => {
12
- return {
13
- message: data.message ?? 'Request successful',
14
- statusCode: data.statusCode,
15
- timeStamp: new Date(),
16
- status: true,
17
- data: data.data,
18
- };
1
+ //
2
+ const errorTransformer = (data) => {
3
+ return {
4
+ timeStamp: new Date(),
5
+ data: data.data,
6
+ ...data,
7
+ status: false,
8
+ };
9
+ };
10
+ //
11
+ const successTransformer = (data) => {
12
+ return {
13
+ message: data.message ?? 'Request successful',
14
+ statusCode: data.statusCode,
15
+ timeStamp: new Date(),
16
+ status: true,
17
+ data: data.data,
18
+ };
19
19
  };
20
20
 
21
21
  export { errorTransformer, successTransformer };
@@ -1,2 +1,2 @@
1
- export * from './useHeaderStore';
2
- export * from './usePauseFutureRequests';
1
+ export * from './useHeaderStore';
2
+ export * from './usePauseFutureRequests';
@@ -1,7 +1,7 @@
1
- import type { QueryHeaders } from '../types';
2
- interface IUserHeaders {
3
- headers: QueryHeaders | undefined;
4
- setHeader: (headers: QueryHeaders) => void;
5
- }
6
- export declare const useHeaderStore: import("zustand").UseBoundStore<import("zustand").StoreApi<IUserHeaders>>;
7
- export {};
1
+ import type { QueryHeaders } from '../types';
2
+ interface IUserHeaders {
3
+ headers: QueryHeaders | undefined;
4
+ setHeader: (headers: QueryHeaders) => void;
5
+ }
6
+ export declare const useHeaderStore: import("zustand").UseBoundStore<import("zustand").StoreApi<IUserHeaders>>;
7
+ export {};
@@ -1,10 +1,10 @@
1
1
  import { create } from 'zustand';
2
2
 
3
- const useHeaderStore = create((set) => ({
4
- headers: undefined,
5
- setHeader(headers) {
6
- set({ headers });
7
- },
3
+ const useHeaderStore = create((set) => ({
4
+ headers: undefined,
5
+ setHeader(headers) {
6
+ set({ headers });
7
+ },
8
8
  }));
9
9
 
10
10
  export { useHeaderStore };
@@ -1,7 +1,7 @@
1
- export interface PauseFutureRequest {
2
- isFutureQueriesPaused: boolean;
3
- isFutureMutationsPaused: boolean;
4
- pauseFutureMutation: (status: boolean) => void;
5
- pauseFutureQueries: (status: boolean) => void;
6
- }
7
- export declare const usePauseFutureRequests: import("zustand").UseBoundStore<import("zustand").StoreApi<PauseFutureRequest>>;
1
+ export interface PauseFutureRequest {
2
+ isFutureQueriesPaused: boolean;
3
+ isFutureMutationsPaused: boolean;
4
+ pauseFutureMutation: (status: boolean) => void;
5
+ pauseFutureQueries: (status: boolean) => void;
6
+ }
7
+ export declare const usePauseFutureRequests: import("zustand").UseBoundStore<import("zustand").StoreApi<PauseFutureRequest>>;
@@ -1,18 +1,18 @@
1
1
  import { create } from 'zustand';
2
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
- };
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
16
  });
17
17
 
18
18
  export { usePauseFutureRequests };
@@ -1,29 +1,27 @@
1
- import type { QueryKey } from '@tanstack/react-query';
2
- import type { RawAxiosRequestHeaders } from 'axios';
3
- import type { IMakeRequest } from '../request';
4
- export interface BootstrapConfig {
5
- environments?: {
6
- appBaseUrl: string;
7
- appTimeout: number;
8
- };
9
- context?: ContextType;
10
- modelConfig?: BootstrapModelConfig;
11
- mutationMiddleware?: (mutateRequestConfig?: IMakeRequest & {
12
- mutationKey: QueryKey;
13
- }) => Promise<boolean>;
14
- queryMiddleware?: (queryRequestConfig?: IMakeRequest & {
15
- queryKey: QueryKey;
16
- }) => Promise<boolean>;
17
- }
18
- export interface BootstrapModelConfig {
19
- idColumn: string;
20
- }
21
- export type ContextType = 'app' | 'web' | 'electronjs';
22
- export interface TanstackQueryConfig {
23
- options?: BootstrapConfig;
24
- }
25
- export interface IUseQueryHeaders {
26
- getHeaders: () => QueryHeaders;
27
- setQueryHeaders: (header: QueryHeaders) => void;
28
- }
29
- export type QueryHeaders = RawAxiosRequestHeaders | undefined;
1
+ import type { RawAxiosRequestHeaders } from 'axios';
2
+ import type { IRequestError, IRequestSuccess } from '../request';
3
+ export interface BootstrapConfig {
4
+ environments?: {
5
+ appBaseUrl: string;
6
+ appTimeout: number;
7
+ };
8
+ context?: ContextType;
9
+ modelConfig?: BootstrapModelConfig;
10
+ middleware?: <T = any>(next: () => Promise<IRequestSuccess<T> | IRequestError>, configs?: {
11
+ baseUrl: string;
12
+ path: string;
13
+ body?: Record<string, any>;
14
+ }) => Promise<IRequestError | IRequestSuccess<T>>;
15
+ }
16
+ export interface BootstrapModelConfig {
17
+ idColumn: string;
18
+ }
19
+ export type ContextType = 'app' | 'web' | 'electronjs';
20
+ export interface TanstackQueryConfig {
21
+ options?: BootstrapConfig;
22
+ }
23
+ export interface IUseQueryHeaders {
24
+ getHeaders: () => QueryHeaders;
25
+ setQueryHeaders: (header: QueryHeaders) => void;
26
+ }
27
+ export type QueryHeaders = RawAxiosRequestHeaders | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ventlio/tanstack-query",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "contributors": [
@@ -80,7 +80,7 @@
80
80
  "ts-jest": "^29.1.0",
81
81
  "ts-node": "^10.9.1",
82
82
  "tslib": "^2.5.0",
83
- "typescript": "^4.9.5"
83
+ "typescript": "^5.5.4"
84
84
  },
85
85
  "files": [
86
86
  "dist/**/*",
@@ -33,22 +33,21 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
33
33
  timeout: TIMEOUT,
34
34
  };
35
35
 
36
- let shouldContinue = true;
37
-
38
- if (queryConfigOptions?.queryMiddleware) {
39
- shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
36
+ let deleteResponse: IRequestError | IRequestSuccess<TResponse>;
37
+ if (queryConfigOptions?.middleware) {
38
+ // perform global middleware
39
+ deleteResponse = await queryConfigOptions.middleware(async () => await makeRequest<TResponse>(requestOptions), {
40
+ path: requestUrl,
41
+ baseUrl: baseUrl ?? API_URL,
42
+ });
43
+ } else {
44
+ deleteResponse = await makeRequest<TResponse>(requestOptions);
40
45
  }
41
46
 
42
- if (shouldContinue) {
43
- const postResponse = await makeRequest<TResponse>(requestOptions);
44
-
45
- if (postResponse.status) {
46
- res(postResponse as IRequestSuccess<TResponse>);
47
- } else {
48
- rej(postResponse);
49
- }
47
+ if (deleteResponse.status) {
48
+ res(deleteResponse as IRequestSuccess<TResponse>);
50
49
  } else {
51
- rej(null);
50
+ rej(deleteResponse);
52
51
  }
53
52
  };
54
53
 
@@ -101,5 +100,5 @@ export const useDeleteRequest = <TResponse>(deleteOptions?: DefaultRequestOption
101
100
  // eslint-disable-next-line react-hooks/exhaustive-deps
102
101
  }, [isFutureQueriesPaused]);
103
102
 
104
- return { destroy, ...query, isLoading: query.isLoading || isFutureQueriesPaused };
103
+ return { destroy, ...query, isLoading: (query.isLoading as boolean) || isFutureQueriesPaused };
105
104
  };
@@ -1,4 +1,4 @@
1
- import type { InfiniteData, QueryKey, UseQueryOptions } from '@tanstack/react-query';
1
+ import type { InfiniteData, UseQueryOptions } from '@tanstack/react-query';
2
2
  import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query';
3
3
  import { startTransition, useEffect, useMemo, useState } from 'react';
4
4
  import { useEnvironmentVariables, useQueryConfig } from '../config';
@@ -53,7 +53,6 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
53
53
  | PromiseLike<IRequestError | IRequestSuccess<TResponse & { pagination: Pagination }>>
54
54
  ) => void,
55
55
  rej: (reason?: any) => void,
56
- queryKey: QueryKey,
57
56
  pageParam?: string
58
57
  ) => {
59
58
  if (load) {
@@ -66,25 +65,24 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
66
65
  timeout: TIMEOUT,
67
66
  };
68
67
 
69
- let shouldContinue = true;
70
-
71
- if (queryConfigOptions?.queryMiddleware) {
72
- shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
68
+ let getResponse: IRequestError | IRequestSuccess<TResponse>;
69
+ if (queryConfigOptions?.middleware) {
70
+ // perform global middleware
71
+ getResponse = await queryConfigOptions.middleware(async () => await makeRequest<TResponse>(requestOptions), {
72
+ path,
73
+ baseUrl: baseUrl ?? API_URL,
74
+ });
75
+ } else {
76
+ getResponse = await makeRequest<TResponse>(requestOptions);
73
77
  }
74
78
 
75
- if (shouldContinue) {
76
- const getResponse = await makeRequest<TResponse>(requestOptions);
77
-
78
- if (getResponse.status) {
79
- res(getResponse as IRequestSuccess<TResponse & { pagination: Pagination }>);
80
- } else {
81
- rej(getResponse);
82
- }
79
+ if (getResponse.status) {
80
+ res(getResponse as IRequestSuccess<TResponse & { pagination: Pagination }>);
83
81
  } else {
84
- rej(null);
82
+ rej(getResponse);
85
83
  }
86
84
  } else {
87
- res(null as any);
85
+ rej(null);
88
86
  }
89
87
  };
90
88
 
@@ -112,9 +110,9 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
112
110
 
113
111
  const query = useInfiniteQuery<any, any, InfiniteData<IRequestSuccess<TResponse & { pagination: Pagination }>>>({
114
112
  queryKey: [requestPath, {}],
115
- queryFn: ({ pageParam = requestPath, queryKey }) =>
113
+ queryFn: ({ pageParam = requestPath }) =>
116
114
  new Promise<IRequestSuccess<TResponse & { pagination: Pagination }> | IRequestError>((res, rej) =>
117
- sendRequest(res, rej, queryKey, pageParam as string)
115
+ sendRequest(res, rej, pageParam as string)
118
116
  ),
119
117
  enabled: load && !isFutureQueriesPaused,
120
118
  getNextPageParam: (lastPage) => constructPaginationLink('next_page', lastPage),
@@ -185,6 +183,6 @@ export const useGetInfiniteRequest = <TResponse extends Record<string, any>>({
185
183
  return {
186
184
  get,
187
185
  ...query,
188
- isLoading: query.isLoading || isFutureQueriesPaused,
186
+ isLoading: (query.isLoading as boolean) || isFutureQueriesPaused,
189
187
  };
190
188
  };
@@ -1,12 +1,10 @@
1
- import type { QueryKey, UseQueryOptions } from '@tanstack/react-query';
2
- import { useQuery, useQueryClient } from '@tanstack/react-query';
1
+ import { QueryKey, useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query';
3
2
  import { startTransition, useEffect, useMemo, useState } from 'react';
4
3
  import { useEnvironmentVariables, useQueryConfig } from '../config';
5
4
 
6
- import type { IRequestError, IRequestSuccess } from '../request';
7
- import { makeRequest } from '../request';
5
+ import { IRequestError, IRequestSuccess, makeRequest } from '../request';
8
6
  import { useHeaderStore, usePauseFutureRequests } from '../stores';
9
- import type { DefaultRequestOptions, IPagination, TanstackQueryOption } from './queries.interface';
7
+ import { DefaultRequestOptions, IPagination, TanstackQueryOption } from './queries.interface';
10
8
 
11
9
  export const useGetRequest = <TResponse extends Record<string, any>>({
12
10
  path,
@@ -45,36 +43,31 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
45
43
  rej: (reason?: any) => void,
46
44
  queryKey: QueryKey
47
45
  ) => {
48
- if (load) {
49
- const [url] = queryKey;
50
- const requestUrl = (url ?? requestPath) as string;
51
-
52
- const requestOptions = {
53
- path: requestUrl,
54
- headers: { ...globalHeaders, ...headers },
55
- baseURL: baseUrl ?? API_URL,
56
- timeout: TIMEOUT,
57
- };
58
-
59
- let shouldContinue = true;
60
-
61
- if (queryConfigOptions?.queryMiddleware) {
62
- shouldContinue = await queryConfigOptions.queryMiddleware({ queryKey, ...requestOptions });
63
- }
64
-
65
- if (shouldContinue) {
66
- const getResponse = await makeRequest<TResponse>(requestOptions);
46
+ const [url] = queryKey;
47
+ const requestUrl = (url ?? requestPath) as string;
48
+
49
+ const requestOptions = {
50
+ path: requestUrl,
51
+ headers: { ...globalHeaders, ...headers },
52
+ baseURL: baseUrl ?? API_URL,
53
+ timeout: TIMEOUT,
54
+ };
55
+
56
+ let getResponse: IRequestError | IRequestSuccess<TResponse>;
57
+ if (queryConfigOptions?.middleware) {
58
+ // perform global middleware
59
+ getResponse = await queryConfigOptions.middleware(async () => await makeRequest<TResponse>(requestOptions), {
60
+ path,
61
+ baseUrl: baseUrl ?? API_URL,
62
+ });
63
+ } else {
64
+ getResponse = await makeRequest<TResponse>(requestOptions);
65
+ }
67
66
 
68
- if (getResponse.status) {
69
- res(getResponse as IRequestSuccess<TResponse>);
70
- } else {
71
- rej(getResponse);
72
- }
73
- } else {
74
- rej(null);
75
- }
67
+ if (getResponse.status) {
68
+ res(getResponse as IRequestSuccess<TResponse>);
76
69
  } else {
77
- res(null as any);
70
+ rej(getResponse);
78
71
  }
79
72
  };
80
73
 
@@ -104,7 +97,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
104
97
  }, [keyTracker, requestPath, queryClient, queryOptions?.staleTime]);
105
98
 
106
99
  const nextPage = () => {
107
- if (query.data?.data.pagination) {
100
+ if (query.data.data.pagination) {
108
101
  const pagination: IPagination = query.data.data.pagination;
109
102
  if (pagination.next_page !== pagination.current_page && pagination.next_page > pagination.current_page) {
110
103
  setRequestPath(constructPaginationLink(requestPath, pagination.next_page));
@@ -113,7 +106,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
113
106
  };
114
107
 
115
108
  const prevPage = () => {
116
- if (query.data?.data.pagination) {
109
+ if (query.data.data.pagination) {
117
110
  const pagination: IPagination = query.data.data.pagination;
118
111
  if (pagination.previous_page !== pagination.current_page && pagination.previous_page < pagination.current_page) {
119
112
  setRequestPath(constructPaginationLink(requestPath, pagination.previous_page));
@@ -184,7 +177,7 @@ export const useGetRequest = <TResponse extends Record<string, any>>({
184
177
 
185
178
  return {
186
179
  ...query,
187
- isLoading: query.isLoading || isFutureQueriesPaused,
180
+ isLoading: (query.isLoading as boolean) || isFutureQueriesPaused,
188
181
  setRequestPath,
189
182
  nextPage,
190
183
  prevPage,
@@ -33,32 +33,34 @@ export const usePatchRequest = <TResponse>({ path, baseUrl, headers }: { path: s
33
33
  onUploadProgress,
34
34
  };
35
35
 
36
- let shouldContinue = true;
36
+ let patchResponse: IRequestError | IRequestSuccess<TResponse>;
37
+ if (config.options?.middleware) {
38
+ // perform global middleware
39
+ const middlewareResponse = await config.options.middleware(
40
+ async () => await makeRequest<TResponse>(requestOptions),
41
+ {
42
+ path,
43
+ baseUrl: baseUrl ?? API_URL,
44
+ body: data,
45
+ }
46
+ );
37
47
 
38
- if (config.options?.mutationMiddleware) {
39
- shouldContinue = await config.options.mutationMiddleware({
40
- mutationKey: [path, { type: 'mutation' }],
41
- ...requestOptions,
42
- });
48
+ patchResponse = middlewareResponse;
49
+ } else {
50
+ patchResponse = await makeRequest<TResponse>(requestOptions);
43
51
  }
44
-
45
- if (shouldContinue) {
46
- const patchResponse = await makeRequest<TResponse>(requestOptions);
47
- if (patchResponse.status) {
48
- // scroll to top after success
49
- if (config.options?.context !== 'app') {
50
- scrollToTop();
51
- }
52
- res(patchResponse as IRequestSuccess<TResponse>);
53
- } else {
54
- // scroll to top after error
55
- if (config.options?.context !== 'app') {
56
- scrollToTop();
57
- }
58
- rej(patchResponse);
52
+ if (patchResponse.status) {
53
+ // scroll to top after success
54
+ if (config.options?.context !== 'app') {
55
+ scrollToTop();
59
56
  }
57
+ res(patchResponse as IRequestSuccess<TResponse>);
60
58
  } else {
61
- rej(null);
59
+ // scroll to top after error
60
+ if (config.options?.context !== 'app') {
61
+ scrollToTop();
62
+ }
63
+ rej(patchResponse);
62
64
  }
63
65
  };
64
66
 
@@ -59,34 +59,31 @@ export const usePostRequest = <TResponse>({
59
59
  ...requestConfig,
60
60
  };
61
61
 
62
- let shouldContinue = true;
63
-
64
- if (config.options?.mutationMiddleware) {
65
- shouldContinue = await config.options.mutationMiddleware({
66
- mutationKey: [path, { type: 'mutation' }],
67
- ...requestOptions,
62
+ let postResponse: IRequestError | IRequestSuccess<TResponse>;
63
+ if (config.options?.middleware) {
64
+ // perform global middleware
65
+ postResponse = await config.options.middleware(async () => await makeRequest<TResponse>(requestOptions), {
66
+ path,
67
+ baseUrl: baseUrl ?? API_URL,
68
+ body: data,
68
69
  });
70
+ } else {
71
+ postResponse = await makeRequest<TResponse>(requestOptions);
69
72
  }
70
73
 
71
- if (shouldContinue) {
72
- const postResponse = await makeRequest<TResponse>(requestOptions);
73
-
74
- if (postResponse.status) {
75
- // scroll to top after success
76
-
77
- if (config.options?.context !== 'app') {
78
- scrollToTop();
79
- }
80
- res(postResponse as IRequestSuccess<TResponse>);
81
- } else {
82
- // scroll to top after error
83
- if (config.options?.context !== 'app') {
84
- scrollToTop();
85
- }
86
- rej(postResponse);
74
+ if (postResponse.status) {
75
+ // scroll to top after success
76
+
77
+ if (config.options?.context !== 'app') {
78
+ scrollToTop();
87
79
  }
80
+ res(postResponse as IRequestSuccess<TResponse>);
88
81
  } else {
89
- rej(null);
82
+ // scroll to top after error
83
+ if (config.options?.context !== 'app') {
84
+ scrollToTop();
85
+ }
86
+ rej(postResponse);
90
87
  }
91
88
  };
92
89
 
@@ -33,32 +33,29 @@ export const usePutRequest = <TResponse>({ path, baseUrl, headers }: { path: str
33
33
  onUploadProgress,
34
34
  };
35
35
 
36
- let shouldContinue = true;
37
-
38
- if (config.options?.mutationMiddleware) {
39
- shouldContinue = await config.options.mutationMiddleware({
40
- mutationKey: [path, { type: 'mutation' }],
41
- ...requestOptions,
36
+ let putResponse: IRequestError | IRequestSuccess<TResponse>;
37
+ if (config.options?.middleware) {
38
+ // perform global middleware
39
+ putResponse = await config.options.middleware(async () => await makeRequest<TResponse>(requestOptions), {
40
+ path,
41
+ baseUrl: baseUrl ?? API_URL,
42
+ body: data,
42
43
  });
44
+ } else {
45
+ putResponse = await makeRequest<TResponse>(requestOptions);
43
46
  }
44
-
45
- if (shouldContinue) {
46
- const putResponse = await makeRequest<TResponse>(requestOptions);
47
- if (putResponse.status) {
48
- // scroll to top after success
49
- if (config.options?.context !== 'app') {
50
- scrollToTop();
51
- }
52
- res(putResponse as IRequestSuccess<TResponse>);
53
- } else {
54
- // scroll to top after error
55
- if (config.options?.context !== 'app') {
56
- scrollToTop();
57
- }
58
- rej(putResponse);
47
+ if (putResponse.status) {
48
+ // scroll to top after success
49
+ if (config.options?.context !== 'app') {
50
+ scrollToTop();
59
51
  }
52
+ res(putResponse as IRequestSuccess<TResponse>);
60
53
  } else {
61
- rej(null);
54
+ // scroll to top after error
55
+ if (config.options?.context !== 'app') {
56
+ scrollToTop();
57
+ }
58
+ rej(putResponse);
62
59
  }
63
60
  };
64
61
 
@@ -3,7 +3,7 @@ import axios from 'axios';
3
3
  import { axiosInstance } from './axios-instance';
4
4
 
5
5
  import { ContentType, HttpMethod } from './request.enum';
6
- import type { IMakeRequest } from './request.interface';
6
+ import type { IMakeRequest, IRequestError, IRequestSuccess } from './request.interface';
7
7
  import { errorTransformer, successTransformer } from './transformer';
8
8
 
9
9
  export async function makeRequest<TResponse>({
@@ -16,7 +16,7 @@ export async function makeRequest<TResponse>({
16
16
  timeout,
17
17
  appFileConfig,
18
18
  onUploadProgress,
19
- }: IMakeRequest) {
19
+ }: IMakeRequest): Promise<IRequestSuccess<TResponse> | IRequestError> {
20
20
  // check if file is included in mobile app environment and extract all file input to avoid
21
21
  // it being formatted to object using axios formData builder
22
22
  const isApp = appFileConfig?.isApp;
@@ -4,9 +4,9 @@ import type { IRequestError, IRequestSuccess, IServerRequestError, IServerReques
4
4
  export const errorTransformer = (data: IServerRequestError & { statusCode: number }): IRequestError => {
5
5
  return {
6
6
  timeStamp: new Date(),
7
- status: false,
8
7
  data: data.data,
9
8
  ...data,
9
+ status: false,
10
10
  };
11
11
  };
12
12
 
@@ -1,6 +1,5 @@
1
- import type { QueryKey } from '@tanstack/react-query';
2
1
  import type { RawAxiosRequestHeaders } from 'axios';
3
- import type { IMakeRequest } from '../request';
2
+ import type { IRequestError, IRequestSuccess } from '../request';
4
3
 
5
4
  export interface BootstrapConfig {
6
5
  environments?: {
@@ -9,8 +8,10 @@ export interface BootstrapConfig {
9
8
  };
10
9
  context?: ContextType;
11
10
  modelConfig?: BootstrapModelConfig;
12
- mutationMiddleware?: (mutateRequestConfig?: IMakeRequest & { mutationKey: QueryKey }) => Promise<boolean>;
13
- queryMiddleware?: (queryRequestConfig?: IMakeRequest & { queryKey: QueryKey }) => Promise<boolean>;
11
+ middleware?: <T = any>(
12
+ next: () => Promise<IRequestSuccess<T> | IRequestError>,
13
+ configs?: { baseUrl: string; path: string; body?: Record<string, any> }
14
+ ) => Promise<IRequestError | IRequestSuccess<T>>;
14
15
  }
15
16
 
16
17
  export interface BootstrapModelConfig {