Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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