Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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