contentoh-components-library 21.2.78 → 21.2.79

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 (44) hide show
  1. package/.env.development +4 -1
  2. package/dist/components/atoms/StatusTag/StatusTag.stories.js +48 -0
  3. package/dist/components/atoms/StatusTag/index.js +58 -0
  4. package/dist/components/atoms/StatusTag/styles.js +20 -0
  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/GalleryElement/index.js +16 -1
  8. package/dist/components/molecules/GalleryHeader/index.js +3 -0
  9. package/dist/components/molecules/HeaderTop/index.js +10 -5
  10. package/dist/components/molecules/HeaderTop/styles.js +1 -1
  11. package/dist/components/pages/RegistrationLoginFirstStep/RegistrationLoginFirstStep.stories.js +37 -0
  12. package/dist/components/pages/RegistrationLoginFirstStep/index.js +269 -0
  13. package/dist/components/pages/RegistrationLoginFirstStep/styles.js +20 -0
  14. package/dist/components/pages/RetailerProductEdition/index.js +2 -1
  15. package/package.json +6 -1
  16. package/src/assets/images/chatPopup/Spinner.gif +0 -0
  17. package/src/assets/images/chatPopup/close.svg +3 -0
  18. package/src/assets/images/chatPopup/defaultImage.png +0 -0
  19. package/src/assets/images/chatPopup/defaultProfile.png +0 -0
  20. package/src/assets/images/chatPopup/doc.svg +1 -0
  21. package/src/assets/images/chatPopup/document.svg +1 -0
  22. package/src/assets/images/chatPopup/iconChat.svg +19 -0
  23. package/src/assets/images/chatPopup/iconPlus.svg +3 -0
  24. package/src/assets/images/chatPopup/pdf.svg +75 -0
  25. package/src/assets/images/chatPopup/remove.svg +4 -0
  26. package/src/assets/images/chatPopup/send.svg +3 -0
  27. package/src/assets/images/chatPopup/svgIcon.svg +109 -0
  28. package/src/assets/images/chatPopup/upload_file.svg +3 -0
  29. package/src/assets/images/chatPopup/xls.svg +53 -0
  30. package/src/assets/images/customSelect/starIcon.svg +14 -0
  31. package/src/components/atoms/ChatPopUp/ChatPopUp.stories.js +11 -0
  32. package/src/components/atoms/ChatPopUp/index.js +541 -0
  33. package/src/components/atoms/ChatPopUp/styles.js +278 -0
  34. package/src/components/atoms/ChatPopUp/utils/handlersChat.js +104 -0
  35. package/src/components/atoms/Tooltip/Tooltip.stories.js +15 -0
  36. package/src/components/atoms/Tooltip/index.js +35 -0
  37. package/src/components/atoms/Tooltip/styles.js +5 -0
  38. package/src/components/molecules/CustomSelect/CustomSelect.stories.js +20 -12
  39. package/src/components/molecules/CustomSelect/SelectItem.js +7 -0
  40. package/src/components/molecules/GalleryElement/index.js +18 -0
  41. package/src/components/molecules/GalleryHeader/index.js +1 -0
  42. package/src/components/molecules/HeaderTop/index.js +10 -6
  43. package/src/components/molecules/HeaderTop/styles.js +4 -0
  44. package/src/components/pages/RetailerProductEdition/index.js +1 -0
