contentoh-components-library 21.2.105 → 21.2.106

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 (192) hide show
  1. package/.env.development +5 -2
  2. package/.env.production +25 -25
  3. package/dist/assets/images/customSelect/starIcon.svg +14 -0
  4. package/dist/assets/images/defaultImages/Spinner.gif +0 -0
  5. package/dist/assets/images/defaultImages/notFound.svg +124 -0
  6. package/dist/components/atoms/ButtonFileChooser/ButtonFileChooser.stories.js +72 -0
  7. package/dist/components/atoms/ButtonFileChooser/index.js +118 -0
  8. package/dist/components/atoms/ButtonFileChooser/styles.js +20 -0
  9. package/dist/components/atoms/ButtonV2/ButtonV2.stories.js +66 -0
  10. package/dist/components/atoms/ButtonV2/index.js +110 -0
  11. package/dist/components/atoms/ButtonV2/styles.js +53 -0
  12. package/dist/components/atoms/CustomIcon/CustomIcon.stories.js +50 -0
  13. package/dist/components/atoms/CustomIcon/index.js +40 -0
  14. package/dist/components/atoms/CustomIcon/styles.js +33 -0
  15. package/dist/components/atoms/GeneralButton/index.js +2 -6
  16. package/dist/components/atoms/IconFile/IconFile.stories.js +48 -0
  17. package/dist/components/atoms/IconFile/index.js +249 -0
  18. package/dist/components/atoms/IconFile/styles.js +23 -0
  19. package/dist/components/atoms/Image/Image.stories.js +73 -0
  20. package/dist/components/atoms/Image/index.js +76 -0
  21. package/dist/components/atoms/Image/styles.js +43 -0
  22. package/dist/components/atoms/ImageLink/ImageLink.stories.js +63 -0
  23. package/dist/components/atoms/ImageLink/index.js +77 -0
  24. package/dist/components/atoms/ImageLink/styles.js +40 -0
  25. package/dist/components/atoms/ImagePreview/ImagePreview.stories.js +70 -0
  26. package/dist/components/atoms/ImagePreview/index.js +222 -0
  27. package/dist/components/atoms/ImagePreview/styles.js +44 -0
  28. package/dist/components/atoms/InputText/InputText.stories.js +60 -0
  29. package/dist/components/atoms/InputText/index.js +66 -0
  30. package/dist/components/atoms/InputText/styles.js +32 -0
  31. package/dist/components/atoms/NotFound/NotFound.stories.js +36 -0
  32. package/dist/components/atoms/NotFound/index.js +75 -0
  33. package/dist/components/atoms/NotFound/styles.js +20 -0
  34. package/dist/components/atoms/Select/VersionSelect.js +1 -2
  35. package/dist/components/atoms/SelectItemV2/SelectItemV2.stories.js +45 -0
  36. package/dist/components/atoms/SelectItemV2/index.js +57 -0
  37. package/dist/components/atoms/SelectItemV2/styles.js +30 -0
  38. package/dist/components/atoms/Tooltip/Tooltip.stories.js +66 -0
  39. package/dist/components/atoms/Tooltip/index.js +72 -0
  40. package/dist/components/atoms/Tooltip/styles.js +20 -0
  41. package/dist/components/molecules/ButtonDownloadFile/DownloadFile.stories.js +66 -0
  42. package/dist/components/molecules/ButtonDownloadFile/index.js +179 -0
  43. package/dist/components/molecules/ButtonDownloadFile/styles.js +23 -0
  44. package/dist/components/molecules/CustomSelect/CustomSelect.stories.js +21 -22
  45. package/dist/components/molecules/CustomSelect/SelectItem.js +10 -1
  46. package/dist/components/molecules/Dropdown/Dropdown.stories.js +98 -0
  47. package/dist/components/molecules/Dropdown/index.js +150 -0
  48. package/dist/components/molecules/Dropdown/styles.js +26 -0
  49. package/dist/components/molecules/HeaderTop/index.js +10 -5
  50. package/dist/components/molecules/HeaderTop/styles.js +1 -1
  51. package/dist/components/molecules/ImageTooltip/ImageTooltip.stories.js +82 -0
  52. package/dist/components/molecules/ImageTooltip/index.js +85 -0
  53. package/dist/components/molecules/ImageTooltip/styles.js +33 -0
  54. package/dist/components/molecules/SelectV2/SelectV2.stories.js +119 -0
  55. package/dist/components/molecules/SelectV2/index.js +298 -0
  56. package/dist/components/molecules/SelectV2/styles.js +42 -0
  57. package/dist/components/organisms/Chat/Chat.stories.js +215 -0
  58. package/dist/components/organisms/Chat/ChatLists/ChatLists.stories.js +83 -0
  59. package/dist/components/organisms/Chat/ChatLists/index.js +160 -0
  60. package/dist/components/organisms/Chat/ChatLists/styles.js +29 -0
  61. package/dist/components/organisms/Chat/ContainerItems/ContainerItems.stories.js +176 -0
  62. package/dist/components/organisms/Chat/ContainerItems/index.js +569 -0
  63. package/dist/components/organisms/Chat/ContainerItems/styles.js +20 -0
  64. package/dist/components/organisms/Chat/ContentChat/ContentChat.stories.js +142 -0
  65. package/dist/components/organisms/Chat/ContentChat/index.js +1422 -0
  66. package/dist/components/organisms/Chat/ContentChat/styles.js +20 -0
  67. package/dist/components/organisms/Chat/Footer/Footer.stories.js +43 -0
  68. package/dist/components/organisms/Chat/Footer/index.js +984 -0
  69. package/dist/components/organisms/Chat/Footer/styles.js +32 -0
  70. package/dist/components/organisms/Chat/Header/Header.stories.js +96 -0
  71. package/dist/components/organisms/Chat/Header/index.js +84 -0
  72. package/dist/components/organisms/Chat/Header/styles.js +20 -0
  73. package/dist/components/organisms/Chat/index.js +327 -0
  74. package/dist/components/organisms/Chat/styles.js +29 -0
  75. package/dist/components/organisms/CreateVersion/RenderChilds.js +11 -11
  76. package/dist/components/organisms/CreateVersion/index.js +89 -30
  77. package/dist/components/organisms/Modal/Modal.stories.js +66 -0
  78. package/dist/components/organisms/Modal/index.js +95 -0
  79. package/dist/components/organisms/Modal/styles.js +20 -0
  80. package/dist/components/organisms/OrderDetail/OrderDetail.stories.js +1 -1
  81. package/dist/components/organisms/OrderDetail/index.js +11 -20
  82. package/dist/components/organisms/OrderDetail/styles.js +1 -1
  83. package/dist/components/organisms/OrderDetail/utils/Table/styles.js +1 -1
  84. package/dist/components/organisms/OrderDetail/utils/Table/utils.js +15 -45
  85. package/dist/components/organisms/VersionSelector/index.js +2 -28
  86. package/dist/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +147 -69
  87. package/dist/components/pages/ProviderProductEdition/index.js +22 -2
  88. package/dist/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +67 -77
  89. package/dist/components/pages/RetailerProductEdition/index.js +24 -5
  90. package/dist/global-files/fonts.css +12 -0
  91. package/dist/global-files/handle_http.js +383 -0
  92. package/dist/global-files/utils.js +472 -0
  93. package/dist/global-files/variables.js +2 -0
  94. package/dist/index.js +254 -46
  95. package/package.json +12 -1
  96. package/src/assets/images/customSelect/starIcon.svg +14 -0
  97. package/src/assets/images/defaultImages/Spinner.gif +0 -0
  98. package/src/assets/images/defaultImages/notFound.svg +124 -0
  99. package/src/components/atoms/ButtonFileChooser/ButtonFileChooser.stories.js +47 -0
  100. package/src/components/atoms/ButtonFileChooser/index.js +69 -0
  101. package/src/components/atoms/ButtonFileChooser/styles.js +4 -0
  102. package/src/components/atoms/ButtonV2/ButtonV2.stories.js +53 -0
  103. package/src/components/atoms/ButtonV2/index.js +85 -0
  104. package/src/components/atoms/ButtonV2/styles.js +217 -0
  105. package/src/components/atoms/CustomIcon/CustomIcon.stories.js +36 -0
  106. package/src/components/atoms/CustomIcon/index.js +41 -0
  107. package/src/components/atoms/CustomIcon/styles.js +85 -0
  108. package/src/components/atoms/GeneralButton/index.js +1 -4
  109. package/src/components/atoms/IconFile/IconFile.stories.js +35 -0
  110. package/src/components/atoms/IconFile/index.js +119 -0
  111. package/src/components/atoms/IconFile/styles.js +67 -0
  112. package/src/components/atoms/Image/Image.stories.js +51 -0
  113. package/src/components/atoms/Image/index.js +55 -0
  114. package/src/components/atoms/Image/styles.js +34 -0
  115. package/src/components/atoms/ImageLink/ImageLink.stories.js +43 -0
  116. package/src/components/atoms/ImageLink/index.js +57 -0
  117. package/src/components/atoms/ImageLink/styles.js +30 -0
  118. package/src/components/atoms/ImagePreview/ImagePreview.stories.js +52 -0
  119. package/src/components/atoms/ImagePreview/index.js +191 -0
  120. package/src/components/atoms/ImagePreview/styles.js +77 -0
  121. package/src/components/atoms/InputText/InputText.stories.js +39 -0
  122. package/src/components/atoms/InputText/index.js +61 -0
  123. package/src/components/atoms/InputText/styles.js +89 -0
  124. package/src/components/atoms/NotFound/NotFound.stories.js +19 -0
  125. package/src/components/atoms/NotFound/index.js +52 -0
  126. package/src/components/atoms/NotFound/styles.js +55 -0
  127. package/src/components/atoms/Select/VersionSelect.js +2 -4
  128. package/src/components/atoms/SelectItemV2/SelectItemV2.stories.js +26 -0
  129. package/src/components/atoms/SelectItemV2/index.js +61 -0
  130. package/src/components/atoms/SelectItemV2/styles.js +90 -0
  131. package/src/components/atoms/Tooltip/Tooltip.stories.js +51 -0
  132. package/src/components/atoms/Tooltip/index.js +59 -0
  133. package/src/components/atoms/Tooltip/styles.js +42 -0
  134. package/src/components/molecules/ButtonDownloadFile/DownloadFile.stories.js +54 -0
  135. package/src/components/molecules/ButtonDownloadFile/index.js +111 -0
  136. package/src/components/molecules/ButtonDownloadFile/styles.js +66 -0
  137. package/src/components/molecules/CustomSelect/CustomSelect.stories.js +20 -12
  138. package/src/components/molecules/CustomSelect/SelectItem.js +7 -0
  139. package/src/components/molecules/Dropdown/Dropdown.stories.js +103 -0
  140. package/src/components/molecules/Dropdown/index.js +150 -0
  141. package/src/components/molecules/Dropdown/styles.js +75 -0
  142. package/src/components/molecules/HeaderTop/index.js +11 -6
  143. package/src/components/molecules/HeaderTop/styles.js +4 -0
  144. package/src/components/molecules/ImageTooltip/ImageTooltip.stories.js +68 -0
  145. package/src/components/molecules/ImageTooltip/index.js +63 -0
  146. package/src/components/molecules/ImageTooltip/styles.js +18 -0
  147. package/src/components/molecules/SelectV2/SelectV2.stories.js +114 -0
  148. package/src/components/molecules/SelectV2/index.js +335 -0
  149. package/src/components/molecules/SelectV2/styles.js +105 -0
  150. package/src/components/organisms/Chat/Chat.stories.js +199 -0
  151. package/src/components/organisms/Chat/ChatLists/ChatLists.stories.js +65 -0
  152. package/src/components/organisms/Chat/ChatLists/Rotoplas.jpeg +0 -0
  153. package/src/components/organisms/Chat/ChatLists/THD.png +0 -0
  154. package/src/components/organisms/Chat/ChatLists/index.js +141 -0
  155. package/src/components/organisms/Chat/ChatLists/styles.js +162 -0
  156. package/src/components/organisms/Chat/ContainerItems/ContainerItems.stories.js +142 -0
  157. package/src/components/organisms/Chat/ContainerItems/index.js +549 -0
  158. package/src/components/organisms/Chat/ContainerItems/styles.js +328 -0
  159. package/src/components/organisms/Chat/ContentChat/ContentChat.stories.js +102 -0
  160. package/src/components/organisms/Chat/ContentChat/Rotoplas.jpeg +0 -0
  161. package/src/components/organisms/Chat/ContentChat/THD.png +0 -0
  162. package/src/components/organisms/Chat/ContentChat/index.js +900 -0
  163. package/src/components/organisms/Chat/ContentChat/styles.js +41 -0
  164. package/src/components/organisms/Chat/Footer/Footer.stories.js +22 -0
  165. package/src/components/organisms/Chat/Footer/index.js +669 -0
  166. package/src/components/organisms/Chat/Footer/styles.js +286 -0
  167. package/src/components/organisms/Chat/Header/Header.stories.js +66 -0
  168. package/src/components/organisms/Chat/Header/index.js +94 -0
  169. package/src/components/organisms/Chat/Header/styles.js +49 -0
  170. package/src/components/organisms/Chat/index.js +294 -0
  171. package/src/components/organisms/Chat/styles.js +42 -0
  172. package/src/components/organisms/CreateVersion/RenderChilds.js +34 -28
  173. package/src/components/organisms/CreateVersion/index.js +36 -16
  174. package/src/components/organisms/Modal/Modal.stories.js +55 -0
  175. package/src/components/organisms/Modal/index.js +97 -0
  176. package/src/components/organisms/Modal/styles.js +103 -0
  177. package/src/components/organisms/OrderDetail/OrderDetail.stories.js +1 -1
  178. package/src/components/organisms/OrderDetail/index.js +12 -19
  179. package/src/components/organisms/OrderDetail/styles.js +0 -1
  180. package/src/components/organisms/OrderDetail/utils/Table/styles.js +0 -26
  181. package/src/components/organisms/OrderDetail/utils/Table/utils.js +15 -30
  182. package/src/components/organisms/VersionSelector/index.js +3 -18
  183. package/src/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +166 -75
  184. package/src/components/pages/ProviderProductEdition/index.js +21 -2
  185. package/src/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +67 -79
  186. package/src/components/pages/RetailerProductEdition/index.js +14 -2
  187. package/src/global-files/customHooks.js +2 -2
  188. package/src/global-files/fonts.css +12 -0
  189. package/src/global-files/handle_http.js +231 -0
  190. package/src/global-files/utils.js +300 -0
  191. package/src/global-files/variables.js +2 -0
  192. package/src/index.js +16 -0
