Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3132 | Rev 3604 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3094 stevensc 1
/* eslint-disable react/prop-types */
1 www 2
import React from "react";
3
import { useState, useRef, useEffect } from "react";
4
import styled from "styled-components";
932 stevensc 5
import { axios } from "../../../utils";
1 www 6
import Emojione from "./emojione/Emojione";
7
import SendFileModal from "./send-file-modal/SendFileModal";
8
import ConfirmModal from "../../../shared/confirm-modal/ConfirmModal";
9
import MessageTemplate from "./messageTemplate/MessageTemplate";
10
 
11
const StyledChatHead = styled.div`
12
  .notify {
13
    animation: notify 2s infinite;
14
  }
15
 
16
  @keyframes notify {
17
    0% {
18
      background-color: unset;
19
    }
20
    50% {
21
      background-color: #00b0ff;
22
    }
23
    100% {
24
      background-color: unset;
25
    }
26
  }
27
`;
28
 
29
const StyledShowOptions = styled.div`
30
  height: 342px;
31
  flex-direction: column;
32
  overflow-y: auto;
33
  position: relative;
34
  &.show {
35
    display: flex;
36
  }
37
  &.hide {
38
    display: none;
39
  }
40
  .optionBack {
41
    margin: 1rem 0 0.5rem 1rem;
42
    cursor: pointer;
43
  }
44
  .optionsTab {
45
    &__option {
46
      padding: 0.5rem;
47
      border-bottom: 1px solid #e2e2e2;
48
      cursor: pointer;
49
      &:hover {
50
        background-color: #e2e2e2;
51
      }
52
      &__icon {
53
        margin-right: 0.3rem;
54
      }
55
    }
56
  }
57
  .addPersonToGroupTab {
58
    display: flex;
59
    flex-direction: column;
60
    &__person {
61
      display: flex;
62
      justify-content: space-between;
63
      align-items: center;
64
      padding: 0.2rem 0.5rem;
65
      border-bottom: 1px solid #e2e2e2;
66
    }
67
  }
68
`;
69
 