@@ -0,0 +1,541 @@
1
+ import { Container, Slider } from "./styles";
2
+ import { useEffect, useState } from "react";
3
+ import chatIcon from "../../../assets/images/chatPopup/iconChat.svg";
4
+ import closeChat from "../../../assets/images/chatPopup/close.svg";
5
+ import send from "../../../assets/images/chatPopup/send.svg";
6
+ import iconPlus from "../../../assets/images/chatPopup/iconPlus.svg";
7
+ import upload from "../../../assets/images/chatPopup/upload_file.svg";
8
+ import defaultProfile from "../../../assets/images/chatPopup/defaultProfile.png";
9
+ import defaultImage from "../../../assets/images/chatPopup/defaultImage.png";
10
+ import defaultSpinner from "../../../assets/images/chatPopup/Spinner.gif";
11
+ import doc from "../../../assets/images/chatPopup/doc.svg";
12
+ import xls from "../../../assets/images/chatPopup/xls.svg";
13
+ import documentType from "../../../assets/images/chatPopup/document.svg";
14
+ import svg from "../../../assets/images/chatPopup/svgIcon.svg";
15
+ import moment from "moment";
16
+ import AWS from "aws-sdk";
17
+ import ReactImageFallback from "react-image-fallback";
18
+ import { v4 as uuidv4 } from "uuid";
19
+ import { getBD, createItemBD } from "./utils/handlersChat";
20
+ import { getProfilePicture } from "../../../global-files/data";
21
+ import { CustomTooltip } from "../Tooltip";
22
+
23
+ const S3_BUCKET = process.env.REACT_APP_IMAGES_BUCKET;
24
+ const REGION = "us-east-1";
25
+ const Buffer = require("buffer/").Buffer;
26
+
27
+ AWS.config.update({
28
+ accessKeyId: process.env.REACT_APP_KEY_UPLOAD_TO_S3,
29
+ secretAccessKey: process.env.REACT_APP_ACCESS_KEY_UPLOAD_TO_S3,
30
+ });
31
+
32
+ const myBucket = new AWS.S3({
33
+ params: { Bucket: S3_BUCKET },
34
+ region: REGION,
35
+ });
36
+
37
+ export const ChatPopUp = ({ props }) => {
38
+ const [showMenu, setShowMenu] = useState(false);
39
+ const [items, setItems] = useState(); // items que vienen de la BD
40
+ const [customItems, setCustomItems] = useState([]); // JSX acorde al tipo de los items
41
+ const [current_id_company, setCurrent_id_company] = useState(0);
42
+ const [valueInput, setValueInput] = useState("");
43
+ const [processUpdateID, setProcessUpdateID] = useState();
44
+ const [countUpdate, setCountUpdate] = useState(0);
45
+ let arrayIMG = { data: { ext: [], nameFile: [] } };
46
+ const Authorization = props.chat_authorization;
47
+ const prop_id_article = props.chat_id_article;
48
+ const prop_version_article = props.chat_version_article;
49
+
50
+ useEffect(() => {
51
+ //setItems([])
52
+ getInitial();
53
+ }, []);
54
+
55
+ useEffect(() => {
56
+ if (!items) return;
57
+ renderItems();
58
+ //console.log("update en 10s");
59
+ //const processUpdate = setTimeout( () => {
60
+ // setCountUpdate( (prev) => prev+1 )
61
+ //} , 25000 )
62
+ //setProcessUpdateID(processUpdate);
63
+ }, [items]);
64
+
65
+ // implementar update cada 30s
66
+ useEffect(() => {
67
+ if (countUpdate == 0) return;
68
+ getUpdate();
69
+ }, [countUpdate]);
70
+
71
+ const renderItems = async () => {
72
+ let jsxItems = [];
73
+ let date = undefined;
74
+ let countDate = 1;
75
+ for (const item of items) {
76
+ if (!date) {
77
+ date = getFullDate(new Date(item.creation_date));
78
+ } else {
79
+ let newDate = getFullDate(new Date(item.creation_date));
80
+ if (newDate != date) {
81
+ jsxItems.push(
82
+ <div className="group-date" key={"itemDate-" + countDate++}>
83
+ <hr />
84
+ <p>{date}</p>
85
+ <hr />
86
+ </div>
87
+ );
88
+ date = newDate;
89
+ }
90
+ }
91
+
92
+ // manejo de los tipos items
93
+ if (item.user.id_company == current_id_company) {
94
+ jsxItems.push(
95
+ <li className="own-message" key={"item-" + item.id}>
96
+ <CustomTooltip
97
+ className={"tooltip-userName"}
98
+ componentTooltip={<label>{item.user.name}</label>}
99
+ >
100
+ <div className="profile">
101
+ <ReactImageFallback
102
+ src={getProfilePicture(item.user.id, 24, 24)}
103
+ fallbackImage={defaultProfile}
104
+ initialImage={defaultSpinner}
105
+ alt="profile"
106
+ />
107
+ </div>
108
+ </CustomTooltip>
109
+
110
+ {item.value_type == "txt"
111
+ ? renderTXT(item)
112
+ : item.value_type == "img"
113
+ ? renderIMG(item)
114
+ : renderFILE(item)}
115
+ <div className="date">
116
+ <p>{getTime(item.creation_date)}</p>
117
+ </div>
118
+ </li>
119
+ );
120
+ } else {
121
+ jsxItems.push(
122
+ <li className="" key={"item-" + item.id}>
123
+ <CustomTooltip
124
+ className={"tooltip-userName"}
125
+ componentTooltip={<label>{item.user.name}</label>}
126
+ >
127
+ <div className="profile">
128
+ <ReactImageFallback
129
+ src={getProfilePicture(item.user.id, 24, 24)}
130
+ fallbackImage={defaultProfile}
131
+ initialImage={defaultSpinner}
132
+ alt="profile"
133
+ />
134
+ </div>
135
+ </CustomTooltip>
136
+
137
+ {item.value_type == "txt"
138
+ ? renderTXT(item)
139
+ : item.value_type == "img"
140
+ ? renderIMG(item)
141
+ : renderFILE(item)}
142
+ <div className="date">
143
+ <p>{getTime(item.creation_date)}</p>
144
+ </div>
145
+ </li>
146
+ );
147
+ }
148
+ }
149
+ if (date) {
150
+ jsxItems.push(
151
+ <div className="group-date" key={"itemDate-" + countDate++}>
152
+ <hr />
153
+ <p>{date}</p>
154
+ <hr />
155
+ </div>
156
+ );
157
+ }
158
+ setCustomItems(jsxItems);
159
+ };
160
+
161
+ const getBase64 = async (file) => {
162
+ return new Promise((resolve) => {
163
+ const reader = new FileReader();
164
+ reader.addEventListener("loadend", () => {
165
+ let base64 = reader.result.replace(/^data:\w+\/\w+.*;base64,/, "");
166
+ resolve(base64);
167
+ });
168
+ reader.readAsDataURL(file);
169
+ });
170
+ };
171
+
172
+ const createPreview = async (file) => {
173
+ if (
174
+ file.type.split("/")[0] === "image" ||
175
+ file.type.split("/")[0] === "application" ||
176
+ file.type.split("/")[0] === "text"
177
+ ) {
178
+ let base64IMG = await getBase64(file);
179
+ let ext = file.name.split(".")[file.name.split(".").length - 1];
180
+ arrayIMG.data.ext.push(ext);
181
+ arrayIMG.data.nameFile.push(file.name.split(".")[0]);
182
+ const fileB = Buffer.from(base64IMG, "base64");
183
+ const params = {
184
+ ACL: "public-read",
185
+ Body: fileB,
186
+ Bucket: S3_BUCKET,
187
+ Key: `${prop_id_article}/${prop_version_article}/chat/${
188
+ arrayIMG.data.nameFile[0]
189
+ }-${uuidv4()}.${arrayIMG.data.ext[0]}`,
190
+ };
191
+ await myBucket.putObject(params).promise();
192
+ if (file.type.split("/")[0] === "image") {
193
+ if (arrayIMG.data.ext[0] === "svg") {
194
+ onClickInsertar("file", params.Key);
195
+ } else onClickInsertar("img", params.Key);
196
+ } else if (
197
+ file.type.split("/")[0] === "application" ||
198
+ file.type.split("/")[0] === "text"
199
+ ) {
200
+ onClickInsertar("file", params.Key);
201
+ }
202
+ }
203
+ arrayIMG.data.ext.shift();
204
+ arrayIMG.data.nameFile.shift();
205
+ };
206
+
207
+ const getTime = (time) => {
208
+ const fecha = moment(time).format("LT");
209
+ const fechaHoy = new Date();
210
+ if (moment(time).format("L") === moment(fechaHoy).format("L")) {
211
+ return moment(time).format("LT");
212
+ } else return fecha;
213
+ };
214
+
215
+ const renderTXT = (item) => {
216
+ return (
217
+ <div className="body-message">
218
+ <p>{item.value}</p>
219
+ </div>
220
+ );
221
+ };
222
+
223
+ const renderIMG = (item) => {
224
+ return (
225
+ <div className="img-file">
226
+ <a
227
+ href={`https://content-management-images.s3.amazonaws.com/${item.value}`}
228
+ >
229
+ <ReactImageFallback
230
+ src={`https://content-management-images.s3.amazonaws.com/${item.value}`}
231
+ fallbackImage={defaultImage}
232
+ initialImage={defaultSpinner}
233
+ alt={item.value}
234
+ />
235
+ </a>
236
+ </div>
237
+ );
238
+ };
239
+
240
+ const renderFILE = (item) => {
241
+ let ext = item.value.split(".")[item.value.split(".").length - 1];
242
+ let imgFile;
243
+ if (ext === "docx" || ext === "doc" || ext === "docs") {
244
+ imgFile = doc;
245
+ } else if (
246
+ ext === "xls" ||
247
+ ext === "xlsx" ||
248
+ ext === "csv" ||
249
+ ext === "tsv"
250
+ ) {
251
+ imgFile = xls;
252
+ } else if (ext === "svg") {
253
+ imgFile = svg;
254
+ } else if (ext === "pdf") {
255
+ imgFile = "https://eu-phoenix.eu/wp-content/uploads/2022/03/pdf-icon.svg";
256
+ } else imgFile = documentType;
257
+
258
+ return (
259
+ <div className="body-message">
260
+ <a
261
+ href={`https://content-management-images.s3.amazonaws.com/${item.value}`}
262
+ >
263
+ <div>
264
+ <img src={imgFile} alt={item.value}></img>
265
+ <p>{item.value.split("/")[3]}</p>
266
+ </div>
267
+ </a>
268
+ </div>
269
+ );
270
+ };
271
+
272
+ const getInitial = async () => {
273
+ let response = await getBD(
274
+ prop_id_article,
275
+ prop_version_article,
276
+ "initial",
277
+ "",
278
+ Authorization
279
+ );
280
+ if (!response.body) {
281
+ // console.log("=====================");
282
+ // console.log("ERROR INITIAL");
283
+ // console.log("=====================");
284
+ // console.log(response);
285
+ console.log(
286
+ "Unable to retrieve company and user from database, please report this to TI"
287
+ );
288
+ setItems([]);
289
+ } else {
290
+ // console.log("=====================");
291
+ // console.log("ITEMS INICIALES");
292
+ // console.log("=====================");
293
+ // console.log(response.body.items);
294
+ setCurrent_id_company(response.body.current_id_company);
295
+ setItems(response.body.items);
296
+ }
297
+ };
298
+
299
+ const getUpdate = async () => {
300
+ let currentItems = items.slice();
301
+ let dateItem = currentItems[0]?.creation_date ?? "";
302
+ let response = {};
303
+ if (dateItem == "") {
304
+ await getInitial();
305
+ return;
306
+ } else {
307
+ response = await getBD(
308
+ prop_id_article,
309
+ prop_version_article,
310
+ "update_latest",
311
+ dateItem,
312
+ Authorization
313
+ );
314
+ }
315
+ if (!response.body) {
316
+ // console.log("=====================");
317
+ // console.log("ERROR UPDATE LATEST");
318
+ // console.log("=====================");
319
+ console.log(
320
+ "Unable to retrieve company and user from database, please report this to TI"
321
+ );
322
+ setItems(currentItems);
323
+ } else {
324
+ // console.log("=====================");
325
+ // console.log("ITEMS DEL UPDATE LATEST");
326
+ // console.log("=====================");
327
+ // console.log(response.body.items);
328
+ let newItems = response.body.items;
329
+ newItems = newItems.concat(currentItems);
330
+ setItems(newItems);
331
+ }
332
+ // setCountUpdate((prev) => prev + 1);
333
+ };
334
+
335
+ const getFullDate = (date = new Date()) => {
336
+ let dateString = "";
337
+ switch (date.getDay()) {
338
+ case 0:
339
+ dateString += "Dom ";
340
+ break;
341
+ case 1:
342
+ dateString += "Lun ";
343
+ break;
344
+ case 2:
345
+ dateString += "Mar ";
346
+ break;
347
+ case 3:
348
+ dateString += "Mie ";
349
+ break;
350
+ case 4:
351
+ dateString += "Jue ";
352
+ break;
353
+ case 5:
354
+ dateString += "Vie ";
355
+ break;
356
+ case 6:
357
+ dateString += "Sab ";
358
+ break;
359
+ default:
360
+ dateString += "-- ";
361
+ break;
362
+ }
363
+ dateString += date.getDate() + " ";
364
+ switch (date.getMonth() + 1) {
365
+ case 1:
366
+ dateString += "Ene ";
367
+ break;
368
+ case 2:
369
+ dateString += "Feb ";
370
+ break;
371
+ case 3:
372
+ dateString += "Mar ";
373
+ break;
374
+ case 4:
375
+ dateString += "Abr ";
376
+ break;
377
+ case 5:
378
+ dateString += "May ";
379
+ break;
380
+ case 6:
381
+ dateString += "Jun ";
382
+ break;
383
+ case 7:
384
+ dateString += "Jul ";
385
+ break;
386
+ case 8:
387
+ dateString += "Ago ";
388
+ break;
389
+ case 9:
390
+ dateString += "Sep ";
391
+ break;
392
+ case 10:
393
+ dateString += "Oct ";
394
+ break;
395
+ case 11:
396
+ dateString += "Nov ";
397
+ break;
398
+ case 12:
399
+ dateString += "Dic ";
400
+ break;
401
+ }
402
+ dateString += date.getFullYear();
403
+ return dateString;
404
+ };
405
+
406
+ const onClickLoadMore = async () => {
407
+ clearTimeout(processUpdateID);
408
+ let currentItems = items.slice();
409
+ let dateItem = currentItems[currentItems.length - 1]?.creation_date ?? "";
410
+ let response = {};
411
+ if (dateItem == "") {
412
+ await getInitial();
413
+ return;
414
+ } else {
415
+ response = await getBD(
416
+ prop_id_article,
417
+ prop_version_article,
418
+ "load_more",
419
+ dateItem,
420
+ Authorization
421
+ );
422
+ }
423
+ if (!response.body) {
424
+ // console.log("=====================");
425
+ // console.log("ERROR LOAD MORE");
426
+ // console.log("=====================");
427
+ console.log(
428
+ "Unable to retrieve company and user from database, please report this to TI"
429
+ );
430
+ setItems(currentItems);
431
+ } else {
432
+ // console.log("=====================");
433
+ // console.log("ITEMS DEL LOAD MORE");
434
+ // console.log("=====================");
435
+ // console.log(response.body.items);
436
+ let newItems = currentItems.concat(response.body.items);
437
+ setItems(newItems);
438
+ }
439
+ };
440
+ const onClickInsertar = async (valueType, valueInput) => {
441
+ clearTimeout(processUpdateID);
442
+ let currentItems = items.slice();
443
+ let response = await createItemBD(
444
+ prop_id_article,
445
+ prop_version_article,
446
+ valueType,
447
+ valueInput,
448
+ Authorization
449
+ );
450
+ if (!response.body) {
451
+ // console.log("=====================");
452
+ // console.log("ERROR INSERTAR");
453
+ // console.log("=====================");
454
+ console.log(
455
+ "Unable to retrieve company and user from database, please report this to TI"
456
+ );
457
+ setItems(currentItems);
458
+ } else {
459
+ setValueInput("");
460
+ if (currentItems?.length == 0) {
461
+ // console.log("NUEVO ITEM <> NUEVO INITIAL");
462
+ await getInitial();
463
+ } else {
464
+ // console.log("NUEVO ITEM <> NUEVO UPDATE");
465
+ await getUpdate();
466
+ }
467
+ }
468
+ };
469
+ return (
470
+ <>
471
+ <Container>
472
+ <img
473
+ src={chatIcon}
474
+ alt="chat icon"
475
+ className="icon-chat"
476
+ onClick={() => {
477
+ setShowMenu(!showMenu);
478
+ }}
479
+ />
480
+ </Container>
481
+ {showMenu && (
482
+ <Slider id="div-slider" showMenu={showMenu}>
483
+ <button
484
+ onClick={() => {
485
+ setShowMenu(false);
486
+ }}
487
+ className="close"
488
+ >
489
+ <img src={closeChat} alt="close-chat"></img>
490
+ </button>
491
+ <div className="content-chat">
492
+ <button
493
+ onClick={async (event) => onClickLoadMore()}
494
+ className="cargar-mas"
495
+ >
496
+ <img src={iconPlus} alt="Cargar más" />
497
+ cargar más
498
+ </button>
499
+ <ul id="myListChat">{customItems}</ul>
500
+ </div>
501
+ <div className="input-chat">
502
+ <input
503
+ className="send-message"
504
+ placeholder="Escribe Aquí..."
505
+ id="id-input-message"
506
+ onKeyDown={(e) => {
507
+ switch (e.key) {
508
+ case "Enter":
509
+ onClickInsertar("txt", valueInput);
510
+ break;
511
+ default:
512
+ break;
513
+ }
514
+ }}
515
+ value={valueInput}
516
+ onChange={(event) => setValueInput(event.target.value)}
517
+ />
518
+ <input
519
+ type="file"
520
+ id="file"
521
+ accept="image/*,text/*,application/*"
522
+ className="add-picture-input"
523
+ onChange={(e) => {
524
+ createPreview(document.getElementById("file").files[0]);
525
+ }}
526
+ />
527
+ <label htmlFor="file" className={"upload"}>
528
+ <img src={upload} alt="send chat"></img>
529
+ </label>
530
+ <button
531
+ onClick={async () => onClickInsertar("txt", valueInput)}
532
+ className="send"
533
+ >
534
+ <img src={send} alt="send chat"></img>
535
+ </button>
536
+ </div>
537
+ </Slider>
538
+ )}
539
+ </>
540
+ );
541
+ };