contentoh-components-library 21.2.105 → 21.3.0

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 (248) hide show
  1. package/.env.development +5 -2
  2. package/.env.production +25 -25
  3. package/dist/assets/fonts/{roboto → Roboto}/LICENSE.txt +0 -0
  4. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Black.ttf +0 -0
  5. package/dist/assets/fonts/{roboto → Roboto}/Roboto-BlackItalic.ttf +0 -0
  6. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Bold.ttf +0 -0
  7. package/dist/assets/fonts/{roboto → Roboto}/Roboto-BoldItalic.ttf +0 -0
  8. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Italic.ttf +0 -0
  9. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Light.ttf +0 -0
  10. package/dist/assets/fonts/{roboto → Roboto}/Roboto-LightItalic.ttf +0 -0
  11. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Medium.ttf +0 -0
  12. package/dist/assets/fonts/{roboto → Roboto}/Roboto-MediumItalic.ttf +0 -0
  13. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Regular.ttf +0 -0
  14. package/dist/assets/fonts/{roboto → Roboto}/Roboto-Thin.ttf +0 -0
  15. package/dist/assets/fonts/{roboto → Roboto}/Roboto-ThinItalic.ttf +0 -0
  16. package/dist/assets/images/chatPopup/Spinner.gif +0 -0
  17. package/dist/assets/images/chatPopup/close.svg +3 -0
  18. package/dist/assets/images/chatPopup/defaultImage.png +0 -0
  19. package/dist/assets/images/chatPopup/defaultProfile.png +0 -0
  20. package/dist/assets/images/chatPopup/doc.svg +1 -0
  21. package/dist/assets/images/chatPopup/document.svg +1 -0
  22. package/dist/assets/images/chatPopup/iconChat.svg +19 -0
  23. package/dist/assets/images/chatPopup/iconPlus.svg +3 -0
  24. package/dist/assets/images/chatPopup/pdf.svg +75 -0
  25. package/dist/assets/images/chatPopup/remove.svg +4 -0
  26. package/dist/assets/images/chatPopup/send.svg +3 -0
  27. package/dist/assets/images/chatPopup/svgIcon.svg +109 -0
  28. package/dist/assets/images/chatPopup/upload_file.svg +3 -0
  29. package/dist/assets/images/chatPopup/xls.svg +53 -0
  30. package/dist/assets/images/customSelect/starIcon.svg +14 -0
  31. package/dist/assets/images/defaultImages/Spinner.gif +0 -0
  32. package/dist/assets/images/defaultImages/notFound.svg +124 -0
  33. package/dist/components/atoms/ButtonFileChooser/ButtonFileChooser.stories.js +72 -0
  34. package/dist/components/atoms/ButtonFileChooser/index.js +118 -0
  35. package/dist/components/atoms/ButtonFileChooser/styles.js +20 -0
  36. package/dist/components/atoms/ButtonV2/ButtonV2.stories.js +66 -0
  37. package/dist/components/atoms/ButtonV2/index.js +110 -0
  38. package/dist/components/atoms/ButtonV2/styles.js +53 -0
  39. package/dist/components/atoms/ChatPopUp/ChatPopUp.stories.js +28 -0
  40. package/dist/components/atoms/ChatPopUp/index.js +841 -0
  41. package/dist/components/atoms/ChatPopUp/styles.js +27 -0
  42. package/dist/components/atoms/ChatPopUp/utils/handlersChat.js +182 -0
  43. package/dist/components/atoms/CustomIcon/CustomIcon.stories.js +50 -0
  44. package/dist/components/atoms/CustomIcon/index.js +40 -0
  45. package/dist/components/atoms/CustomIcon/styles.js +33 -0
  46. package/dist/components/atoms/GeneralButton/index.js +2 -6
  47. package/dist/components/atoms/IconFile/IconFile.stories.js +48 -0
  48. package/dist/components/atoms/IconFile/index.js +249 -0
  49. package/dist/components/atoms/IconFile/styles.js +23 -0
  50. package/dist/components/atoms/Image/Image.stories.js +73 -0
  51. package/dist/components/atoms/Image/index.js +76 -0
  52. package/dist/components/atoms/Image/styles.js +43 -0
  53. package/dist/components/atoms/ImageLink/ImageLink.stories.js +63 -0
  54. package/dist/components/atoms/ImageLink/index.js +77 -0
  55. package/dist/components/atoms/ImageLink/styles.js +40 -0
  56. package/dist/components/atoms/ImagePreview/ImagePreview.stories.js +70 -0
  57. package/dist/components/atoms/ImagePreview/index.js +222 -0
  58. package/dist/components/atoms/ImagePreview/styles.js +44 -0
  59. package/dist/components/atoms/InputText/InputText.stories.js +60 -0
  60. package/dist/components/atoms/InputText/index.js +66 -0
  61. package/dist/components/atoms/InputText/styles.js +32 -0
  62. package/dist/components/atoms/NotFound/NotFound.stories.js +36 -0
  63. package/dist/components/atoms/NotFound/index.js +75 -0
  64. package/dist/components/atoms/NotFound/styles.js +20 -0
  65. package/dist/components/atoms/Select/VersionSelect.js +1 -2
  66. package/dist/components/atoms/SelectItemV2/SelectItemV2.stories.js +45 -0
  67. package/dist/components/atoms/SelectItemV2/index.js +57 -0
  68. package/dist/components/atoms/SelectItemV2/styles.js +30 -0
  69. package/dist/components/atoms/StatusTag/StatusTag.stories.js +48 -0
  70. package/dist/components/atoms/StatusTag/index.js +58 -0
  71. package/dist/components/atoms/StatusTag/styles.js +20 -0
  72. package/dist/components/atoms/Tooltip/Tooltip.stories.js +66 -0
  73. package/dist/components/atoms/Tooltip/index.js +72 -0
  74. package/dist/components/atoms/Tooltip/styles.js +20 -0
  75. package/dist/components/molecules/ButtonDownloadFile/DownloadFile.stories.js +66 -0
  76. package/dist/components/molecules/ButtonDownloadFile/index.js +179 -0
  77. package/dist/components/molecules/ButtonDownloadFile/styles.js +23 -0
  78. package/dist/components/molecules/CustomSelect/CustomSelect.stories.js +21 -22
  79. package/dist/components/molecules/CustomSelect/SelectItem.js +10 -1
  80. package/dist/components/molecules/Dropdown/Dropdown.stories.js +98 -0
  81. package/dist/components/molecules/Dropdown/index.js +150 -0
  82. package/dist/components/molecules/Dropdown/styles.js +26 -0
  83. package/dist/components/molecules/HeaderTop/index.js +10 -5
  84. package/dist/components/molecules/HeaderTop/styles.js +1 -1
  85. package/dist/components/molecules/ImageTooltip/ImageTooltip.stories.js +82 -0
  86. package/dist/components/molecules/ImageTooltip/index.js +85 -0
  87. package/dist/components/molecules/ImageTooltip/styles.js +33 -0
  88. package/dist/components/molecules/SelectV2/SelectV2.stories.js +119 -0
  89. package/dist/components/molecules/SelectV2/index.js +298 -0
  90. package/dist/components/molecules/SelectV2/styles.js +42 -0
  91. package/dist/components/organisms/Chat/Chat.stories.js +215 -0
  92. package/dist/components/organisms/Chat/ChatLists/ChatLists.stories.js +83 -0
  93. package/dist/components/organisms/Chat/ChatLists/index.js +160 -0
  94. package/dist/components/organisms/Chat/ChatLists/styles.js +29 -0
  95. package/dist/components/organisms/Chat/ContainerItems/ContainerItems.stories.js +176 -0
  96. package/dist/components/organisms/Chat/ContainerItems/index.js +569 -0
  97. package/dist/components/organisms/Chat/ContainerItems/styles.js +20 -0
  98. package/dist/components/organisms/Chat/ContentChat/ContentChat.stories.js +142 -0
  99. package/dist/components/organisms/Chat/ContentChat/index.js +1422 -0
  100. package/dist/components/organisms/Chat/ContentChat/styles.js +20 -0
  101. package/dist/components/organisms/Chat/Footer/Footer.stories.js +43 -0
  102. package/dist/components/organisms/Chat/Footer/index.js +984 -0
  103. package/dist/components/organisms/Chat/Footer/styles.js +32 -0
  104. package/dist/components/organisms/Chat/Header/Header.stories.js +96 -0
  105. package/dist/components/organisms/Chat/Header/index.js +84 -0
  106. package/dist/components/organisms/Chat/Header/styles.js +20 -0
  107. package/dist/components/organisms/Chat/index.js +327 -0
  108. package/dist/components/organisms/Chat/styles.js +29 -0
  109. package/dist/components/organisms/CreateVersion/RenderChilds.js +11 -11
  110. package/dist/components/organisms/CreateVersion/index.js +89 -30
  111. package/dist/components/organisms/Modal/Modal.stories.js +66 -0
  112. package/dist/components/organisms/Modal/index.js +95 -0
  113. package/dist/components/organisms/Modal/styles.js +20 -0
  114. package/dist/components/organisms/OrderDetail/OrderDetail.stories.js +1 -1
  115. package/dist/components/organisms/OrderDetail/index.js +11 -20
  116. package/dist/components/organisms/OrderDetail/styles.js +1 -1
  117. package/dist/components/organisms/OrderDetail/utils/Table/styles.js +1 -1
  118. package/dist/components/organisms/OrderDetail/utils/Table/utils.js +15 -45
  119. package/dist/components/organisms/RangeCalendar/RangeCalendar.stories.js +28 -0
  120. package/dist/components/organisms/RangeCalendar/index.js +140 -0
  121. package/dist/components/organisms/RangeCalendar/styles.js +27 -0
  122. package/dist/components/organisms/VersionSelector/index.js +2 -28
  123. package/dist/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +147 -69
  124. package/dist/components/pages/ProviderProductEdition/index.js +22 -2
  125. package/dist/components/pages/RegistrationLoginFirstStep/RegistrationLoginFirstStep.stories.js +37 -0
  126. package/dist/components/pages/RegistrationLoginFirstStep/index.js +269 -0
  127. package/dist/components/pages/RegistrationLoginFirstStep/styles.js +20 -0
  128. package/dist/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +67 -77
  129. package/dist/components/pages/RetailerProductEdition/index.js +24 -5
  130. package/dist/global-files/fonts.css +15 -3
  131. package/dist/global-files/handle_http.js +383 -0
  132. package/dist/global-files/utils.js +472 -0
  133. package/dist/global-files/variables.js +2 -0
  134. package/dist/index.js +267 -46
  135. package/package.json +12 -1
  136. package/src/assets/fonts/{roboto → Roboto}/LICENSE.txt +0 -0
  137. package/src/assets/fonts/{roboto → Roboto}/Roboto-Black.ttf +0 -0
  138. package/src/assets/fonts/{roboto → Roboto}/Roboto-BlackItalic.ttf +0 -0
  139. package/src/assets/fonts/{roboto → Roboto}/Roboto-Bold.ttf +0 -0
  140. package/src/assets/fonts/{roboto → Roboto}/Roboto-BoldItalic.ttf +0 -0
  141. package/src/assets/fonts/{roboto → Roboto}/Roboto-Italic.ttf +0 -0
  142. package/src/assets/fonts/{roboto → Roboto}/Roboto-Light.ttf +0 -0
  143. package/src/assets/fonts/{roboto → Roboto}/Roboto-LightItalic.ttf +0 -0
  144. package/src/assets/fonts/{roboto → Roboto}/Roboto-Medium.ttf +0 -0
  145. package/src/assets/fonts/{roboto → Roboto}/Roboto-MediumItalic.ttf +0 -0
  146. package/src/assets/fonts/{roboto → Roboto}/Roboto-Regular.ttf +0 -0
  147. package/src/assets/fonts/{roboto → Roboto}/Roboto-Thin.ttf +0 -0
  148. package/src/assets/fonts/{roboto → Roboto}/Roboto-ThinItalic.ttf +0 -0
  149. package/src/assets/images/customSelect/starIcon.svg +14 -0
  150. package/src/assets/images/defaultImages/Spinner.gif +0 -0
  151. package/src/assets/images/defaultImages/notFound.svg +124 -0
  152. package/src/components/atoms/ButtonFileChooser/ButtonFileChooser.stories.js +47 -0
  153. package/src/components/atoms/ButtonFileChooser/index.js +69 -0
  154. package/src/components/atoms/ButtonFileChooser/styles.js +4 -0
  155. package/src/components/atoms/ButtonV2/ButtonV2.stories.js +53 -0
  156. package/src/components/atoms/ButtonV2/index.js +85 -0
  157. package/src/components/atoms/ButtonV2/styles.js +217 -0
  158. package/src/components/atoms/CustomIcon/CustomIcon.stories.js +36 -0
  159. package/src/components/atoms/CustomIcon/index.js +41 -0
  160. package/src/components/atoms/CustomIcon/styles.js +85 -0
  161. package/src/components/atoms/GeneralButton/index.js +1 -4
  162. package/src/components/atoms/IconFile/IconFile.stories.js +35 -0
  163. package/src/components/atoms/IconFile/index.js +119 -0
  164. package/src/components/atoms/IconFile/styles.js +67 -0
  165. package/src/components/atoms/Image/Image.stories.js +51 -0
  166. package/src/components/atoms/Image/index.js +55 -0
  167. package/src/components/atoms/Image/styles.js +34 -0
  168. package/src/components/atoms/ImageLink/ImageLink.stories.js +43 -0
  169. package/src/components/atoms/ImageLink/index.js +57 -0
  170. package/src/components/atoms/ImageLink/styles.js +30 -0
  171. package/src/components/atoms/ImagePreview/ImagePreview.stories.js +52 -0
  172. package/src/components/atoms/ImagePreview/index.js +191 -0
  173. package/src/components/atoms/ImagePreview/styles.js +77 -0
  174. package/src/components/atoms/InputText/InputText.stories.js +39 -0
  175. package/src/components/atoms/InputText/index.js +61 -0
  176. package/src/components/atoms/InputText/styles.js +89 -0
  177. package/src/components/atoms/NotFound/NotFound.stories.js +19 -0
  178. package/src/components/atoms/NotFound/index.js +52 -0
  179. package/src/components/atoms/NotFound/styles.js +55 -0
  180. package/src/components/atoms/Select/VersionSelect.js +2 -4
  181. package/src/components/atoms/SelectItemV2/SelectItemV2.stories.js +26 -0
  182. package/src/components/atoms/SelectItemV2/index.js +61 -0
  183. package/src/components/atoms/SelectItemV2/styles.js +90 -0
  184. package/src/components/atoms/Tooltip/Tooltip.stories.js +51 -0
  185. package/src/components/atoms/Tooltip/index.js +59 -0
  186. package/src/components/atoms/Tooltip/styles.js +42 -0
  187. package/src/components/molecules/ButtonDownloadFile/DownloadFile.stories.js +54 -0
  188. package/src/components/molecules/ButtonDownloadFile/index.js +111 -0
  189. package/src/components/molecules/ButtonDownloadFile/styles.js +66 -0
  190. package/src/components/molecules/CustomSelect/CustomSelect.stories.js +20 -12
  191. package/src/components/molecules/CustomSelect/SelectItem.js +7 -0
  192. package/src/components/molecules/Dropdown/Dropdown.stories.js +103 -0
  193. package/src/components/molecules/Dropdown/index.js +150 -0
  194. package/src/components/molecules/Dropdown/styles.js +75 -0
  195. package/src/components/molecules/HeaderTop/index.js +11 -6
  196. package/src/components/molecules/HeaderTop/styles.js +4 -0
  197. package/src/components/molecules/ImageTooltip/ImageTooltip.stories.js +68 -0
  198. package/src/components/molecules/ImageTooltip/index.js +63 -0
  199. package/src/components/molecules/ImageTooltip/styles.js +18 -0
  200. package/src/components/molecules/SelectV2/SelectV2.stories.js +114 -0
  201. package/src/components/molecules/SelectV2/index.js +335 -0
  202. package/src/components/molecules/SelectV2/styles.js +105 -0
  203. package/src/components/organisms/Chat/Chat.stories.js +199 -0
  204. package/src/components/organisms/Chat/ChatLists/ChatLists.stories.js +65 -0
  205. package/src/components/organisms/Chat/ChatLists/Rotoplas.jpeg +0 -0
  206. package/src/components/organisms/Chat/ChatLists/THD.png +0 -0
  207. package/src/components/organisms/Chat/ChatLists/index.js +141 -0
  208. package/src/components/organisms/Chat/ChatLists/styles.js +162 -0
  209. package/src/components/organisms/Chat/ContainerItems/ContainerItems.stories.js +142 -0
  210. package/src/components/organisms/Chat/ContainerItems/index.js +549 -0
  211. package/src/components/organisms/Chat/ContainerItems/styles.js +328 -0
  212. package/src/components/organisms/Chat/ContentChat/ContentChat.stories.js +102 -0
  213. package/src/components/organisms/Chat/ContentChat/Rotoplas.jpeg +0 -0
  214. package/src/components/organisms/Chat/ContentChat/THD.png +0 -0
  215. package/src/components/organisms/Chat/ContentChat/index.js +900 -0
  216. package/src/components/organisms/Chat/ContentChat/styles.js +41 -0
  217. package/src/components/organisms/Chat/Footer/Footer.stories.js +22 -0
  218. package/src/components/organisms/Chat/Footer/index.js +669 -0
  219. package/src/components/organisms/Chat/Footer/styles.js +286 -0
  220. package/src/components/organisms/Chat/Header/Header.stories.js +66 -0
  221. package/src/components/organisms/Chat/Header/index.js +94 -0
  222. package/src/components/organisms/Chat/Header/styles.js +49 -0
  223. package/src/components/organisms/Chat/index.js +294 -0
  224. package/src/components/organisms/Chat/styles.js +42 -0
  225. package/src/components/organisms/CreateVersion/RenderChilds.js +34 -28
  226. package/src/components/organisms/CreateVersion/index.js +36 -16
  227. package/src/components/organisms/Modal/Modal.stories.js +55 -0
  228. package/src/components/organisms/Modal/index.js +97 -0
  229. package/src/components/organisms/Modal/styles.js +103 -0
  230. package/src/components/organisms/OrderDetail/OrderDetail.stories.js +1 -1
  231. package/src/components/organisms/OrderDetail/index.js +12 -19
  232. package/src/components/organisms/OrderDetail/styles.js +0 -1
  233. package/src/components/organisms/OrderDetail/utils/Table/styles.js +0 -26
  234. package/src/components/organisms/OrderDetail/utils/Table/utils.js +15 -30
  235. package/src/components/organisms/RangeCalendar/RangeCalendar.stories.js +11 -0
  236. package/src/components/organisms/RangeCalendar/index.js +117 -0
  237. package/src/components/organisms/RangeCalendar/styles.js +883 -0
  238. package/src/components/organisms/VersionSelector/index.js +3 -18
  239. package/src/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +166 -75
  240. package/src/components/pages/ProviderProductEdition/index.js +21 -2
  241. package/src/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +67 -79
  242. package/src/components/pages/RetailerProductEdition/index.js +14 -2
  243. package/src/global-files/customHooks.js +2 -2
  244. package/src/global-files/fonts.css +15 -3
  245. package/src/global-files/handle_http.js +231 -0
  246. package/src/global-files/utils.js +300 -0
  247. package/src/global-files/variables.js +2 -0
  248. package/src/index.js +17 -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
+ };