Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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