contentoh-components-library 21.3.16 → 21.3.18

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 (119) hide show
  1. package/.env.development +5 -0
  2. package/dist/assets/images/generalButton/closeIcon.svg +2 -2
  3. package/dist/components/atoms/ProgressBar/index.js +36 -6
  4. package/dist/components/atoms/ProgressBar/styles.js +11 -3
  5. package/dist/components/molecules/CustomSelect/CustomSelect.stories.js +21 -22
  6. package/dist/components/molecules/CustomSelect/SelectItem.js +10 -1
  7. package/dist/components/molecules/HeaderTop/index.js +23 -6
  8. package/dist/components/molecules/HeaderTop/styles.js +1 -1
  9. package/dist/components/molecules/ProductNameHeader/index.js +6 -4
  10. package/dist/components/organisms/FullProductNameHeader/index.js +1 -0
  11. package/dist/components/organisms/RangeCalendar/index.js +4 -3
  12. package/dist/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +65 -50
  13. package/dist/components/pages/ProviderProductEdition/index.js +15 -11
  14. package/dist/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +36 -44
  15. package/dist/components/pages/RetailerProductEdition/index.js +13 -12
  16. package/dist/global-files/data.js +18 -23
  17. package/dist/global-files/fonts.css +6 -0
  18. package/dist/global-files/utils.js +22 -2
  19. package/dist/global-files/variables.js +2 -0
  20. package/dist/index.js +267 -46
  21. package/package.json +12 -1
  22. package/src/assets/images/customSelect/starIcon.svg +14 -0
  23. package/src/assets/images/defaultImages/Spinner.gif +0 -0
  24. package/src/assets/images/defaultImages/notFound.svg +124 -0
  25. package/src/assets/images/generalButton/closeIcon.svg +2 -2
  26. package/src/components/atoms/ButtonFileChooser/ButtonFileChooser.stories.js +47 -0
  27. package/src/components/atoms/ButtonFileChooser/index.js +68 -0
  28. package/src/components/atoms/ButtonFileChooser/styles.js +4 -0
  29. package/src/components/atoms/ButtonV2/ButtonV2.stories.js +53 -0
  30. package/src/components/atoms/ButtonV2/index.js +85 -0
  31. package/src/components/atoms/ButtonV2/styles.js +217 -0
  32. package/src/components/atoms/CustomIcon/CustomIcon.stories.js +36 -0
  33. package/src/components/atoms/CustomIcon/index.js +41 -0
  34. package/src/components/atoms/CustomIcon/styles.js +85 -0
  35. package/src/components/atoms/IconFile/IconFile.stories.js +35 -0
  36. package/src/components/atoms/IconFile/index.js +119 -0
  37. package/src/components/atoms/IconFile/styles.js +67 -0
  38. package/src/components/atoms/Image/Image.stories.js +51 -0
  39. package/src/components/atoms/Image/index.js +55 -0
  40. package/src/components/atoms/Image/styles.js +34 -0
  41. package/src/components/atoms/ImageLink/ImageLink.stories.js +43 -0
  42. package/src/components/atoms/ImageLink/index.js +57 -0
  43. package/src/components/atoms/ImageLink/styles.js +30 -0
  44. package/src/components/atoms/ImagePreview/ImagePreview.stories.js +52 -0
  45. package/src/components/atoms/ImagePreview/index.js +178 -0
  46. package/src/components/atoms/ImagePreview/styles.js +77 -0
  47. package/src/components/atoms/InputText/InputText.stories.js +39 -0
  48. package/src/components/atoms/InputText/index.js +61 -0
  49. package/src/components/atoms/InputText/styles.js +89 -0
  50. package/src/components/atoms/NotFound/NotFound.stories.js +19 -0
  51. package/src/components/atoms/NotFound/index.js +52 -0
  52. package/src/components/atoms/NotFound/styles.js +55 -0
  53. package/src/components/atoms/ProgressBar/index.js +40 -5
  54. package/src/components/atoms/ProgressBar/styles.js +24 -0
  55. package/src/components/atoms/SelectItemV2/SelectItemV2.stories.js +26 -0
  56. package/src/components/atoms/SelectItemV2/index.js +61 -0
  57. package/src/components/atoms/SelectItemV2/styles.js +90 -0
  58. package/src/components/atoms/Tooltip/Tooltip.stories.js +51 -0
  59. package/src/components/atoms/Tooltip/index.js +59 -0
  60. package/src/components/atoms/Tooltip/styles.js +42 -0
  61. package/src/components/molecules/ButtonDownloadFile/DownloadFile.stories.js +54 -0
  62. package/src/components/molecules/ButtonDownloadFile/index.js +109 -0
  63. package/src/components/molecules/ButtonDownloadFile/styles.js +66 -0
  64. package/src/components/molecules/CustomSelect/CustomSelect.stories.js +20 -12
  65. package/src/components/molecules/CustomSelect/SelectItem.js +7 -0
  66. package/src/components/molecules/Dropdown/Dropdown.stories.js +103 -0
  67. package/src/components/molecules/Dropdown/index.js +150 -0
  68. package/src/components/molecules/Dropdown/styles.js +75 -0
  69. package/src/components/molecules/HeaderTop/index.js +29 -8
  70. package/src/components/molecules/HeaderTop/styles.js +4 -0
  71. package/src/components/molecules/ImageTooltip/ImageTooltip.stories.js +68 -0
  72. package/src/components/molecules/ImageTooltip/index.js +63 -0
  73. package/src/components/molecules/ImageTooltip/styles.js +18 -0
  74. package/src/components/molecules/ProductNameHeader/index.js +7 -2
  75. package/src/components/molecules/SelectV2/SelectV2.stories.js +115 -0
  76. package/src/components/molecules/SelectV2/index.js +357 -0
  77. package/src/components/molecules/SelectV2/styles.js +105 -0
  78. package/src/components/molecules/SelectV2/test.js +61 -0
  79. package/src/components/molecules/SelectV2/test.stories.js +10 -0
  80. package/src/components/organisms/Chat/Chat.stories.js +147 -0
  81. package/src/components/organisms/Chat/ChatLists/ChatLists.stories.js +65 -0
  82. package/src/components/organisms/Chat/ChatLists/Rotoplas.jpeg +0 -0
  83. package/src/components/organisms/Chat/ChatLists/THD.png +0 -0
  84. package/src/components/organisms/Chat/ChatLists/index.js +141 -0
  85. package/src/components/organisms/Chat/ChatLists/styles.js +162 -0
  86. package/src/components/organisms/Chat/ContainerItems/ContainerItems.stories.js +142 -0
  87. package/src/components/organisms/Chat/ContainerItems/index.js +512 -0
  88. package/src/components/organisms/Chat/ContainerItems/styles.js +328 -0
  89. package/src/components/organisms/Chat/ContentChat/ContentChat.stories.js +102 -0
  90. package/src/components/organisms/Chat/ContentChat/Rotoplas.jpeg +0 -0
  91. package/src/components/organisms/Chat/ContentChat/THD.png +0 -0
  92. package/src/components/organisms/Chat/ContentChat/index.js +897 -0
  93. package/src/components/organisms/Chat/ContentChat/styles.js +41 -0
  94. package/src/components/organisms/Chat/Footer/Footer.stories.js +22 -0
  95. package/src/components/organisms/Chat/Footer/index.js +661 -0
  96. package/src/components/organisms/Chat/Footer/styles.js +286 -0
  97. package/src/components/organisms/Chat/Header/Header.stories.js +66 -0
  98. package/src/components/organisms/Chat/Header/index.js +94 -0
  99. package/src/components/organisms/Chat/Header/styles.js +49 -0
  100. package/src/components/organisms/Chat/index.js +235 -0
  101. package/src/components/organisms/Chat/styles.js +42 -0
  102. package/src/components/organisms/FullProductNameHeader/index.js +1 -0
  103. package/src/components/organisms/Modal/Modal.stories.js +55 -0
  104. package/src/components/organisms/Modal/index.js +97 -0
  105. package/src/components/organisms/Modal/styles.js +103 -0
  106. package/src/components/organisms/RangeCalendar/RangeCalendar.stories.js +16 -0
  107. package/src/components/organisms/RangeCalendar/index.js +121 -0
  108. package/src/components/organisms/RangeCalendar/styles.js +883 -0
  109. package/src/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +67 -49
  110. package/src/components/pages/ProviderProductEdition/index.js +16 -9
  111. package/src/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +36 -46
  112. package/src/components/pages/RetailerProductEdition/index.js +14 -10
  113. package/src/global-files/data.js +18 -23
  114. package/src/global-files/fonts.css +6 -0
  115. package/src/global-files/handle_http.js +225 -0
  116. package/src/global-files/handle_userTech.js +7 -0
  117. package/src/global-files/utils.js +330 -0
  118. package/src/global-files/variables.js +2 -0
  119. package/src/index.js +17 -0