@@ -0,0 +1,669 @@
1
+ import {
2
+ Container,
3
+ ContainerItemCarrousel,
4
+ ContainerMain,
5
+ ContainerSecondary,
6
+ ContainerTooltipFileName,
7
+ } from "./styles";
8
+ import { useEffect, useState, useRef } from "react";
9
+ import AWS from "aws-sdk";
10
+ import { v4 as uuidv4 } from "uuid";
11
+ import { Image as CustomImage } from "../../../atoms/Image";
12
+ import { ImageTooltip } from "../../../molecules/ImageTooltip";
13
+ import {
14
+ faArrowUp as IconSend,
15
+ faImage as IconImage,
16
+ faTrash as IconDelete,
17
+ faExclamationTriangle as IconWarning,
18
+ } from "@fortawesome/free-solid-svg-icons";
19
+ import { CustomIcon } from "../../../atoms/CustomIcon";
20
+ import { ButtonV2 } from "../../../atoms/ButtonV2";
21
+ import { IconFile } from "../../../atoms/IconFile";
22
+ import { Modal } from "../../Modal";
23
+ import { Tooltip } from "../../../atoms/Tooltip";
24
+ import { Fade, Tooltip as TooltipMUI, Zoom } from "@mui/material";
25
+ import { ButtonFileChooser } from "../../../atoms/ButtonFileChooser";
26
+ import { Slide } from "@mui/material";
27
+ // carrousel
28
+ import { Swiper, SwiperSlide } from "swiper/react";
29
+ import "swiper/swiper.min.css";
30
+ //import "swiper/modules/free-mode/free-mode.min.css";
31
+ import { FreeMode, Mousewheel, Keyboard } from "swiper";
32
+ import {
33
+ getBase64,
34
+ getDataBase64,
35
+ getDataBuffer,
36
+ getFileExtension,
37
+ getFileName,
38
+ getImageSize,
39
+ isStringEmpty,
40
+ isValidNaturalNumber,
41
+ } from "../../../../global-files/utils";
42
+ import { InputText } from "../../../atoms/InputText";
43
+
44
+ const S3_BUCKET = process.env.REACT_APP_IMAGES_BUCKET;
45
+ const REGION = "us-east-1";
46
+
47
+ AWS.config.update({
48
+ accessKeyId: process.env.REACT_APP_KEY_UPLOAD_TO_S3,
49
+ secretAccessKey: process.env.REACT_APP_ACCESS_KEY_UPLOAD_TO_S3,
50
+ });
51
+
52
+ const myBucket = new AWS.S3({
53
+ params: { Bucket: S3_BUCKET },
54
+ region: REGION,
55
+ });
56
+
57
+ export const Footer = (props) => {
58
+ const {
59
+ chatType, // "merchant_product" | "order_product" | "ticket"
60
+ dataChat /* {
61
+ caso ticket: { id }
62
+ case merchant_product: { id , version }
63
+ case order_product: { id , version }
64
+ } */,
65
+ statusChat, // string
66
+ messageDisabled, // string
67
+ createItemsChat, // (items) => {}
68
+ errorUpdate, // { startDate , lastDate }
69
+ } = props;
70
+ const [valueInputMessage, setValueInputMessage] = useState("");
71
+ const [filesPreview, setFilesPreview] = useState([]);
72
+ const [filesJsxPreview, setFilesJsxPreview] = useState([]);
73
+ const [btnSendFilesLoading, setBtnSendFilesLoading] = useState(false);
74
+ const [btnSendMessageLoading, setBtnSendMessageLoading] = useState(false);
75
+ const [btnChooserFileDisabled, setBtnChooserFileDisabled] = useState(false);
76
+ const [inputMessageDisabled, setInputMessageDisabled] = useState(false);
77
+ const [openPreview, setOpenPreview] = useState(false);
78
+ const [toggleFocusInputMessage, setToggleFocusInputMessage] = useState(false);
79
+ const [tooltipFileName, setTooltipFileName] = useState({
80
+ show: false,
81
+ fileName: "",
82
+ });
83
+ const [modalAlert, setModalAlert] = useState({
84
+ show: false,
85
+ title: "",
86
+ message: "",
87
+ errorInputMessage: false,
88
+ });
89
+ const containerRef = useRef();
90
+ const refInputTextMessage = useRef();
91
+
92
+ useEffect(() => {
93
+ //console.log("filesPreview: ", filesPreview.slice());
94
+ setTooltipFileName({
95
+ show: false,
96
+ fileName: "",
97
+ });
98
+ renderFilesPreview();
99
+ }, [filesPreview]);
100
+
101
+ useEffect(() => {
102
+ if (filesJsxPreview.length) setOpenPreview(true);
103
+ else setOpenPreview(false);
104
+ }, [filesJsxPreview]);
105
+
106
+ useEffect(() => {
107
+ refInputTextMessage.current && refInputTextMessage.current.focus();
108
+ }, [toggleFocusInputMessage]);
109
+
110
+ const sendFilesPreview = async () => {
111
+ if (createItemsChat) {
112
+ const files = filesPreview.slice();
113
+ if (!files.length) {
114
+ setModalAlert({
115
+ show: true,
116
+ title: "No hay ningun archivo o imagen seleccionado para enviar",
117
+ message:
118
+ "Por favor, cargue los archivos o imagenes que quiera enviar al chat",
119
+ errorInputMessage: false,
120
+ });
121
+ return;
122
+ }
123
+ disableSecondaryContainer(true);
124
+
125
+ // subir archivos a AWS
126
+ const customFiles = [];
127
+ try {
128
+ //console.log("files:", files);
129
+ const fileUploadRequests = [];
130
+ //console.log(dataChat);
131
+ for (const file of files) {
132
+ let errorMessage;
133
+ // obtener base64
134
+ const fullBase64 = await getBase64(file);
135
+ if (!fullBase64) {
136
+ errorMessage = "No se pudo decodificar el archivo o imagen";
137
+ }
138
+ // obtener buffer
139
+ let dataBuffer;
140
+ if (!errorMessage)
141
+ dataBuffer = getDataBuffer(getDataBase64(fullBase64));
142
+ if (!dataBuffer) {
143
+ errorMessage = "No se pudo decodificar el archivo o imagen";
144
+ }
145
+ // obtener la key
146
+ let fileKey = "chat/";
147
+ switch (chatType) {
148
+ case "merchant_product":
149
+ if (
150
+ isValidNaturalNumber(dataChat?.id) &&
151
+ isValidNaturalNumber(dataChat?.version)
152
+ ) {
153
+ fileKey += `merchantArticle/${dataChat.id}-${dataChat.version}/`;
154
+ } else {
155
+ errorMessage = "El ID o la version del producto no es valido";
156
+ }
157
+ break;
158
+
159
+ case "order_product":
160
+ if (
161
+ isValidNaturalNumber(dataChat?.id) &&
162
+ isValidNaturalNumber(dataChat?.version)
163
+ ) {
164
+ fileKey += `orderArticle/${dataChat.id}-${dataChat.version}/`;
165
+ } else {
166
+ errorMessage = "El ID o la version del producto no es valido";
167
+ }
168
+ break;
169
+
170
+ case "ticket":
171
+ if (isValidNaturalNumber(dataChat?.id)) {
172
+ fileKey += `ticket/${dataChat.id}/`;
173
+ } else {
174
+ errorMessage = "El ID del ticket no es valido";
175
+ }
176
+ break;
177
+
178
+ default:
179
+ errorMessage =
180
+ "El tipo de chat no se especifico de manera correcta";
181
+ }
182
+ if (!errorMessage) {
183
+ const today = new Date();
184
+ fileKey += `${uuidv4()}-${today.getTime()}.${getFileExtension(
185
+ file.name
186
+ )}`;
187
+ } else {
188
+ fileKey = undefined;
189
+ }
190
+ //console.log("fileKey: ", fileKey);
191
+ // enviar file a AWS
192
+ customFiles.push({
193
+ itemType: file.type.split("/")[0] == "image" ? "img" : "file",
194
+ key: fileKey,
195
+ errorOwn: errorMessage,
196
+ });
197
+ const paramsCreate = {
198
+ ACL: "public-read",
199
+ Body: dataBuffer,
200
+ Bucket: S3_BUCKET,
201
+ Key: fileKey,
202
+ };
203
+ fileUploadRequests.push(myBucket.putObject(paramsCreate).promise());
204
+ }
205
+ const responseAWS = await Promise.allSettled(fileUploadRequests);
206
+ console.log("responseAWS:", responseAWS);
207
+ responseAWS.forEach((responseFile, index) => {
208
+ if (responseFile.status === "rejected") {
209
+ customFiles[index].errorAWS = responseFile.reason.message;
210
+ customFiles[index].uploaded = false;
211
+ } else {
212
+ customFiles[index].uploaded = true;
213
+ }
214
+ });
215
+ //console.log("customFiles:", customFiles);
216
+ } catch (err) {
217
+ disableSecondaryContainer(false);
218
+ setModalAlert({
219
+ show: true,
220
+ title: "hubo un problema al subir los archivos al chat",
221
+ message: `${err.message}
222
+ Reporta esto a TI`,
223
+ errorInputMessage: false,
224
+ });
225
+ return;
226
+ }
227
+
228
+ // obtener las keys de los files subidos
229
+ const items = [];
230
+ for (let index = 0; index < customFiles.length; index++) {
231
+ const file = customFiles[index];
232
+ if (file.uploaded) {
233
+ const valueItem = {
234
+ key: file.key,
235
+ name: files[index].name,
236
+ };
237
+ // caso imagen -> obtener width y height
238
+ if (file.itemType === "img") {
239
+ const imgSize = await getImageSize(files[index]);
240
+ if (imgSize) {
241
+ valueItem.width = imgSize.width;
242
+ valueItem.height = imgSize.height;
243
+ }
244
+ }
245
+ console.log("valueItemFile:", valueItem);
246
+ items.push({
247
+ type: file.itemType,
248
+ value: JSON.stringify(valueItem),
249
+ });
250
+ }
251
+ }
252
+
253
+ // enviar los archivos subidos en AWS a la BD
254
+ if (items.length) {
255
+ const responseError = await createItemsChat(items);
256
+ // cuando ningun archivo se guardo en la BD
257
+ if (responseError) {
258
+ setModalAlert({
259
+ show: true,
260
+ title: responseError.message,
261
+ message: responseError.errorDetail,
262
+ errorInputMessage: false,
263
+ });
264
+ disableSecondaryContainer(false);
265
+ return;
266
+ }
267
+ }
268
+
269
+ // obtener los errores de los files no subidos a AWS
270
+ const failedFiles = [];
271
+ let errorDetailFiles = "";
272
+ customFiles.forEach((file, index) => {
273
+ if (!file.uploaded) {
274
+ if (failedFiles.length === 0) {
275
+ errorDetailFiles = `${files[index].name}:
276
+ Error: ${file.errorOwn ? file.errorOwn : file.errorAWS}`;
277
+ } else {
278
+ errorDetailFiles += `${"\n\n"}${files[index].name}:
279
+ Error: ${file.errorOwn ? file.errorOwn : file.errorAWS}`;
280
+ }
281
+ failedFiles.push(files[index]);
282
+ }
283
+ });
284
+ if (failedFiles.length) {
285
+ setModalAlert({
286
+ show: true,
287
+ title: `${failedFiles.length}/${files.length} archivos no fueron enviados al chat`,
288
+ message: errorDetailFiles,
289
+ errorInputMessage: false,
290
+ });
291
+ }
292
+ // actualizar filesPreview
293
+ disableSecondaryContainer(false);
294
+ setFilesPreview(failedFiles);
295
+ }
296
+
297
+ /*
298
+ if (file.type.split("/")[0] === "image") {
299
+ if (arrayIMG.data.ext[0] === "svg") {
300
+ handlerCreateItem("file", params.Key);
301
+ } else handlerCreateItem("img", params.Key);
302
+ } else if (
303
+ file.type.split("/")[0] === "application" ||
304
+ file.type.split("/")[0] === "text"
305
+ ) {
306
+ handlerCreateItem("file", params.Key);
307
+ }
308
+ */
309
+ };
310
+
311
+ const sendMessage = async () => {
312
+ if (createItemsChat) {
313
+ if (isStringEmpty(valueInputMessage)) {
314
+ setValueInputMessage("");
315
+ setModalAlert({
316
+ show: true,
317
+ title: "mensaje vacío",
318
+ message:
319
+ "Por favor, especifica el mensaje que quieres enviar al chat",
320
+ errorInputMessage: true,
321
+ });
322
+ return;
323
+ }
324
+ setBtnSendMessageLoading(true);
325
+ setBtnChooserFileDisabled(true);
326
+ setInputMessageDisabled(true);
327
+ const responseError = await createItemsChat([
328
+ {
329
+ type: "message",
330
+ value: valueInputMessage.trim(),
331
+ },
332
+ ]);
333
+ setInputMessageDisabled(false);
334
+ setBtnSendMessageLoading(false);
335
+ setBtnChooserFileDisabled(false);
336
+ if (responseError) {
337
+ setModalAlert({
338
+ show: true,
339
+ title: responseError.message,
340
+ message: responseError.errorDetail,
341
+ errorInputMessage: true,
342
+ });
343
+ } else {
344
+ setValueInputMessage("");
345
+ setToggleFocusInputMessage((prev) => !prev);
346
+ }
347
+ }
348
+ };
349
+
350
+ const disableSecondaryContainer = (disabled = false) => {
351
+ setBtnSendFilesLoading(disabled);
352
+ setBtnChooserFileDisabled(disabled);
353
+ setOpenPreview(!disabled);
354
+ };
355
+
356
+ const deleteFile = async (index) => {
357
+ let newFiles = filesPreview.slice();
358
+ newFiles.splice(index, 1);
359
+ setFilesPreview(newFiles);
360
+ };
361
+
362
+ const renderFilesPreview = async () => {
363
+ const jsxFiles = [];
364
+ for (let index = 0; index < filesPreview.length; index++) {
365
+ const file = filesPreview[index];
366
+ const fileType = file.type?.split("/")[0];
367
+ const base64 = await getBase64(file);
368
+ jsxFiles.push(
369
+ <SwiperSlide className="item-carrousel" key={"item-" + index}>
370
+ <ContainerItemCarrousel>
371
+ {fileType === "image" ? (
372
+ <CustomImage
373
+ width={"100%"}
374
+ className={"container-img"}
375
+ sizeLoading={40}
376
+ colorLoading={undefined}
377
+ src={base64}
378
+ componentDefault={
379
+ <CustomIcon
380
+ className="icon-img"
381
+ size={60}
382
+ icon={IconImage}
383
+ type={"pink"}
384
+ transparent
385
+ />
386
+ }
387
+ />
388
+ ) : (
389
+ <IconFile
390
+ transparent
391
+ size={60}
392
+ ext={getFileExtension(file.name)}
393
+ />
394
+ )}
395
+
396
+ <div
397
+ className="container-delete"
398
+ onMouseEnter={() => {
399
+ setTooltipFileName({
400
+ show: true,
401
+ fileName: file.name,
402
+ });
403
+ }}
404
+ onMouseLeave={() => {
405
+ setTooltipFileName({
406
+ show: false,
407
+ fileName: "",
408
+ });
409
+ }}
410
+ >
411
+ <ButtonV2
412
+ className="btn-delete"
413
+ type={"white"}
414
+ label={"Eliminar"}
415
+ size={8}
416
+ borderType={"oval"}
417
+ icon={IconDelete}
418
+ isLoading={undefined}
419
+ onClick={async (event) => {
420
+ deleteFile(index);
421
+ }}
422
+ />
423
+ </div>
424
+ </ContainerItemCarrousel>
425
+ </SwiperSlide>
426
+ );
427
+ }
428
+ setFilesJsxPreview(jsxFiles);
429
+ };
430
+
431
+ const onChangeFiles = async (selectedFiles) => {
432
+ //console.log("selected files: ", selectedFiles);
433
+ let newFiles = filesPreview.slice();
434
+ newFiles = newFiles.concat(selectedFiles);
435
+ setFilesPreview(newFiles);
436
+ };
437
+
438
+ const getErrorUpdate = () => {
439
+ if (errorUpdate?.startDate) {
440
+ let errorDetail = "Ultima actualización hace ";
441
+ if (errorUpdate?.lastDate) {
442
+ let msDif =
443
+ errorUpdate.lastDate.getTime() - errorUpdate.startDate.getTime();
444
+ const minutes = Math.floor(msDif / 60000);
445
+ const hours = Math.floor(minutes / 60);
446
+ if (hours === 0) {
447
+ if (minutes === 0) errorDetail += "menos de 1 minuto";
448
+ else if (minutes === 1) errorDetail += "1 minuto";
449
+ else errorDetail += minutes + " minutos";
450
+ } else {
451
+ if (hours === 1) errorDetail += "1 hora con ";
452
+ else errorDetail += hours + " horas con ";
453
+
454
+ if (minutes === 0) errorDetail += "menos de 1 minuto";
455
+ else if (minutes === 1) errorDetail += "1 minuto";
456
+ else errorDetail += minutes + " minutos";
457
+ }
458
+ } else {
459
+ errorDetail += "menos de 1 minuto";
460
+ }
461
+ // retornar el icono
462
+ return (
463
+ <Tooltip
464
+ componentTooltip={
465
+ <div>
466
+ <label className="label-title">Chat desactualizado</label>
467
+ <label className="label-detail">{errorDetail}</label>
468
+ </div>
469
+ }
470
+ className="container-ErrorUpdate"
471
+ classNameTooltip="tooltipErrorUpdate"
472
+ position={"topCenter"}
473
+ addArrow={false}
474
+ transitionType={"zoom"}
475
+ followCursor={false}
476
+ >
477
+ <CustomIcon
478
+ className="icon-errorUpdate"
479
+ size={15}
480
+ icon={IconWarning}
481
+ type={"pink"}
482
+ transparent
483
+ />
484
+ </Tooltip>
485
+ );
486
+ } else {
487
+ return null;
488
+ }
489
+ };
490
+
491
+ return (
492
+ <>
493
+ <Container ref={containerRef}>
494
+ {statusChat === "closed" ? (
495
+ <>
496
+ {/* chat bloqueado */}
497
+ <div className="container-chatDisabled">
498
+ {/* icono de chat desactualizado */}
499
+ {getErrorUpdate()}
500
+
501
+ <div className="label-chatDisabled">{messageDisabled}</div>
502
+ </div>
503
+ </>
504
+ ) : filesJsxPreview.length === 0 ? (
505
+ <>
506
+ {/* container del input y el btn sendTXT */}
507
+ <ContainerMain>
508
+ {/* icono de chat desactualizado */}
509
+ {getErrorUpdate()}
510
+
511
+ <InputText
512
+ className="input-itemMessage"
513
+ type="gray"
514
+ transparent
515
+ size={13}
516
+ placeHolder="Escribe aquí..."
517
+ multiline
518
+ maxRows={5}
519
+ minRows={1}
520
+ disabled={inputMessageDisabled}
521
+ text={valueInputMessage}
522
+ onChangeText={(newValue) => setValueInputMessage(newValue)}
523
+ onEnter={async (event) => await sendMessage()}
524
+ refInputText={refInputTextMessage}
525
+ />
526
+
527
+ {/* selector de files */}
528
+ <ButtonFileChooser
529
+ className="btn-chooserFiles"
530
+ type={"gray"}
531
+ transparent
532
+ size={18}
533
+ disabled={btnChooserFileDisabled}
534
+ showIcon={true}
535
+ multipleFiles={true}
536
+ onChangeFiles={onChangeFiles}
537
+ />
538
+
539
+ {/* boton send message */}
540
+ <ButtonV2
541
+ className="btn-sendMessage"
542
+ type={"pink"}
543
+ size={10}
544
+ borderType={"circle"}
545
+ icon={IconSend}
546
+ isLoading={btnSendMessageLoading}
547
+ onClick={async (event) => {
548
+ await sendMessage();
549
+ }}
550
+ />
551
+ </ContainerMain>
552
+ </>
553
+ ) : (
554
+ <>
555
+ {/* container para el modo previewFiles */}
556
+ <TooltipMUI
557
+ open={openPreview}
558
+ placement={"top-start"}
559
+ arrow={false}
560
+ componentsProps={{
561
+ popper: {
562
+ className: "tooltip-previewFiles",
563
+ disablePortal: true,
564
+ },
565
+ transition: { timeout: 300 },
566
+ }}
567
+ title={
568
+ <TooltipMUI
569
+ open={tooltipFileName.show}
570
+ placement={"top"}
571
+ arrow={false}
572
+ followCursor={true}
573
+ TransitionComponent={Fade}
574
+ componentsProps={{
575
+ popper: {
576
+ className: "tooltip-previewFileName",
577
+ disablePortal: true,
578
+ },
579
+ transition: { timeout: 300 },
580
+ }}
581
+ title={<label>{tooltipFileName.fileName}</label>}
582
+ >
583
+ <div className="container-carrouselFiles">
584
+ <Swiper
585
+ spaceBetween={5}
586
+ slidesPerView={"auto"}
587
+ freeMode
588
+ mousewheel
589
+ keyboard
590
+ modules={[Mousewheel, Keyboard, FreeMode]}
591
+ className="carrousel-files"
592
+ >
593
+ {filesJsxPreview}
594
+ </Swiper>
595
+ </div>
596
+ </TooltipMUI>
597
+ }
598
+ >
599
+ <ContainerSecondary>
600
+ {/* icono de chat desactualizado */}
601
+ {getErrorUpdate()}
602
+
603
+ {/* selector de files */}
604
+ <Slide
605
+ direction={"left"}
606
+ in={true}
607
+ timeout={500}
608
+ container={containerRef.current}
609
+ >
610
+ <div>
611
+ <ButtonFileChooser
612
+ className={"btn-chooserFiles"}
613
+ type={"gray"}
614
+ size={17}
615
+ borderType="circle"
616
+ showIcon={true}
617
+ disabled={btnChooserFileDisabled}
618
+ multipleFiles={true}
619
+ onChangeFiles={onChangeFiles}
620
+ />
621
+ </div>
622
+ </Slide>
623
+
624
+ {/* boton send files */}
625
+ <Slide
626
+ direction={"up"}
627
+ in={true}
628
+ timeout={500}
629
+ container={containerRef.current}
630
+ >
631
+ <div className="slide-btnSendFiles">
632
+ <ButtonV2
633
+ className="btn-sendFiles"
634
+ type={"pink"}
635
+ label={"Enviar archivos"}
636
+ size={12}
637
+ borderType={"oval"}
638
+ loading={btnSendFilesLoading}
639
+ isLoading={btnSendFilesLoading}
640
+ onClick={async (event) => {
641
+ await sendFilesPreview();
642
+ }}
643
+ />
644
+ </div>
645
+ </Slide>
646
+ </ContainerSecondary>
647
+ </TooltipMUI>
648
+ </>
649
+ )}
650
+ </Container>
651
+
652
+ <Modal
653
+ className="container-modalAlert"
654
+ show={modalAlert.show}
655
+ title={modalAlert.title}
656
+ message={modalAlert.message}
657
+ icon={"info"}
658
+ onClickBtnDefault={(event) => {
659
+ setModalAlert((prev) => ({
660
+ ...prev,
661
+ show: false,
662
+ errorInputMessage: false,
663
+ }));
664
+ setToggleFocusInputMessage((prev) => !prev);
665
+ }}
666
+ />
667
+ </>
668
+ );
669
+ };