3131 stevensc 70
const PersonalChat = ({ entity, index, onClose, onMinimize, onRead, not_seen_messages, minimized }) => {
3056 stevensc 71
 
1 www 72
  // entity destructuring
73
  const {
74
    id,
75
    image,
76
    name,
77
    online,
78
    type,
79
    url_get_all_messages,
80
    url_send,
81
    url_upload,
82
    profile,
83
    // group
84
    url_leave,
85
    url_delete,
86
    url_add_user_to_group,
87
    url_get_contact_group_list,
88
    url_get_contacts_availables_for_group,
3056 stevensc 89
  } = entity;
1 www 90
 
91
  // states
92
  const [messages, setMessages] = useState([]);
1298 stevensc 93
  const [responseMessage, setResponseMessage] = useState(null);
1 www 94
  const [oldMessages, setOldMessages] = useState([]);
95
  const [currentPage, setCurrentPage] = useState(1);
96
  const [pages, setPages] = useState(1);
97
  const [showOptions, setShowOptions] = useState(false);
98
  const [optionTab, setOptionTab] = useState("default");
99
  const [availableContactsToAdd, setAvailableContactsToAdd] = useState([]);
100
  const [groupContactsList, setGroupContactsList] = useState([]);
101
  const [confirmModalShow, setConfirmModalShow] = useState(false);
102
  const [showEmojiTab, setShowEmojiTab] = useState(false);
103
  const [shareFileModalShow, setShareFileModalShow] = useState(false);
3122 stevensc 104
  const [loading, setLoading] = useState(false);
1 www 105
 
106
  // refs
107
  const conversationListEl = useRef(null);
108
  const loader = useRef(null);
109
  const modalActionUrl = useRef("");
110
  const chatboxEl = useRef(null);
111
  const textAreaEl = useRef(null);
112
 
113
  // optionTabs
114
  const optionTabs = {
115
    add_person_to_group: "add_person_to_group",
116
    group_contacts_list: "group_contacts_list",
117
    default: "default",
118
  };
119
 
120
  const handleActive = () => {
3122 stevensc 121
    onRead(entity);
3123 stevensc 122
    onMinimize(entity);
1 www 123
  };
124
 
125
  const handleGetMessages = async () => {
3122 stevensc 126
    setLoading(true)
1 www 127
    const response = await axios.get(url_get_all_messages);
128
    const resData = response.data;
129
    if (!resData.success) {
932 stevensc 130
      return ("ha ocurrido un error", resData);
1 www 131
    }
132
    const updatedMessages = [...resData.data.items].reverse();
133
    const newMessages = updatedMessages.reduce((acum, updatedMessage) => {
3089 stevensc 134
      if (messages.findIndex((message) => message.id === updatedMessage.id) === -1) {
1 www 135
        acum = [...acum, updatedMessage];
136
      }
137
      return acum;
138
    }, []);
3089 stevensc 139
 
1 www 140
    if (newMessages.length > 0) {
141
      setMessages([...messages, ...newMessages]);
3122 stevensc 142
      setLoading(false)
1 www 143
      setPages(resData.data.pages);
144
      scrollToBottom();
3090 stevensc 145
    } else {
3089 stevensc 146
      setMessages([...updatedMessages]);
3122 stevensc 147
      setLoading(false)
1 www 148
    }
149
  };
150
 
151
  const handleLoadMore = async () => {
936 stevensc 152
    await axios.get(`${url_get_all_messages}?page=${currentPage}`)
1 www 153
      .then((response) => {
154
        const resData = response.data;
155
        if (resData.success) {
156
          if (resData.data.page > 1) {
157
            const updatedOldMessages = [...resData.data.items].reverse();
158
            setOldMessages([...updatedOldMessages, ...oldMessages]);
986 stevensc 159
            /* scrollDownBy(100); */
1 www 160
          }
161
        }
162
      });
163
  };
164
 
3122 stevensc 165
  const handleCloseChat = () => onClose(entity)
1 www 166
 
167
  const handleChatBoxKeyDown = async (e) => {
168
    if (e.key === "Enter") {
169
      e.preventDefault();
170
      const message = e.target.value;
171
      const formData = new FormData();
172
      formData.append("message", emojione.toShort(message));
2181 stevensc 173
      await axios.post(url_send, formData).then((response) => {
174
        const resData = response.data;
175
        if (resData.success) {
2188 stevensc 176
          let newMessage = resData.data
2186 stevensc 177
 
178
          online
2188 stevensc 179
            ? newMessage = { ...newMessage, not_received: false }
180
            : newMessage = { ...newMessage, not_received: true }
2186 stevensc 181
 
2189 stevensc 182
          setMessages([...messages, newMessage])
2181 stevensc 183
        }
184
      });
1 www 185
      e.target.value = "";
2189 stevensc 186
      /* await handleGetMessages(); */
1 www 187
      setShowEmojiTab(false);
1778 stevensc 188
      setResponseMessage(null)
1 www 189
    }
190
  };
191
 
192
  const handleShowOptions = () => {
3131 stevensc 193
    onMinimize(entity, false);
1 www 194
    setShowOptions(!showOptions);
195
  };
196
 
197
  const handleChangeTab = (tab) => {
198
    setOptionTab(tab);
199
  };
200
 
201
  const handleAddPersonToGroup = async (id) => {
202
    const formData = new FormData();
203
    formData.append("uid", id);
204
    await axios.post(url_add_user_to_group, formData).then((response) => {
205
      const resData = response.data;
206
      if (resData.success) {
207
        loadPersonsAvailable();
208
      }
209
    });
210
  };
211
 
212
  const handleConfirmModalAction = async () => {
3122 stevensc 213
    try {
214
      const { data } = axios.post(modalActionUrl.current)
215
      if (!data.success) console.log('Error in confirm modal action')
216
      return onClose(entity);
217
    } catch (error) {
218
      console.log(error)
219
    }
1 www 220
  };
221
 
222
  const handleObserver = (entities) => {
223
    const target = entities[0];
224
    if (target.isIntersecting) {
225
      setCurrentPage((prevState) => prevState + 1);
226
    }
227
  };
228
 
229
  const scrollToBottom = () => {
3056 stevensc 230
    if (conversationListEl.current) {
1 www 231
      conversationListEl.current.scrollTop =
232
        conversationListEl.current.scrollHeight * 9;
233
    }
234
  };
235
 
236
  const scrollDownBy = (scrollDistance) => {
3056 stevensc 237
    if (conversationListEl.current) {
976 stevensc 238
      conversationListEl.current.scrollTop = scrollDistance;
1 www 239
    }
240
  };
241
 
242
  const handleShowEmojiTab = () => {
243
    setShowEmojiTab(!showEmojiTab);
244
    // smiley_tpl(`${id}`);
245
  };
246
 
247
  const handleClickEmoji = (e) => {
248
    const shortname = e.currentTarget.dataset.shortname;
249
    const currentText = textAreaEl.current.value;
250
    let cursorPosition = textAreaEl.current.selectionStart;
251
    const textBehind = currentText.substring(0, cursorPosition);
252
    const textForward = currentText.substring(cursorPosition);
253
    const unicode = emojione.shortnameToUnicode(shortname);
254
    textAreaEl.current.value = `${textBehind}${unicode}${textForward}`;
255
    textAreaEl.current.focus();
256
    textAreaEl.current.setSelectionRange(
257
      cursorPosition + unicode.length,
258
      cursorPosition + unicode.length
259
    );
260
  };
261
 
262
  // useEffect(() => {
263
  //   setMessages([...oldMessages, ...newMessages]);
264
  // }, [newMessages, oldMessages]);
265
 
266
  // getMessageOnMaximize and subscribe to infinite Loader
267
  useEffect(async () => {
3090 stevensc 268
    let options = {
269
      root: null,
270
      rootMargin: "20px",
271
      treshold: 1.0,
272
    };
273
    const observer = new IntersectionObserver(handleObserver, options);
1 www 274
    if (!minimized) {
275
      await handleGetMessages();
276
      // loader observer
277
      if (loader.current) {
278
        observer.observe(loader.current);
279
      }
280
    }
281
    return () => {
282
      if (loader.current) {
283
        observer.unobserve(loader.current);
284
      }
285
    };
286
  }, [minimized]);
287
 
288
  // LoadMore on change page
289
  useEffect(() => {
932 stevensc 290
    let loadMore = () => handleLoadMore();
928 stevensc 291
    loadMore()
1 www 292
    return () => {
293
      loadMore = null;
294
    };
295
  }, [currentPage]);
296
 
297
  // getMessagesInterval
298
  useEffect(() => {
932 stevensc 299
    if (window.location.pathname === '/group/my-groups') {
38 steven 300
      const items = document.getElementsByClassName('sc-jSgupP')
932 stevensc 301
      if (items && items.length > 0)
302
        items[0].style.display = 'none';
38 steven 303
    }
3122 stevensc 304
  }, [minimized]);
305
 
306
  useEffect(() => {
307
    let timer;
3119 stevensc 308
    if (!minimized && !loading) {
3122 stevensc 309
      timer = setTimeout(() => handleGetMessages(), 1000);
1 www 310
    }
3120 stevensc 311
    return () => {
3122 stevensc 312
      clearTimeout(timer);
313
    };
3119 stevensc 314
  }, [minimized, loading]);
3122 stevensc 315
 
1 www 316
  const handleConfirmModalShow = () => {
317
    setConfirmModalShow(!confirmModalShow);
318
  };
319
 
320
  const handleConfirmModalAccept = () => {
321
    handleConfirmModalAction();
322
  };
323
 
324
  const handleShareFileModalShow = () => {
325
    setShareFileModalShow(!shareFileModalShow);
326
  };
327
 
1300 stevensc 328
  const handleResponseMessage = (element) => {
3059 stevensc 329
    element.mtype === 'text'
330
      ? setResponseMessage(element)
331
      : setResponseMessage({ ...element, m: 'Archivo adjunto' })
332
 
2765 stevensc 333
    textAreaEl.current && textAreaEl.current.focus()
1300 stevensc 334
  };
335
 
1 www 336
  const messagesRender = () => {
337
    return (
338
      <React.Fragment>
339
        {currentPage < pages ? <li ref={loader}>Cargando...</li> : ""}
340
        {oldMessages.map((oldMessage) => (
3088 stevensc 341
          <MessageTemplate time={oldMessage.time} key={oldMessage.id} message={oldMessage} />
1 www 342
        ))}
1215 stevensc 343
        {messages.map((message, i) => {
344
          let currentTime = message.time;
1216 stevensc 345
          let prevMessage = messages[i - 1];
2187 stevensc 346
 
2537 stevensc 347
          const dailys = ["mes", "meses", "semana", "semanas", "dia", 'dias', "año", "años"]
1215 stevensc 348
          const date = new Date(Date.now()).toLocaleDateString()
349
 
1216 stevensc 350
          if (prevMessage !== undefined) {
351
            let prevTime = messages[i - 1].time;
2181 stevensc 352
 
1216 stevensc 353
            if (prevTime !== currentTime && dailys.includes(prevTime.split(' ')[1])) {
354
              return <>
2538 stevensc 355
                {/* <h2 className="text-center date-chat">{date}</h2> */}
1298 stevensc 356
                <MessageTemplate
3088 stevensc 357
                  key={message.id}
1298 stevensc 358
                  message={message}
3088 stevensc 359
                  time={message.time}
1300 stevensc 360
                  setResponseMessage={handleResponseMessage}
1298 stevensc 361
                  responseMessage={responseMessage}
362
                />
1216 stevensc 363
              </>
364
            }
1215 stevensc 365
          }
366
 
1300 stevensc 367
          return <MessageTemplate
3088 stevensc 368
            key={message.id}
1300 stevensc 369
            message={message}
3088 stevensc 370
            time={message.time}
1300 stevensc 371
            setResponseMessage={handleResponseMessage}
372
            responseMessage={responseMessage}
373
          />
1215 stevensc 374
        })}
1 www 375
      </React.Fragment>
376
    );
377
  };
378
 
379
  const optionRender = () => {
380
    switch (optionTab) {
381
      case optionTabs.add_person_to_group:
382
        return addPersonToGroupTab;
383
      case optionTabs.group_contacts_list:
384
        return groupContactsListTab;
385
      default:
386
        return optionsDefaultTab;
387
    }
388
  };
389
 
390
  // useEffect for tabs changing
391
  useEffect(() => {
392
    switch (optionTab) {
393
      case optionTabs.add_person_to_group:
394
        loadPersonsAvailable();
395
        break;
396
      case optionTabs.group_contacts_list:
397
        loadGroupContacts();
398
        break;
399
    }
400
  }, [optionTab]);
401
 
402
  const loadPersonsAvailable = async () => {
403
    await axios.get(url_get_contacts_availables_for_group).then((response) => {
404
      const resData = response.data;
405
      if (resData.success) {
406
        setAvailableContactsToAdd(resData.data);
407
      }
408
    });
409
  };
410
 
411
  const loadGroupContacts = async () => {
412
    await axios.get(url_get_contact_group_list).then((response) => {
413
      const resData = response.data;
414
      if (resData.success) {
415
        setGroupContactsList(resData.data);
416
      }
417
    });
418
  };
419
 
420
  const handleDeletePersonFromGroup = async (urlDeletePersonFromGroup) => {
421
    await axios.post(urlDeletePersonFromGroup).then((response) => {
422
      const resData = response.data;
423
      if (resData.success) {
424
        loadGroupContacts();
425
      }
426
    });
427
  };
428
 
429
  const optionsDefaultTab = (
430
    <React.Fragment>
431
      <span className="optionBack" onClick={() => handleShowOptions()}>
432
        <i className="fa icon-arrow-left"></i>
433
      </span>
434
      <div className="optionsTab">
435
        <ul>
436
          {!!url_get_contact_group_list && (
437
            <li
438
              className="optionsTab__option"
439
              onClick={() => handleChangeTab(optionTabs.group_contacts_list)}
440
            >
441
              <span className="optionsTab__option__icon">
442
                <i className="fa fa-group"></i>
443
              </span>
444
              Integrantes
445
            </li>
446
          )}
447
          {!!url_add_user_to_group && (
448
            <li
449
              className="optionsTab__option"
450
              onClick={() => handleChangeTab(optionTabs.add_person_to_group)}
451
            >
452
              <span className="optionsTab__option__icon">
453
                <i className="fa fa-user-plus"></i>
454
              </span>
455
              Agregar contactos
456
            </li>
457
          )}
458
          {!!url_delete && (
459
            <li
460
              className="optionsTab__option"
461
              style={{ color: "red" }}
462
              onClick={() => {
463
                handleConfirmModalShow();
464
                modalActionUrl.current = url_delete;
465
              }}
466
            >
467
              <span className="optionsTab__option__icon">
468
                <i className="fa fa-trash"></i>
469
              </span>
470
              Eliminar grupo
471
            </li>
472
          )}
473
          {!!url_leave && (
474
            <li
475
              className="optionsTab__option"
476
              style={{ color: "red" }}
477
              onClick={() => {
478
                handleConfirmModalShow();
479
                modalActionUrl.current = url_leave;
480
              }}
481
            >
482
              <span className="optionsTab__option__icon">
483
                <i className="fa fa-user-times"></i>
484
              </span>
485
              Dejar grupo
486
            </li>
487
          )}
488
        </ul>
489
      </div>
490
    </React.Fragment>
491
  );
492
 
493
  const addPersonToGroupTab = (
494
    <React.Fragment>
495
      <span
496
        className="optionBack"
497
        onClick={() => handleChangeTab(optionTabs.default)}
498
      >
499
        <i className="fa icon-arrow-left"></i>
500
      </span>
501
      <div className="addPersonToGroupTab">
502
        {availableContactsToAdd.length ? (
503
          availableContactsToAdd.map(({ image, name, id }) => (
504
            <div className="addPersonToGroupTab__person" key={id}>
2664 stevensc 505
              <div className="d-inline-flex" style={{ gap: '5px' }}>
2663 stevensc 506
                <img
507
                  className="chat-image img-circle pull-left"
508
                  height="36"
509
                  width="36"
510
                  src={image}
511
                  alt="image-image"
512
                />
513
                <div className="name">{name}</div>
514
              </div>
1 www 515
              <span
516
                style={{
517
                  cursor: "pointer",
518
                }}
519
                onClick={() => {
520
                  handleAddPersonToGroup(id);
521
                }}
522
              >
523
                <i className="fa fa-plus-circle"></i>
524
              </span>
525
            </div>
526
          ))
527
        ) : (
528
          <div className="addPersonToGroupTab__person">No hay Contactos</div>
529
        )}
530
      </div>
531
    </React.Fragment>
532
  );
533
 
534
  const groupContactsListTab = (
535
    <React.Fragment>
536
      <span
537
        className="optionBack"
538
        onClick={() => handleChangeTab(optionTabs.default)}
539
      >
540
        <i className="fa icon-arrow-left"></i>
541
      </span>
542
      <div className="addPersonToGroupTab">
543
        {groupContactsList.length ? (
544
          groupContactsList.map(
545
            ({ image, name, url_remove_from_group, id }) => (
546
              <div className="addPersonToGroupTab__person" key={id}>
547
                <div style={{ display: "flex", alignItems: "center" }}>
548
                  <img
549
                    className="chat-image img-circle pull-left"
550
                    height="36"
551
                    width="36"
552
                    src={image}
553
                    alt="image-image"
554
                  />
555
                  <div className="name">{name}</div>
556
                </div>
557
                {url_remove_from_group && (
558
                  <span
559
                    style={{
560
                      cursor: "pointer",
561
                    }}
562
                    onClick={() => {
563
                      handleDeletePersonFromGroup(url_remove_from_group);
564
                    }}
565
                  >
566
                    <i className="fa fa-user-times"></i>
567
                  </span>
568
                )}
569
              </div>
570
            )
571
          )
572
        ) : (
573
          <div className="addPersonToGroupTab__person">No hay Contactos</div>
574
        )}
575
      </div>
576
    </React.Fragment>
577
  );
578
 
579
  const shareFileModal = (
580
    <SendFileModal
581
      show={shareFileModalShow}
582
      onHide={() => {
583
        setShareFileModalShow(false);
584
      }}
585
      urlUpload={url_upload}
586
    />
587
  );
588
 
589
  const userChat = (
590
    <React.Fragment>
3133 stevensc 591
      <div className="chatbox active-chat" style={{display: 'block'}}>
1 www 592
        <div className="chatbox-icon">
593
          <div className="contact-floating red">
594
            <img className="chat-image img-circle pull-left" src={image} />
595
            <small className="unread-msg">2</small>
596
          </div>
597
        </div>
598
        <div className="panel personal-chat">
599
          <StyledChatHead>
3094 stevensc 600
            <div className={`panel-heading chatboxhead ${not_seen_messages ? "notify" : ""}`}>
1 www 601
              <div className="panel-title">
602
                <img
603
                  className="chat-image img-circle pull-left"
604
                  height="36"
605
                  width="36"
606
                  src={image}
607
                  alt="avatar-image"
608
                />
609
                <div className="header-elements">
3056 stevensc 610
                  <a href={profile} target="_blank" rel="noreferrer">
1 www 611
                    {name}
612
                  </a>
613
                  <br />
1188 stevensc 614
                  <small className={`status ${online ? "Online" : "Offline"}`}>
615
                    <b>{online ? "En línea" : "Desconectado"}</b>
1 www 616
                  </small>
617
                  <div className="pull-right options">
618
                    <div
619
                      className="btn-group uploadFile"
620
                      id="uploadFile"
621
                      data-client="'+chatboxtitle+'"
622
                    >
623
                      {/* <span>
624
                      <i className="fa fa-trash"></i>
625
                    </span> */}
626
                    </div>
627
                    <div
628
                      className="btn-group"
932 stevensc 629
                    // onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
630
                    // href="javascript:void(0)"
1 www 631
                    >
632
                      {/* <span>
633
                      <i className="fa fa-trash"></i>
634
                    </span> */}
635
                    </div>
636
                    <div
637
                      className="btn-group"
932 stevensc 638
                    // onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
639
                    // href="javascript:void(0)"
1 www 640
                    >
641
                      <span>
642
                        <i
643
                          className={`fa fa-minus-circle`}
644
                          onClick={handleActive}
645
                        ></i>
646
                      </span>
647
                    </div>
648
                    <div
649
                      className="btn-group"
932 stevensc 650
                    // onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
651
                    // href="javascript:void(0)"
1 www 652
                    >
653
                      <span>
654
                        <i
655
                          className="fa fa-times-circle"
656
                          onClick={handleCloseChat}
657
                        ></i>
658
                      </span>
659
                    </div>
660
                  </div>
661
                </div>
662
              </div>
663
            </div>
664
          </StyledChatHead>
665
          <div
666
            className="panel-body"
667
            style={{ display: !minimized ? "block" : "none" }}
668
          >
669
            <div
670
              id="uploader_'+chatboxtitle+'"
671
              style={{ display: "none", height: "342px" }}
672
            >
673
              <p>
674
                Your browser does not have Flash, Silverlight or HTML5 support.
675
              </p>
676
            </div>
677
            <div className="chat-conversation" style={{ position: "relative" }}>
678
              <div className="reverseChatBox" ref={conversationListEl}>
679
                <ul
680
                  className="conversation-list chatboxcontent"
681
                  id="resultchat_'+chatboxtitle+'"
682
                >
683
                  {messagesRender()}
684
                </ul>
685
              </div>
686
              <div className="wchat-footer wchat-chat-footer chatboxinput">
1301 stevensc 687
                <div id="chatFrom" className="chatFrom">
2577 stevensc 688
                  {
689
                    responseMessage
690
                    &&
691
                    <div className={responseMessage ? "resp_messages-container active" : "resp_messages-container"}>
692
                      <span>{`Respondiendo a ${responseMessage.user_name}`}</span>
693
                      <p>{responseMessage.m}</p>
694
                    </div>
695
                  }
1 www 696
                  <div className="block-wchat">
697
                    <button
698
                      className="icon ti-clip attachment font-24 btn-attach btn-attach uploadFile"
699
                      id="uploadFile"
700
                      onClick={handleShareFileModalShow}
701
                    ></button>
702
                    <button
703
                      className="icon ti-face-smile font-24 btn-emoji"
704
                      id="toggle-emoji"
705
                      onClick={handleShowEmojiTab}
706
                    ></button>
707
                    <div className="input-container">
708
                      <div className="input-emoji">
709
                        <div
710
                          className="input-placeholder"
711
                          style={{ visibility: "hidden", display: "none" }}
712
                        >
713
                          Escribe un mensaje
714
                        </div>
715
                        <textarea
716
                          className="input chatboxtextarea"
717
                          id="chatboxtextarea"
718
                          name="chattxt"
719
                          style={{ resize: "none", height: "20px" }}
720
                          placeholder="Escribe un mensaje"
721
                          onKeyDown={handleChatBoxKeyDown}
722
                          ref={textAreaEl}
3045 stevensc 723
                          onBlur={() => responseMessage && setResponseMessage(null)}
3122 stevensc 724
                          onFocus={() => not_seen_messages && onRead(entity)}
725
                        />
1 www 726
                        <input
727
                          id="to_uname"
728
                          name="to_uname"
729
                          value="'+chatboxtitle+'"
730
                          type="hidden"
731
                        />
732
                        <input
733
                          id="from_uname"
734
                          name="from_uname"
735
                          value="Beenny"
736
                          type="hidden"
737
                        />
738
                      </div>
739
                    </div>
740
                  </div>
741
                </div>
742
                <div className="wchat-box-items-positioning-container">
743
                  <div className="wchat-box-items-overlay-container">
744
                    <div
745
                      className="target-emoji"
746
                      style={{ display: showEmojiTab ? "block" : "none" }}
747
                    >
748
                      <div id={`smileyPanel_${id}`}>
749
                        <div>
750
                          <Emojione onClickEmoji={handleClickEmoji} />
751
                        </div>
752
                      </div>
753
                    </div>
754
                  </div>
755
                </div>
756
              </div>
757
            </div>
758
          </div>
759
        </div>
760
      </div>
761
      {shareFileModal}
762
    </React.Fragment>
763
  );
764
 
765
  const groupChat = (
766
    <React.Fragment>
767
      <div
768
        className="chatbox active-chat"
769
        style={{
770
          bottom: "0px",
771
          right: `${(index + 1) * 295}px`,
772
          zIndes: "1",
773
          display: "block",
774
        }}
775
        id={`chatbox_${id}`}
776
        ref={chatboxEl}
777
      >
778
        <div className="chatbox-icon">
779
          <div className="contact-floating red">
780
            <img className="chat-image img-circle pull-left" src={image} />
781
            <small className="unread-msg">2</small>
782
            {/* <small className="status"'+ status+'></small> */}
783
          </div>
784
        </div>
785
        <div className="panel personal-chat">
786
          <StyledChatHead>
787
            <div
3094 stevensc 788
              className={`panel-heading chatboxhead ${not_seen_messages ? "notify" : ""
932 stevensc 789
                }`}
1 www 790
            >
791
              <div className="panel-title-group">
792
                <img
793
                  className="chat-image img-circle pull-left"
794
                  height="36"
795
                  width="36"
796
                  src="/images/users-group.png"
797
                  alt="avatar-image"
798
                />
799
                <div className="header-elements">
800
                  <p>{name}</p>
801
                  <br />
802
                  <div className="pull-right options">
803
                    <div
804
                      className="btn-group uploadFile"
805
                      id="uploadFile"
806
                      data-client="'+chatboxtitle+'"
807
                    >
808
                      {/* <span>
809
                      <i className="fa fa-trash"></i>
810
                    </span> */}
811
                    </div>
812
                    <div
813
                      className="btn-group"
932 stevensc 814
                    // onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
815
                    // href="javascript:void(0)"
1 www 816
                    >
817
                      {/* <span>
818
                      <i className="fa fa-trash"></i>
819
                    </span> */}
820
                    </div>
821
                    <div
822
                      className="btn-group addUser"
823
                      data-client="8cb2a840-56c2-4f93-9cf1-27ad598acd8f"
824
                      data-name="Grupo de jesus"
825
                    >
826
                      <span>
827
                        <i
828
                          // className="fa fa-user-plus"
829
                          className="fa fa-gear"
830
                          onClick={handleShowOptions}
831
                        ></i>
832
                      </span>
833
                    </div>
834
                    <div
835
                      className="btn-group"
932 stevensc 836
                    // onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
837
                    // href="javascript:void(0)"
1 www 838
                    >
839
                      <span>
840
                        <i
841
                          className={`fa fa-minus-circle`}
842
                          onClick={handleActive}
843
                        ></i>
844
                      </span>
845
                    </div>
846
                    <div
847
                      className="btn-group"
932 stevensc 848
                    // onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
849
                    // href="javascript:void(0)"
1 www 850
                    >
851
                      <span>
852
                        <i
853
                          className="fa fa-times-circle"
854
                          onClick={handleCloseChat}
855
                        ></i>
856
                      </span>
857
                    </div>
858
                  </div>
859
                </div>
860
              </div>
861
            </div>
862
          </StyledChatHead>
863
          <div
864
            className="panel-body"
865
            style={{ display: !minimized ? "block" : "none" }}
866
          >
867
            <StyledShowOptions className={` ${showOptions ? "show" : "hide"}`}>
868
              {optionRender()}
869
            </StyledShowOptions>
870
 
871
            <div
872
              className="chat-conversation"
873
              style={{
874
                display: showOptions ? "none" : "block",
875
                position: "relative",
876
              }}
877
            >
878
              <div className="reverseChatBox" ref={conversationListEl}>
879
                <ul
880
                  className="conversation-list chatboxcontent"
881
                  id="resultchat_'+chatboxtitle+'"
882
                >
883
                  {messagesRender()}
884
                </ul>
885
              </div>
886
              <div className="wchat-footer wchat-chat-footer chatboxinput">
887
                <div id="chatFrom">
888
                  <div className="block-wchat">
889
                    <button
890
                      className="icon ti-clip attachment font-24 btn-attach btn-attach uploadFile"
891
                      id="uploadFile"
892
                      onClick={handleShareFileModalShow}
893
                    ></button>
894
                    <button
895
                      className="icon ti-face-smile font-24 btn-emoji"
896
                      id="toggle-emoji"
897
                      onClick={handleShowEmojiTab}
898
                    ></button>
899
                    <div className="input-container">
900
                      <div className="input-emoji">
901
                        <div
902
                          className="input-placeholder"
903
                          style={{ visibility: "hidden", display: "none" }}
904
                        >
905
                          Escribe un mensaje
906
                        </div>
907
                        <textarea
908
                          className="input chatboxtextarea"
909
                          id="chatboxtextarea"
910
                          name="chattxt"
911
                          style={{ resize: "none", height: "20px" }}
912
                          placeholder="Escribe un mensaje"
913
                          onKeyDown={handleChatBoxKeyDown}
914
                          ref={textAreaEl}
3122 stevensc 915
                          onFocus={() => not_seen_messages && onRead(entity)}
3045 stevensc 916
                          onBlur={() => responseMessage && setResponseMessage(null)}
1 www 917
                        ></textarea>
918
                        <input
919
                          id="to_uname"
920
                          name="to_uname"
921
                          value="'+chatboxtitle+'"
922
                          type="hidden"
923
                        />
924
                        <input
925
                          id="from_uname"
926
                          name="from_uname"
927
                          value="Beenny"
928
                          type="hidden"
929
                        />
930
                      </div>
931
                    </div>
932
                  </div>
933
                </div>
934
                <div className="wchat-box-items-positioning-container">
935
                  <div className="wchat-box-items-overlay-container">
936
                    <div
937
                      className="target-emoji"
938
                      style={{ display: showEmojiTab ? "block" : "none" }}
939
                    >
940
                      <div id={`smileyPanel_${id}`}>
941
                        <div>
942
                          <Emojione onClickEmoji={handleClickEmoji} />
943
                        </div>
944
                      </div>
945
                    </div>
946
                  </div>
947
                </div>
948
              </div>
949
            </div>
950
          </div>
951
        </div>
952
      </div>
953
      <ConfirmModal
954
        show={confirmModalShow}
955
        onClose={handleConfirmModalShow}
956
        onAccept={handleConfirmModalAccept}
957
      />
958
      {shareFileModal}
959
    </React.Fragment>
960
  );
961
 
962
  switch (type) {
963
    case "user":
964
      return userChat;
965
    case "group":
966
      return groupChat;
967
    default:
968
      break;
969
  }
970
};
971
 
3133 stevensc 972
export default React.memo(PersonalChat);