@@ -0,0 +1,512 @@
1
+ import { Container } from "./styles";
2
+ import { useEffect, useState } from "react";
3
+ import { getProfilePicture } from "../../../../global-files/data";
4
+ import { ImageTooltip } from "../../../molecules/ImageTooltip";
5
+ import {
6
+ decodeJSON,
7
+ getFullDate,
8
+ getImageURL,
9
+ getResizeImgHeight,
10
+ getTime,
11
+ } from "../../../../global-files/utils";
12
+ import {
13
+ faUser as IconUser,
14
+ faImage as IconImage,
15
+ faRedoAlt as IconReload,
16
+ } from "@fortawesome/free-solid-svg-icons";
17
+ import { CustomIcon } from "../../../atoms/CustomIcon";
18
+ import { ButtonV2 } from "../../../atoms/ButtonV2";
19
+ import { ButtonDownloadFile } from "../../../molecules/ButtonDownloadFile";
20
+ import { Modal } from "../../Modal";
21
+ import { Tooltip } from "../../../atoms/Tooltip";
22
+ import { Slide, Zoom } from "@mui/material";
23
+ import { useRef } from "react";
24
+ import { ImagePreview } from "../../../atoms/ImagePreview";
25
+ import { isUserTech } from "../../../../global-files/handle_userTech";
26
+
27
+ export const ContainerItems = (props) => {
28
+ const {
29
+ items /* [
30
+ { id , date , type , value , userId } ,
31
+ ...
32
+ ] */,
33
+ users /* {
34
+ id: { name , companyId } ,
35
+ ...
36
+ } */,
37
+ currentUser, // { id , companyId , ... }
38
+ activeCompanyId, // number
39
+ chatType, // string
40
+ showBtnLoadMore, // boolean
41
+ onClickBtnLoadMore, // () => {}
42
+ } = props;
43
+ const [scrollHeight, setScrollHeight] = useState(0);
44
+ const [btnLoadMoreLoading, setBtnLoadMoreLoading] = useState(false);
45
+ const [customItems, setCustomItems] = useState([]);
46
+ const [modalAlert, setModalAlert] = useState({
47
+ show: false,
48
+ title: "",
49
+ message: "",
50
+ });
51
+ const containerList = useRef(null);
52
+
53
+
54
+ useEffect(() => {
55
+ if (!items) return;
56
+ if (["merchant_product", "order_product"].includes(chatType)) renderItems();
57
+ else if (chatType === "ticket") renderItemsTicket();
58
+ else setCustomItems([]);
59
+ }, [items]);
60
+
61
+ const updateScroll = () => {
62
+ const containerScroll = document.getElementById("containerItems");
63
+ if (containerScroll) {
64
+ const newScrollHeight = containerScroll.scrollHeight + 15;
65
+ const positionScroll = newScrollHeight - scrollHeight;
66
+
67
+ if (newScrollHeight !== scrollHeight) {
68
+ containerScroll.scrollTop = positionScroll;
69
+ setScrollHeight(newScrollHeight);
70
+ }
71
+ }
72
+ };
73
+
74
+ const renderGrayLabel = (text, key) => {
75
+ return (
76
+ <Zoom
77
+ in={true}
78
+ timeout={600}
79
+ container={containerList.current}
80
+ key={key ?? ""}
81
+ >
82
+ <li className={`label-gray`}>
83
+ <div className="separator"></div>
84
+ <label>{text}</label>
85
+ <div className="separator"></div>
86
+ </li>
87
+ </Zoom>
88
+ );
89
+ };
90
+
91
+ const renderStatusService = (text, key) => {
92
+ return (
93
+ <Zoom
94
+ in={true}
95
+ timeout={600}
96
+ container={containerList.current}
97
+ key={key ?? ""}
98
+ >
99
+ <div className="label-statusService">{text}</div>
100
+ </Zoom>
101
+ );
102
+ };
103
+
104
+ const renderStatusArticle = (text, key) => {
105
+ return (
106
+ <Zoom
107
+ in={true}
108
+ timeout={600}
109
+ container={containerList.current}
110
+ key={key ?? ""}
111
+ >
112
+ <div className="label-statusArticle">{text}</div>
113
+ </Zoom>
114
+ );
115
+ };
116
+
117
+ const renderStatusTicket = (item) => {
118
+ return <label className="item-statusTicket">{item.value}</label>;
119
+ };
120
+
121
+ const renderStatusTicketNeutral = (item) => {
122
+ return (
123
+ <Tooltip
124
+ componentTooltip={<label>{users[item.userId].name}</label>}
125
+ className="itemStatus ticket"
126
+ position={"topCenter"}
127
+ addArrow={false}
128
+ transitionType={"zoom"}
129
+ followCursor={false}
130
+ >
131
+ {item.value}
132
+ </Tooltip>
133
+ );
134
+ };
135
+
136
+ const renderMessage = (item) => {
137
+ return <label className="item-message"> {item.value} </label>;
138
+ };
139
+
140
+ const renderComment = (item) => {
141
+ return <label className="item-comment"> {item.value} </label>;
142
+ };
143
+
144
+ const renderImg = (item) => {
145
+ const value = decodeJSON(item.value);
146
+ const originalImgURL = `${process.env.REACT_APP_IMAGES_ENDPOINT}/${value.key}`;
147
+ // dimensiones de la imagen a mostrar en el chat
148
+ const imgHeight = getResizeImgHeight(
149
+ value.width ?? 400,
150
+ value.height ?? 400,
151
+ 400
152
+ );
153
+ const imgURL = getImageURL(
154
+ process.env.REACT_APP_IMAGES_BUCKET,
155
+ value.key,
156
+ 400,
157
+ imgHeight
158
+ );
159
+ // dimensiones de la imagen a mostrar en modal full
160
+ const modalImgHeight = getResizeImgHeight(
161
+ value.width ?? screen.width,
162
+ value.height ?? screen.height,
163
+ screen.width
164
+ );
165
+ const modalImgURL = getImageURL(
166
+ process.env.REACT_APP_IMAGES_BUCKET,
167
+ value.key,
168
+ screen.width,
169
+ modalImgHeight
170
+ );
171
+
172
+ return (
173
+ <div className="item-img">
174
+ <ImagePreview
175
+ className="container-ImagePreview"
176
+ width={"100%"}
177
+ sizeLoading={35}
178
+ colorLoading={undefined}
179
+ imgURL={imgURL}
180
+ modalImgURL={modalImgURL}
181
+ downloadImgURL={originalImgURL}
182
+ imageName={value.name}
183
+ showButtonDownload={true}
184
+ componentDefault={
185
+ <Tooltip
186
+ componentTooltip={<label>{value.name}</label>}
187
+ className="label-nameImg"
188
+ position={"topCenter"}
189
+ addArrow={false}
190
+ transitionType={"zoom"}
191
+ followCursor={false}
192
+ >
193
+ <CustomIcon
194
+ className="iconDefaultImg"
195
+ type={"white"}
196
+ size={60}
197
+ borderType={"rectangle"}
198
+ icon={IconImage}
199
+ />
200
+ </Tooltip>
201
+ }
202
+ componentDefaultModal={
203
+ <Tooltip
204
+ componentTooltip={<label>{value.name}</label>}
205
+ className="label-nameImgModal"
206
+ position={"topCenter"}
207
+ addArrow={false}
208
+ transitionType={"zoom"}
209
+ followCursor={false}
210
+ >
211
+ <CustomIcon
212
+ className="iconDefaultImgModal"
213
+ type={"white"}
214
+ size={100}
215
+ borderType={"rectangle"}
216
+ icon={IconImage}
217
+ />
218
+ </Tooltip>
219
+ }
220
+ />
221
+ </div>
222
+ );
223
+ /*
224
+ <Tooltip
225
+ componentTooltip={<label>{value.name}</label>}
226
+ className="label-nameFileShort"
227
+ position={"topCenter"}
228
+ addArrow={false}
229
+ transitionType={"zoom"}
230
+ followCursor={false}
231
+ >
232
+ {value.name}
233
+ </Tooltip>
234
+ */
235
+ };
236
+
237
+ const renderFile = (item, ownMessage) => {
238
+ const value = decodeJSON(item.value);
239
+ const url = `${process.env.REACT_APP_IMAGES_ENDPOINT}/${value.key}`;
240
+
241
+ return (
242
+ <div className="item-file">
243
+ <ButtonDownloadFile
244
+ className="btnDownloadFileItem"
245
+ size={22}
246
+ type={ownMessage ? "black" : "white"}
247
+ transparent
248
+ url={url}
249
+ onDownload={(error) => {
250
+ error &&
251
+ setModalAlert((prev) => ({
252
+ show: true,
253
+ title: error.message,
254
+ message: error.details,
255
+ }));
256
+ }}
257
+ />
258
+ <Tooltip
259
+ componentTooltip={<label>{value.name}</label>}
260
+ className="label-nameFileShort"
261
+ position={"topCenter"}
262
+ addArrow={false}
263
+ transitionType={"zoom"}
264
+ followCursor={false}
265
+ >
266
+ {value.name}
267
+ </Tooltip>
268
+ </div>
269
+ );
270
+ };
271
+
272
+ const getUserCreatedItem = (ownMessage, item, lastUserId) => {
273
+ return (
274
+ <Slide
275
+ id={"itemScroll"}
276
+ direction={ownMessage ? "left" : "right"}
277
+ in={true}
278
+ timeout={500}
279
+ container={containerList.current}
280
+ key={"item-" + item.id}
281
+ >
282
+ <li
283
+ className={
284
+ (ownMessage ? "own-message " : "") +
285
+ (lastUserId === item.userId ? "sameUser" : "")
286
+ }
287
+ >
288
+ {/* img del user */}
289
+ {lastUserId !== item.userId && (
290
+ <ImageTooltip
291
+ className={"container-imgUser"}
292
+ sizeLoading={25}
293
+ colorLoading={undefined}
294
+ src={getProfilePicture(item.userId, 34, 34)}
295
+ componentDefault={
296
+ <CustomIcon
297
+ className="icon-imgUser"
298
+ type={"whiteS2"}
299
+ size={17}
300
+ borderType={"circle"}
301
+ icon={IconUser}
302
+ />
303
+ }
304
+ classNameTooltip={"tooltip-imgUser"}
305
+ componentTooltip={
306
+ <label className="label-nameUser">
307
+ {users[item.userId].name}
308
+ </label>
309
+ }
310
+ />
311
+ )}
312
+
313
+ {item.type === "message"
314
+ ? renderMessage(item)
315
+ : item.type === "comment"
316
+ ? renderComment(item)
317
+ : item.type === "img"
318
+ ? renderImg(item)
319
+ : item.type === "file"
320
+ ? renderFile(item, ownMessage)
321
+ : item.type === "statusTicket"
322
+ ? renderStatusTicket(item)
323
+ : null}
324
+
325
+ <label className="label-time">{getTime(item.date)}</label>
326
+ </li>
327
+ </Slide>
328
+ );
329
+ };
330
+
331
+ const getItemNeutral = (item) => {
332
+ return (
333
+ <Zoom
334
+ in={true}
335
+ timeout={600}
336
+ container={containerList.current}
337
+ key={"item-" + item.id}
338
+ >
339
+ <li className={"itemNeutral"}>
340
+ {item.type === "statusTicket"
341
+ ? renderStatusTicketNeutral(item)
342
+ : null}
343
+ </li>
344
+ </Zoom>
345
+ );
346
+ };
347
+
348
+ const renderItems = () => {
349
+ let jsxItems = [];
350
+ let date = undefined;
351
+ let countDate = 1;
352
+ for (const item of items) {
353
+ // manejo de las etiquetas fechas
354
+ if (!date) {
355
+ date = getFullDate(new Date(item.date));
356
+ jsxItems.push(renderGrayLabel(date, `itemDate-${countDate++}`));
357
+ } else {
358
+ let newDate = getFullDate(new Date(item.date));
359
+ if (newDate !== date) {
360
+ jsxItems.push(renderGrayLabel(newDate, `itemDate-${countDate++}`));
361
+ date = newDate;
362
+ }
363
+ }
364
+
365
+ // elementos que van alineados al centro
366
+ switch (item.type) {
367
+ case "statusArticle":
368
+ jsxItems.push(renderStatusArticle(item.value, `item-${item.id}`));
369
+ break;
370
+ case "statusService":
371
+ jsxItems.push(renderStatusService(item.value, `item-${item.id}`));
372
+ break;
373
+ }
374
+
375
+ // acomodo del item (left o right)
376
+ let ownMessage = false;
377
+ // CHAT MERCHANT ARTICLE
378
+ if (chatType === "merchant_product") {
379
+ if (currentUser.companyId === users[item.userId].companyId) {
380
+ ownMessage = true;
381
+ }
382
+ }
383
+ // CHAT ORDER ARTICLE
384
+ else if (chatType === "order_product") {
385
+ if (currentUser.companyId === users[item.userId].companyId) {
386
+ if (activeCompanyId && activeCompanyId === currentUser.companyId) {
387
+ if (item.userId === currentUser.id) {
388
+ ownMessage = true;
389
+ }
390
+ } else {
391
+ ownMessage = true;
392
+ }
393
+ }
394
+ }
395
+
396
+ // renderizar tipo de item
397
+ jsxItems.push(getUserCreatedItem(ownMessage, item));
398
+ }
399
+ setCustomItems(jsxItems);
400
+ };
401
+
402
+ const renderItemsTicket = () => {
403
+ let jsxItems = [];
404
+ let date = undefined;
405
+ let countDate = 1;
406
+ let lastUserId = undefined;
407
+
408
+
409
+ // recorrido de los items (del mas viejo al mas reciente)
410
+ for (let index = items.length - 1; index >= 0; index--) {
411
+ const item = items[index];
412
+ // manejo de las etiquetas fechas
413
+ if (!date) {
414
+ date = getFullDate(new Date(item.date));
415
+ jsxItems.push(renderGrayLabel(date, `itemDate-${countDate++}`));
416
+ lastUserId = undefined;
417
+ } else {
418
+ let newDate = getFullDate(new Date(item.date));
419
+ if (newDate !== date) {
420
+ jsxItems.push(renderGrayLabel(newDate, `itemDate-${countDate++}`));
421
+ date = newDate;
422
+ lastUserId = undefined;
423
+ }
424
+ }
425
+
426
+ // elementos que van alineados al centro
427
+ /*
428
+ switch (item.type) {
429
+ case "statusTicket":
430
+ jsxItems.push(getItemNeutral(item));
431
+ lastUserId = undefined;
432
+ continue;
433
+ }
434
+ */
435
+
436
+ // acomodo del item (left o right)
437
+ let ownMessage = false;
438
+ // user tech
439
+ if (currentUser.isUserTech) {
440
+ if (isUserTech(users[item.userId].isUserTech)) ownMessage = true;
441
+ }
442
+ // user normal
443
+ else {
444
+ if (!isUserTech(users[item.userId].isUserTech)) {
445
+ if (currentUser.companyId === users[item.userId].companyId) {
446
+ ownMessage = true;
447
+ }
448
+ } else if (currentUser.id === item.userId) {
449
+ ownMessage = true;
450
+ }
451
+ }
452
+
453
+ // renderizar tipo de item
454
+ jsxItems.push(getUserCreatedItem(ownMessage, item, lastUserId));
455
+ lastUserId = item.userId;
456
+ }
457
+
458
+ setCustomItems(jsxItems);
459
+ };
460
+
461
+ return (
462
+ <>
463
+ <Container id={"containerItems"}>
464
+ <div className="btn-loadMore">
465
+ {showBtnLoadMore && (
466
+ <ButtonV2
467
+ className="container-btnLoadMore"
468
+ type={"purple"}
469
+ label={"cargar más"}
470
+ size={10}
471
+ borderType="oval"
472
+ icon={IconReload}
473
+ iconPosition="start"
474
+ isLoading={btnLoadMoreLoading}
475
+ onClick={async (event) => {
476
+ setBtnLoadMoreLoading(true);
477
+ if (onClickBtnLoadMore) {
478
+ const responseError = await onClickBtnLoadMore();
479
+ if (responseError) {
480
+ setModalAlert({
481
+ show: true,
482
+ title: responseError.title,
483
+ message: responseError.message,
484
+ });
485
+ }
486
+ }
487
+ setBtnLoadMoreLoading(false);
488
+ }}
489
+ />
490
+ )}
491
+ </div>
492
+
493
+ <ul id="ulItems" ref={containerList}>
494
+ {customItems}
495
+ </ul>
496
+ </Container>
497
+
498
+ <Modal
499
+ show={modalAlert.show}
500
+ title={modalAlert.title}
501
+ message={modalAlert.message}
502
+ icon={"info"}
503
+ onClickBtnDefault={(event) =>
504
+ setModalAlert((prev) => ({
505
+ ...prev,
506
+ show: false,
507
+ }))
508
+ }
509
+ />
510
+ </>
511
+ );
512
+ };