3599 |
stevensc |
1 |
import { useEffect, useState, useCallback, useMemo } from 'react';
|
3511 |
stevensc |
2 |
|
|
|
3 |
import { useFetch } from './useFetch';
|
|
|
4 |
|
3603 |
stevensc |
5 |
/* const paginationResponseExample = {
|
|
|
6 |
success: true,
|
|
|
7 |
data: [
|
|
|
8 |
{
|
|
|
9 |
uuid: 'b18afb55-d40e-4fd9-95a6-324a7f45e57f',
|
|
|
10 |
sender_name: 'Cesa Managment Solution',
|
|
|
11 |
sender_image:
|
|
|
12 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
13 |
sender_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
14 |
receiver_name: 'Santiago Olivera',
|
|
|
15 |
receiver_image:
|
|
|
16 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
17 |
receiver_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
18 |
side: 'right',
|
|
|
19 |
message: '',
|
|
|
20 |
type: 'image',
|
|
|
21 |
filename:
|
|
|
22 |
'https://dev-services.leaderslinked.com/storage/b18afb55-d40e-4fd9-95a6-324a7f45e57f',
|
|
|
23 |
date: 'hace 1 año',
|
|
|
24 |
url_abuse_report:
|
|
|
25 |
'https://dev-services.leaderslinked.com/helpers/abuse-report/message/b18afb55-d40e-4fd9-95a6-324a7f45e57f'
|
|
|
26 |
},
|
|
|
27 |
{
|
|
|
28 |
uuid: 'c3b3c887-9f88-4a36-a7c8-c417f5da80ff',
|
|
|
29 |
sender_name: 'Cesa Managment Solution',
|
|
|
30 |
sender_image:
|
|
|
31 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
32 |
sender_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
33 |
receiver_name: 'Santiago Olivera',
|
|
|
34 |
receiver_image:
|
|
|
35 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
36 |
receiver_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
37 |
side: 'right',
|
|
|
38 |
message: 'Buenas tardes',
|
|
|
39 |
type: 'text',
|
|
|
40 |
filename: '',
|
|
|
41 |
date: 'hace 1 año',
|
|
|
42 |
url_abuse_report:
|
|
|
43 |
'https://dev-services.leaderslinked.com/helpers/abuse-report/message/c3b3c887-9f88-4a36-a7c8-c417f5da80ff'
|
|
|
44 |
},
|
|
|
45 |
{
|
|
|
46 |
uuid: '59120c84-335f-424c-8990-db51ae7bd673',
|
|
|
47 |
sender_name: 'Santiago Olivera',
|
|
|
48 |
sender_image:
|
|
|
49 |
'https://dev-services.leaderslinked.com/storage/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
50 |
sender_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
51 |
receiver_name: 'Cesa Managment Solution',
|
|
|
52 |
receiver_image:
|
|
|
53 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
54 |
receiver_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
55 |
side: 'left',
|
|
|
56 |
message: '',
|
|
|
57 |
type: 'image',
|
|
|
58 |
filename:
|
|
|
59 |
'https://dev-services.leaderslinked.com/storage/59120c84-335f-424c-8990-db51ae7bd673',
|
|
|
60 |
date: 'hace 1 año',
|
|
|
61 |
url_abuse_report: ''
|
|
|
62 |
},
|
|
|
63 |
{
|
|
|
64 |
uuid: '71c1356d-b5dc-413a-8f8e-ed087f99b6e3',
|
|
|
65 |
sender_name: 'Santiago Olivera',
|
|
|
66 |
sender_image:
|
|
|
67 |
'https://dev-services.leaderslinked.com/storage/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
68 |
sender_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
69 |
receiver_name: 'Cesa Managment Solution',
|
|
|
70 |
receiver_image:
|
|
|
71 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
72 |
receiver_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
73 |
side: 'left',
|
|
|
74 |
message: 'buenas tardes',
|
|
|
75 |
type: 'text',
|
|
|
76 |
filename: '',
|
|
|
77 |
date: 'hace 1 año',
|
|
|
78 |
url_abuse_report: ''
|
|
|
79 |
},
|
|
|
80 |
{
|
|
|
81 |
uuid: 'c484b564-3d69-42bf-b6c4-12dfa6230614',
|
|
|
82 |
sender_name: 'Santiago Olivera',
|
|
|
83 |
sender_image:
|
|
|
84 |
'https://dev-services.leaderslinked.com/storage/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
85 |
sender_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
86 |
receiver_name: 'Cesa Managment Solution',
|
|
|
87 |
receiver_image:
|
|
|
88 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
89 |
receiver_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
90 |
side: 'left',
|
|
|
91 |
message: 'Test',
|
|
|
92 |
type: 'text',
|
|
|
93 |
filename: '',
|
|
|
94 |
date: 'hace 1 año',
|
|
|
95 |
url_abuse_report: ''
|
|
|
96 |
},
|
|
|
97 |
{
|
|
|
98 |
uuid: 'f29723fd-dc2a-4b06-8c8e-e0e0cfe36cd1',
|
|
|
99 |
sender_name: 'Cesa Managment Solution',
|
|
|
100 |
sender_image:
|
|
|
101 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
102 |
sender_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
103 |
receiver_name: 'Santiago Olivera',
|
|
|
104 |
receiver_image:
|
|
|
105 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
106 |
receiver_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
107 |
side: 'right',
|
|
|
108 |
message:
|
|
|
109 |
'buenas tardes\r\n\r\nbuenas tardesbuenas tardes\r\n\r\nbuenas tardesbuenas tardes\r\n\r\nbuenas tardesbuenas tardesbuenas tardes',
|
|
|
110 |
type: 'document',
|
|
|
111 |
filename:
|
|
|
112 |
'https://dev-services.leaderslinked.com/storage/f29723fd-dc2a-4b06-8c8e-e0e0cfe36cd1',
|
|
|
113 |
date: 'hace 1 año',
|
|
|
114 |
url_abuse_report:
|
|
|
115 |
'https://dev-services.leaderslinked.com/helpers/abuse-report/message/f29723fd-dc2a-4b06-8c8e-e0e0cfe36cd1'
|
|
|
116 |
},
|
|
|
117 |
{
|
|
|
118 |
uuid: '86453fcf-ac3b-4228-9007-9dbf100976ef',
|
|
|
119 |
sender_name: 'Cesa Managment Solution',
|
|
|
120 |
sender_image:
|
|
|
121 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
122 |
sender_profile: '/profile/view/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
123 |
receiver_name: 'Santiago Olivera',
|
|
|
124 |
receiver_image:
|
|
|
125 |
'https://dev-services.leaderslinked.com/storage/97e43a0a-5a85-4021-8bff-167d60e2a0f2',
|
|
|
126 |
receiver_profile: '/profile/view/e85129fa-18eb-4149-8640-fea9ae916cdc',
|
|
|
127 |
side: 'right',
|
|
|
128 |
message:
|
|
|
129 |
'hola,hola,hola,hola,hola,hola,hola,\r\nhola,hola,hola,\r\n\r\nhola,hola,\r\nhola,hola,hola,\r\n\r\nhola,hola,hola,',
|
|
|
130 |
type: 'image',
|
|
|
131 |
filename:
|
|
|
132 |
'https://dev-services.leaderslinked.com/storage/86453fcf-ac3b-4228-9007-9dbf100976ef',
|
|
|
133 |
date: 'hace 1 año',
|
|
|
134 |
url_abuse_report:
|
|
|
135 |
'https://dev-services.leaderslinked.com/helpers/abuse-report/message/86453fcf-ac3b-4228-9007-9dbf100976ef'
|
|
|
136 |
}
|
|
|
137 |
],
|
|
|
138 |
pagination: {
|
|
|
139 |
pageCount: 1,
|
|
|
140 |
itemCountPerPage: 10,
|
|
|
141 |
first: 1,
|
|
|
142 |
current: 1,
|
|
|
143 |
last: 1,
|
|
|
144 |
pagesInRange: {
|
|
|
145 |
1: 1
|
|
|
146 |
},
|
|
|
147 |
firstPageInRange: 1,
|
|
|
148 |
lastPageInRange: 1,
|
|
|
149 |
currentItemCount: 7,
|
|
|
150 |
totalItemCount: 7,
|
|
|
151 |
firstItemNumber: 1,
|
|
|
152 |
lastItemNumber: 7
|
|
|
153 |
}
|
|
|
154 |
}; */
|
|
|
155 |
|
|
|
156 |
/**
|
|
|
157 |
* Hook optimizado para infinite scroll
|
|
|
158 |
* Maneja la paginación automática al hacer scroll
|
|
|
159 |
*/
|
3530 |
stevensc |
160 |
export function usePagination(
|
|
|
161 |
url,
|
3599 |
stevensc |
162 |
{
|
|
|
163 |
initialPage = 1,
|
3603 |
stevensc |
164 |
initialLimit = 20,
|
3599 |
stevensc |
165 |
initialParams = {},
|
3603 |
stevensc |
166 |
resetOnUrlChange = true,
|
|
|
167 |
autoLoadFirstPage = true
|
3599 |
stevensc |
168 |
} = {}
|
3530 |
stevensc |
169 |
) {
|
3529 |
stevensc |
170 |
const [items, setItems] = useState([]);
|
3511 |
stevensc |
171 |
const [page, setPage] = useState(initialPage);
|
3529 |
stevensc |
172 |
const [totalPages, setTotalPages] = useState(0);
|
3599 |
stevensc |
173 |
const [totalItems, setTotalItems] = useState(0);
|
3511 |
stevensc |
174 |
const [limit, setLimit] = useState(initialLimit);
|
3530 |
stevensc |
175 |
const [params, setParams] = useState({ page, limit, ...initialParams });
|
3511 |
stevensc |
176 |
|
3529 |
stevensc |
177 |
const { data, loading, error, refetch } = useFetch(url, {
|
|
|
178 |
params
|
|
|
179 |
});
|
3511 |
stevensc |
180 |
|
3603 |
stevensc |
181 |
// Memoized pagination state for infinite scroll
|
3599 |
stevensc |
182 |
const paginationState = useMemo(
|
|
|
183 |
() => ({
|
|
|
184 |
page,
|
|
|
185 |
limit,
|
|
|
186 |
totalPages,
|
|
|
187 |
totalItems,
|
|
|
188 |
hasMore: page < totalPages,
|
3603 |
stevensc |
189 |
isLoading: loading,
|
|
|
190 |
error
|
3599 |
stevensc |
191 |
}),
|
3603 |
stevensc |
192 |
[page, limit, totalPages, totalItems, loading, error]
|
3599 |
stevensc |
193 |
);
|
3511 |
stevensc |
194 |
|
3603 |
stevensc |
195 |
// Load next page for infinite scroll
|
3599 |
stevensc |
196 |
const nextPage = useCallback(() => {
|
3603 |
stevensc |
197 |
if (paginationState.hasMore && !loading) {
|
3599 |
stevensc |
198 |
setPage((prevPage) => prevPage + 1);
|
|
|
199 |
}
|
3603 |
stevensc |
200 |
}, [paginationState.hasMore, loading]);
|
3511 |
stevensc |
201 |
|
3603 |
stevensc |
202 |
// Reset pagination when URL changes
|
3599 |
stevensc |
203 |
const resetPagination = useCallback(() => {
|
|
|
204 |
setPage(initialPage);
|
|
|
205 |
setItems([]);
|
|
|
206 |
setTotalPages(0);
|
|
|
207 |
setTotalItems(0);
|
|
|
208 |
}, [initialPage]);
|
|
|
209 |
|
3603 |
stevensc |
210 |
// Update params when page or limit changes
|
|
|
211 |
useEffect(() => {
|
|
|
212 |
setParams((prevParams) => ({
|
|
|
213 |
...prevParams,
|
|
|
214 |
page,
|
|
|
215 |
limit
|
|
|
216 |
}));
|
|
|
217 |
}, [page, limit]);
|
3599 |
stevensc |
218 |
|
3603 |
stevensc |
219 |
// Reset pagination when URL changes (if enabled)
|
3529 |
stevensc |
220 |
useEffect(() => {
|
3603 |
stevensc |
221 |
if (resetOnUrlChange && url) {
|
|
|
222 |
resetPagination();
|
|
|
223 |
}
|
|
|
224 |
}, [url, resetOnUrlChange, resetPagination]);
|
|
|
225 |
|
|
|
226 |
// Handle data updates with infinite scroll logic
|
|
|
227 |
useEffect(() => {
|
3529 |
stevensc |
228 |
if (data) {
|
3599 |
stevensc |
229 |
let newItems = [];
|
|
|
230 |
let pages = 0;
|
|
|
231 |
let items = 0;
|
|
|
232 |
|
|
|
233 |
// Handle different response structures
|
|
|
234 |
if (data?.current?.items) {
|
3603 |
stevensc |
235 |
// Structure: { current: { items: [] }, total: { pages, items } }
|
3599 |
stevensc |
236 |
newItems = data.current.items;
|
|
|
237 |
pages = data.total?.pages || 0;
|
|
|
238 |
items = data.total?.items || 0;
|
|
|
239 |
} else if (data?.data && Array.isArray(data.data)) {
|
|
|
240 |
// Structure: { data: [], pagination: { ... } }
|
|
|
241 |
newItems = data.data;
|
|
|
242 |
pages = data.pagination?.pageCount || data.pagination?.last || 0;
|
|
|
243 |
items = data.pagination?.totalItemCount || 0;
|
|
|
244 |
} else if (Array.isArray(data)) {
|
|
|
245 |
// Structure: direct array
|
|
|
246 |
newItems = data;
|
|
|
247 |
pages = 1;
|
|
|
248 |
items = data.length;
|
|
|
249 |
} else if (data?.items && Array.isArray(data.items)) {
|
|
|
250 |
// Structure: { items: [], pagination: { ... } }
|
|
|
251 |
newItems = data.items;
|
|
|
252 |
pages = data.pagination?.pageCount || data.pagination?.last || 0;
|
|
|
253 |
items = data.pagination?.totalItemCount || 0;
|
|
|
254 |
}
|
|
|
255 |
|
|
|
256 |
setItems((prevItems) => {
|
3603 |
stevensc |
257 |
// For infinite scroll, always append new items
|
|
|
258 |
if (page > 1) {
|
3599 |
stevensc |
259 |
return [...prevItems, ...newItems];
|
|
|
260 |
} else {
|
3603 |
stevensc |
261 |
// First page, replace items
|
3599 |
stevensc |
262 |
return newItems;
|
|
|
263 |
}
|
|
|
264 |
});
|
|
|
265 |
|
|
|
266 |
setTotalPages(pages);
|
|
|
267 |
setTotalItems(items);
|
3529 |
stevensc |
268 |
}
|
3603 |
stevensc |
269 |
}, [data, page]);
|
3529 |
stevensc |
270 |
|
3603 |
stevensc |
271 |
// Auto-load first page if enabled and URL is provided
|
3529 |
stevensc |
272 |
useEffect(() => {
|
3603 |
stevensc |
273 |
if (autoLoadFirstPage && url && page === 1 && items.length === 0) {
|
|
|
274 |
// The useFetch hook will automatically load the data
|
3599 |
stevensc |
275 |
}
|
3603 |
stevensc |
276 |
}, [url, autoLoadFirstPage, page, items.length]);
|
3599 |
stevensc |
277 |
|
3511 |
stevensc |
278 |
return {
|
3599 |
stevensc |
279 |
// Data
|
3529 |
stevensc |
280 |
items,
|
3599 |
stevensc |
281 |
...paginationState,
|
|
|
282 |
|
|
|
283 |
// Actions
|
3511 |
stevensc |
284 |
nextPage,
|
3599 |
stevensc |
285 |
resetPagination,
|
3529 |
stevensc |
286 |
refetch
|
3511 |
stevensc |
287 |
};
|
|
|
288 |
}
|