query-harbor 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +344 -2
- package/dist/query-harbor.es.js +26 -0
- package/dist/query-harbor.umd.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,350 @@
|
|
|
1
1
|
# Query Harbor
|
|
2
2
|
|
|
3
|
-
A React Query
|
|
3
|
+
A collection of custom React hooks built on top of TanStack Query (formerly React Query) for handling API requests, mutations, and cookie management. These hooks provide a standardized way to handle data fetching, caching, and state management in React applications.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Installation](#installation)
|
|
8
|
+
- [Hooks Overview](#hooks-overview)
|
|
9
|
+
- [useGlobalQuery](#useglobalquery)
|
|
10
|
+
- [useGlobalMutation](#useglobalmutation)
|
|
11
|
+
- [useGlobalInfiniteQuery](#useglobalinfinitequery)
|
|
12
|
+
- [useCookie](#usecookie)
|
|
13
|
+
- [Usage Examples](#usage-examples)
|
|
14
|
+
- [API Reference](#api-reference)
|
|
4
15
|
|
|
5
16
|
## Installation
|
|
6
17
|
|
|
7
18
|
```bash
|
|
8
|
-
|
|
19
|
+
# Install required dependencies
|
|
20
|
+
npm install @tanstack/react-query react-cookie axios
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Hooks Overview
|
|
24
|
+
|
|
25
|
+
### useGlobalQuery
|
|
26
|
+
|
|
27
|
+
A custom hook for making standard API requests with built-in caching and state management.
|
|
28
|
+
|
|
29
|
+
#### Features
|
|
30
|
+
- Automatic authentication header handling
|
|
31
|
+
- Configurable cache and stale times
|
|
32
|
+
- Built-in error handling
|
|
33
|
+
- Query invalidation support
|
|
34
|
+
|
|
35
|
+
#### Basic Usage
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
const {
|
|
39
|
+
queryData,
|
|
40
|
+
isLoading,
|
|
41
|
+
isError,
|
|
42
|
+
error,
|
|
43
|
+
refetchQuery
|
|
44
|
+
} = useGlobalQuery({
|
|
45
|
+
url: '/api/users',
|
|
46
|
+
queryKey: ['users'],
|
|
47
|
+
methodType: 'GET'
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### useGlobalMutation
|
|
52
|
+
|
|
53
|
+
A custom hook for handling data mutations (create, update, delete operations) with support for FormData.
|
|
54
|
+
|
|
55
|
+
#### Features
|
|
56
|
+
- FormData support with nested object handling
|
|
57
|
+
- Automatic query invalidation after successful mutation
|
|
58
|
+
- Priority data support
|
|
59
|
+
- Built-in error handling
|
|
60
|
+
|
|
61
|
+
#### Basic Usage
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
const {
|
|
65
|
+
runMutation,
|
|
66
|
+
mutationLoading,
|
|
67
|
+
mutationData,
|
|
68
|
+
mutationError,
|
|
69
|
+
isMutationSucceeded
|
|
70
|
+
} = useGlobalMutation({
|
|
71
|
+
url: '/api/users',
|
|
72
|
+
queriesToInvalidate: ['users'],
|
|
73
|
+
methodType: 'POST',
|
|
74
|
+
data: userData
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### FormData Upload Examples
|
|
79
|
+
|
|
80
|
+
##### Basic FormData Upload
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
const {
|
|
84
|
+
runMutation,
|
|
85
|
+
mutationLoading
|
|
86
|
+
} = useGlobalMutation({
|
|
87
|
+
url: '/api/upload',
|
|
88
|
+
queriesToInvalidate: ['files'],
|
|
89
|
+
methodType: 'POST',
|
|
90
|
+
isFormData: true,
|
|
91
|
+
data: {
|
|
92
|
+
file: fileObject,
|
|
93
|
+
title: 'My Document'
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
##### Complex FormData with Arrays
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// Without excludedIndexKeys
|
|
102
|
+
const data = {
|
|
103
|
+
files: [file1, file2],
|
|
104
|
+
metadata: {
|
|
105
|
+
titles: ['Doc 1', 'Doc 2']
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// This will generate FormData with structure:
|
|
110
|
+
// files[0] = file1
|
|
111
|
+
// files[1] = file2
|
|
112
|
+
// metadata[titles][0] = Doc 1
|
|
113
|
+
// metadata[titles][1] = Doc 2
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
##### Using excludedIndexKeys
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
const MultipleFileUpload = () => {
|
|
120
|
+
const {
|
|
121
|
+
runMutation,
|
|
122
|
+
mutationLoading
|
|
123
|
+
} = useGlobalMutation({
|
|
124
|
+
url: '/api/upload-multiple',
|
|
125
|
+
queriesToInvalidate: ['files'],
|
|
126
|
+
methodType: 'POST',
|
|
127
|
+
isFormData: true,
|
|
128
|
+
// Specify which keys should not include array indices
|
|
129
|
+
excludedIndexKeys: ['files', 'documents'],
|
|
130
|
+
data: {
|
|
131
|
+
files: [file1, file2, file3],
|
|
132
|
+
documents: [docFile1, docFile2],
|
|
133
|
+
metadata: {
|
|
134
|
+
titles: ['Doc 1', 'Doc 2', 'Doc 3'],
|
|
135
|
+
categories: ['Cat 1', 'Cat 2', 'Cat 3']
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<button onClick={() => runMutation()}>
|
|
142
|
+
Upload Files
|
|
143
|
+
</button>
|
|
144
|
+
);
|
|
145
|
+
};
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The above example will generate FormData with the following structure:
|
|
149
|
+
```plaintext
|
|
150
|
+
// Keys with excludedIndexKeys:
|
|
151
|
+
files = file1
|
|
152
|
+
files = file2
|
|
153
|
+
files = file3
|
|
154
|
+
documents = docFile1
|
|
155
|
+
documents = docFile2
|
|
156
|
+
|
|
157
|
+
// Regular array keys (maintain indices):
|
|
158
|
+
metadata[titles][0] = Doc 1
|
|
159
|
+
metadata[titles][1] = Doc 2
|
|
160
|
+
metadata[titles][2] = Doc 3
|
|
161
|
+
metadata[categories][0] = Cat 1
|
|
162
|
+
metadata[categories][1] = Cat 2
|
|
163
|
+
metadata[categories][2] = Cat 3
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
##### Real-World Example: Multiple File Upload with Metadata
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
const DocumentUploadForm = () => {
|
|
170
|
+
const [files, setFiles] = useState([]);
|
|
171
|
+
const [metadata, setMetadata] = useState({
|
|
172
|
+
department: 'HR',
|
|
173
|
+
tags: ['confidential', 'employee'],
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const {
|
|
177
|
+
runMutation,
|
|
178
|
+
mutationLoading,
|
|
179
|
+
isMutationSucceeded
|
|
180
|
+
} = useGlobalMutation({
|
|
181
|
+
url: '/api/documents/upload',
|
|
182
|
+
queriesToInvalidate: ['documents'],
|
|
183
|
+
methodType: 'POST',
|
|
184
|
+
isFormData: true,
|
|
185
|
+
excludedIndexKeys: ['files'], // files will be sent without indices
|
|
186
|
+
data: {
|
|
187
|
+
files: files,
|
|
188
|
+
metadata: metadata,
|
|
189
|
+
timestamp: new Date().toISOString(),
|
|
190
|
+
user: {
|
|
191
|
+
id: currentUserId,
|
|
192
|
+
role: userRole
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
const handleFileChange = (e) => {
|
|
198
|
+
setFiles(Array.from(e.target.files));
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const handleUpload = () => {
|
|
202
|
+
runMutation();
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
return (
|
|
206
|
+
<div>
|
|
207
|
+
<input
|
|
208
|
+
type="file"
|
|
209
|
+
multiple
|
|
210
|
+
onChange={handleFileChange}
|
|
211
|
+
/>
|
|
212
|
+
{mutationLoading ? (
|
|
213
|
+
<p>Uploading...</p>
|
|
214
|
+
) : (
|
|
215
|
+
<button onClick={handleUpload}>
|
|
216
|
+
Upload Documents
|
|
217
|
+
</button>
|
|
218
|
+
)}
|
|
219
|
+
{isMutationSucceeded && (
|
|
220
|
+
<p>Upload completed successfully!</p>
|
|
221
|
+
)}
|
|
222
|
+
</div>
|
|
223
|
+
);
|
|
224
|
+
};
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
This will generate FormData where:
|
|
228
|
+
- Multiple files are sent with the same key name ('files')
|
|
229
|
+
- Metadata is properly nested with array indices preserved
|
|
230
|
+
- Additional data is structured appropriately
|
|
231
|
+
|
|
232
|
+
The resulting FormData structure will be:
|
|
233
|
+
```plaintext
|
|
234
|
+
files = File1
|
|
235
|
+
files = File2
|
|
236
|
+
metadata[department] = HR
|
|
237
|
+
metadata[tags][0] = confidential
|
|
238
|
+
metadata[tags][1] = employee
|
|
239
|
+
timestamp = 2024-02-23T10:00:00.000Z
|
|
240
|
+
user[id] = 123
|
|
241
|
+
user[role] = admin
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
#### When to Use excludedIndexKeys
|
|
245
|
+
|
|
246
|
+
Use `excludedIndexKeys` when:
|
|
247
|
+
1. Working with file upload APIs that expect multiple files with the same key
|
|
248
|
+
2. Dealing with legacy APIs that don't support indexed form fields
|
|
249
|
+
3. Implementing multi-file upload where the server expects a flat structure
|
|
250
|
+
4. Handling file arrays where order doesn't matter
|
|
251
|
+
|
|
252
|
+
### useGlobalInfiniteQuery
|
|
253
|
+
|
|
254
|
+
A custom hook for handling infinite scroll or pagination scenarios.
|
|
255
|
+
|
|
256
|
+
#### Features
|
|
257
|
+
- Automatic pagination handling
|
|
258
|
+
- Built-in cache management
|
|
259
|
+
- Total count tracking
|
|
260
|
+
- Next page detection
|
|
261
|
+
|
|
262
|
+
#### Basic Usage
|
|
263
|
+
|
|
264
|
+
```javascript
|
|
265
|
+
const {
|
|
266
|
+
queryData,
|
|
267
|
+
isLoading,
|
|
268
|
+
isError,
|
|
269
|
+
error,
|
|
270
|
+
fetchNextPage,
|
|
271
|
+
hasNextPage,
|
|
272
|
+
totalCount
|
|
273
|
+
} = useGlobalInfiniteQuery({
|
|
274
|
+
url: '/api/posts',
|
|
275
|
+
queryKey: ['posts'],
|
|
276
|
+
methodType: 'GET',
|
|
277
|
+
data: { limit: 10 }
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### useCookie
|
|
282
|
+
|
|
283
|
+
A utility hook for managing cookies across the application.
|
|
284
|
+
|
|
285
|
+
#### Features
|
|
286
|
+
- Simple cookie management
|
|
287
|
+
- Type-safe cookie operations
|
|
288
|
+
- Easy integration with authentication
|
|
289
|
+
|
|
290
|
+
#### Basic Usage
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
const { cookie, setCookie, removeCookie } = useCookie({
|
|
294
|
+
cookieName: 'accessToken'
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## API Reference
|
|
299
|
+
|
|
300
|
+
### useGlobalQuery Options
|
|
301
|
+
|
|
302
|
+
| Option | Type | Default | Description |
|
|
303
|
+
|--------|------|---------|-------------|
|
|
304
|
+
| url | string | required | API endpoint URL |
|
|
305
|
+
| queryKey | string[] | required | Unique key for caching |
|
|
306
|
+
| methodType | string | required | HTTP method (GET, POST, etc.) |
|
|
307
|
+
| data | object | optional | Request payload |
|
|
308
|
+
| enabled | boolean | true | Whether to enable the query |
|
|
309
|
+
| cacheTime | number | 300000 | Cache duration in ms |
|
|
310
|
+
| staleTime | number | 300000 | Stale data duration in ms |
|
|
311
|
+
|
|
312
|
+
### useGlobalMutation Options
|
|
313
|
+
|
|
314
|
+
| Option | Type | Default | Description |
|
|
315
|
+
|--------|------|---------|-------------|
|
|
316
|
+
| url | string | required | API endpoint URL |
|
|
317
|
+
| queriesToInvalidate | string[] | required | Queries to refresh after mutation |
|
|
318
|
+
| methodType | string | required | HTTP method (POST, PUT, DELETE) |
|
|
319
|
+
| data | object | optional | Default mutation data |
|
|
320
|
+
| isFormData | boolean | false | Whether to handle as FormData |
|
|
321
|
+
| closePopup | function | optional | Callback after success |
|
|
322
|
+
| excludedIndexKeys | string[] | optional | Keys to exclude from FormData indices |
|
|
323
|
+
|
|
324
|
+
### useGlobalInfiniteQuery Options
|
|
325
|
+
|
|
326
|
+
| Option | Type | Default | Description |
|
|
327
|
+
|--------|------|---------|-------------|
|
|
328
|
+
| url | string | required | API endpoint URL |
|
|
329
|
+
| queryKey | string[] | required | Unique key for caching |
|
|
330
|
+
| methodType | string | required | HTTP method |
|
|
331
|
+
| data | object | optional | Additional query parameters |
|
|
332
|
+
| enabled | boolean | true | Whether to enable the query |
|
|
333
|
+
| cacheTime | number | 300000 | Cache duration in ms |
|
|
334
|
+
| staleTime | number | 300000 | Stale data duration in ms |
|
|
335
|
+
|
|
336
|
+
## Best Practices
|
|
337
|
+
|
|
338
|
+
1. Always provide unique and descriptive query keys
|
|
339
|
+
2. Set appropriate cache and stale times based on data volatility
|
|
340
|
+
3. Handle loading and error states in your UI
|
|
341
|
+
4. Use the refetchQuery function for manual data refresh
|
|
342
|
+
5. Implement proper error boundaries in your application
|
|
343
|
+
|
|
344
|
+
## Contributing
|
|
345
|
+
|
|
346
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
347
|
+
|
|
348
|
+
## License
|
|
349
|
+
|
|
350
|
+
MIT
|
package/dist/query-harbor.es.js
CHANGED
|
@@ -110,6 +110,15 @@ const b = ({ cookieName: u }) => {
|
|
|
110
110
|
let t = {};
|
|
111
111
|
e != null && e.accessToken && (t = { Authorization: `Bearer ${e == null ? void 0 : e.accessToken}` });
|
|
112
112
|
const s = S({
|
|
113
|
+
/**
|
|
114
|
+
* Mutation function that processes and sends data to the API.
|
|
115
|
+
* @async
|
|
116
|
+
* @param {Object} params - Mutation parameters.
|
|
117
|
+
* @param {boolean} [params.isPriorityDataAvailable] - Whether to use priority data.
|
|
118
|
+
* @param {*} [params.priorityData] - Priority data to override default data.
|
|
119
|
+
* @returns {Promise<*>} The response data from the API.
|
|
120
|
+
* @throws {Error} If the API request fails.
|
|
121
|
+
*/
|
|
113
122
|
mutationFn: async ({ isPriorityDataAvailable: l, priorityData: P }) => {
|
|
114
123
|
const p = l ? P : c;
|
|
115
124
|
if (y) {
|
|
@@ -164,9 +173,18 @@ const b = ({ cookieName: u }) => {
|
|
|
164
173
|
throw new Error(T || "Something went wrong!");
|
|
165
174
|
}
|
|
166
175
|
},
|
|
176
|
+
/**
|
|
177
|
+
* Callback executed on successful mutation.
|
|
178
|
+
* Invalidates specified queries and closes popup if provided.
|
|
179
|
+
*/
|
|
167
180
|
onSuccess: () => {
|
|
168
181
|
m.invalidateQueries({ queryKey: n }), h && h(!1);
|
|
169
182
|
},
|
|
183
|
+
/**
|
|
184
|
+
* Callback executed on mutation error.
|
|
185
|
+
* @param {Error} error - The error object from the failed mutation.
|
|
186
|
+
* @returns {string} The error message.
|
|
187
|
+
*/
|
|
170
188
|
onError: (l) => (console.log("mutationError", l == null ? void 0 : l.message), l == null ? void 0 : l.message)
|
|
171
189
|
});
|
|
172
190
|
return {
|
|
@@ -222,6 +240,13 @@ const b = ({ cookieName: u }) => {
|
|
|
222
240
|
throw console.error("Query Error:", d), d;
|
|
223
241
|
}
|
|
224
242
|
},
|
|
243
|
+
/**
|
|
244
|
+
* Function to determine the next page parameter for pagination.
|
|
245
|
+
* @param {Object} lastPage - The data from the last fetched page.
|
|
246
|
+
* @param {boolean} lastPage.hasMore - Whether more pages exist.
|
|
247
|
+
* @param {number} [lastPage.nextPage] - The next page number.
|
|
248
|
+
* @returns {number|undefined} The next page parameter or undefined if no more pages.
|
|
249
|
+
*/
|
|
225
250
|
getNextPageParam: (w) => w.hasMore ? w.nextPage : void 0,
|
|
226
251
|
enabled: y,
|
|
227
252
|
cacheTime: h,
|
|
@@ -242,6 +267,7 @@ const b = ({ cookieName: u }) => {
|
|
|
242
267
|
};
|
|
243
268
|
};
|
|
244
269
|
export {
|
|
270
|
+
b as useCookie,
|
|
245
271
|
J as useGlobalInfiniteQuery,
|
|
246
272
|
W as useGlobalMutation,
|
|
247
273
|
U as useGlobalQuery
|
package/dist/query-harbor.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(c,g){typeof exports=="object"&&typeof module<"u"?g(exports,require("@tanstack/react-query"),require("react-cookie"),require("axios")):typeof define=="function"&&define.amd?define(["exports","@tanstack/react-query","react-cookie","axios"],g):(c=typeof globalThis<"u"?globalThis:c||self,g(c.QueryHarbor={},c.ReactQuery,c.ReactCookie,c.axios))})(this,function(c,g,v,I){"use strict";const b=({cookieName:i})=>{const[r,a,u]=v.useCookies([i]);return{cookie:r,setCookie:a,removeCookie:u}},G=({url:i,queryKey:r,methodType:a,data:u,enabled:T=!0,cacheTime:w=3e5,staleTime:C=3e5})=>{const p=g.useQueryClient(),{cookie:e}=b({cookieName:"accessToken"});let t={};e!=null&&e.accessToken&&(t={Authorization:`Bearer ${e==null?void 0:e.accessToken}`});const s=g.useQuery({queryKey:r,queryFn:async()=>{try{const l=await APIHandler({action:a,url:i,data:u,headers:t});return l!=null&&l.data?l.data:{totalCount:0,data:[]}}catch(l){throw console.error("Query Error:",l),l}},enabled:T,cacheTime:w,staleTime:C,refetchOnWindowFocus:!1});return{refetchQuery:()=>{p.invalidateQueries({queryKey:r})},queryData:s.data,isLoading:s.isLoading,isError:s.isError,error:s.error}},j=async({action:i,url:r,data:a,headers:u})=>{switch(i){case"GET":return await I.get(r,{headers:u});case"POST":return await I.post(r,a,{headers:u});case"PUT":return await I.put(r,a,{headers:u});case"DELETE":return await I.delete(r,{data:a,headers:u});default:throw new Error(`Invalid action: ${i}`)}},x=async({action:i,url:r,data:a,headers:u})=>{var T,w,C,p,e;try{const t=await j({action:i,url:r,data:a,headers:u});return t.status>=200&&t.status<=299?{status:!0,data:t.data,message:t.data.message,statusCode:t.status}:{status:!1,error:"API Failed",message:"API Failed",statusCode:t.status}}catch(t){return I.isAxiosError(t)?t.message==="Network Error"?{status:!1,error:"Network Error",message:"Network Error"}:{status:!1,type:(w=(T=t.response)==null?void 0:T.data)==null?void 0:w.type,message:(C=t.response)==null?void 0:C.data.message,error:(p=t.response)==null?void 0:p.data.error,statusCode:(e=t.response)==null?void 0:e.status}:{status:!1,error:"API Failed",message:"API Failed"}}},L=({url:i,queriesToInvalidate:r,methodType:a,data:u,isFormData:T,closePopup:w,excludedIndexKeys:C})=>{var l;const p=g.useQueryClient(),{cookie:e}=b({cookieName:"accessToken"});let t={};e!=null&&e.accessToken&&(t={Authorization:`Bearer ${e==null?void 0:e.accessToken}`});const s=g.useMutation({mutationFn:async({isPriorityDataAvailable:d,priorityData:Q})=>{const k=d?Q:u;if(T){let m=new FormData;const P=(n,o,h="",F={})=>{if(o==null)return;const{excludedIndexKeys:H=[]}=F;Array.isArray(o)?o.forEach((y,q)=>{const $=H.includes(h)?h:h?`${h}[${q}]`:`${q}`;y instanceof File?n==null||n.append($,y):typeof y=="object"&&y!==null?P(n,y,$,F):n==null||n.append($,y)}):typeof o=="object"&&o!==null?o instanceof File?n.append(h,o):Object.keys(o).forEach(y=>{const q=o[y],S=h?`${h}[${y}]`:y;P(n,q,S,F)}):o!==""&&o!==void 0&&o!==null&&(n==null||n.append(h,o))},A={excludedIndexKeys:C};Object.keys(k).forEach(n=>{P(m,k[n],n,A)});const{status:E,message:f,data:N}=await x({action:a,url:i,data:m,headers:t});if(E)return N;throw new Error(f||"Something went wrong!")}else{const{status:m,message:P,data:A}=await x({action:a,url:i,data:k,headers:t});if(m)return A;throw new Error(P||"Something went wrong!")}},onSuccess:()=>{p.invalidateQueries({queryKey:r}),w&&w(!1)},onError:d=>(console.log("mutationError",d==null?void 0:d.message),d==null?void 0:d.message)});return{runMutation:({isPriorityDataAvailable:d,priorityData:Q}={})=>{try{s.mutate({isPriorityDataAvailable:d,priorityData:Q})}catch(k){console.log("Mutation Error: ",k)}},mutationLoading:s.isPending,mutationData:s.data,mutationError:(l=s.error)==null?void 0:l.message,isMutationSucceeded:s.isSuccess}},O=({url:i,queryKey:r,methodType:a,data:u,enabled:T=!0,cacheTime:w=3e5,staleTime:C=3e5})=>{var Q,k,m,P,A;const p=g.useQueryClient(),{cookie:e}=b({cookieName:"accessToken"});let t={};e!=null&&e.accessToken&&(t={Authorization:`Bearer ${e==null?void 0:e.accessToken}`});const s=g.useInfiniteQuery({queryKey:r,queryFn:async({pageParam:E})=>{try{const f=await x({action:a,url:i,data:{...u,page:E},headers:t});if(f!=null&&f.data){const{data:N,page:n,totalPages:o,totalCount:h}=f==null?void 0:f.data,F=n<o;return{data:N,nextPage:F?n+1:void 0,hasMore:F,totalCount:h}}else return{totalCount:0,data:[]}}catch(f){throw console.error("Query Error:",f),f}},getNextPageParam:E=>E.hasMore?E.nextPage:void 0,enabled:T,cacheTime:w,staleTime:C,refetchOnWindowFocus:!1}),M=()=>{p.invalidateQueries({queryKey:r})},l=((k=(Q=s==null?void 0:s.data)==null?void 0:Q.pages)==null?void 0:k.flatMap(E=>E.data))||[],d=((A=(P=(m=s==null?void 0:s.data)==null?void 0:m.pages)==null?void 0:P[0])==null?void 0:A.totalCount)??0;return{refetchQuery:M,queryData:l,isLoading:s.isLoading,isError:s.isError,error:s.error,fetchNextPage:s.fetchNextPage,hasNextPage:s.hasNextPage,totalCount:d}};c.useCookie=b,c.useGlobalInfiniteQuery=O,c.useGlobalMutation=L,c.useGlobalQuery=G,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
|