Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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