Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 1217 | Rev 1300 | 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
 
354
  const messagesRender = () => {
355
    return (
356
      <React.Fragment>
357
        {currentPage < pages ? <li ref={loader}>Cargando...</li> : ""}
358
        {oldMessages.map((oldMessage) => (
359
          <MessageTemplate message={oldMessage} />
360
        ))}
1215 stevensc 361
        {messages.map((message, i) => {
362
          let currentTime = message.time;
1216 stevensc 363
          let prevMessage = messages[i - 1];
1217 stevensc 364
          const dailys = ['mess', 'semana', 'dias', "anio"]
1215 stevensc 365
          const date = new Date(Date.now()).toLocaleDateString()
366
 
1216 stevensc 367
          if (prevMessage !== undefined) {
368
            let prevTime = messages[i - 1].time;
369
 
370
            if (prevTime !== currentTime && dailys.includes(prevTime.split(' ')[1])) {
371
              return <>
1217 stevensc 372
                <h2 className="text-center">{date}</h2>
1298 stevensc 373
                <MessageTemplate
374
                  message={message}
375
                  setResponseMessage={setResponseMessage}
376
                  responseMessage={responseMessage}
377
                />
1216 stevensc 378
              </>
379
            }
1215 stevensc 380
          }
381
 
382
          return <MessageTemplate message={message} />
383
        })}
1 www 384
      </React.Fragment>
385
    );
386
  };
387
 
388
  const optionRender = () => {
389
    switch (optionTab) {
390
      case optionTabs.add_person_to_group:
391
        return addPersonToGroupTab;
392
      case optionTabs.group_contacts_list:
393
        return groupContactsListTab;
394
      default:
395
        return optionsDefaultTab;
396
    }
397
  };
398
 
399
  // useEffect for tabs changing
400
  useEffect(() => {
401
    switch (optionTab) {
402
      case optionTabs.add_person_to_group:
403
        loadPersonsAvailable();
404
        break;
405
      case optionTabs.group_contacts_list:
406
        loadGroupContacts();
407
      default:
408
        break;
409
    }
410
  }, [optionTab]);
411
 
412
  const loadPersonsAvailable = async () => {
413
    setOptionsLoading(true);
414
    await axios.get(url_get_contacts_availables_for_group).then((response) => {
415
      const resData = response.data;
416
      if (resData.success) {
417
        setAvailableContactsToAdd(resData.data);
418
      }
419
    });
420
    setOptionsLoading(false);
421
  };
422
 
423
  const loadGroupContacts = async () => {
424
    setOptionsLoading(true);
425
    await axios.get(url_get_contact_group_list).then((response) => {
426
      const resData = response.data;
427
      if (resData.success) {
428
        setGroupContactsList(resData.data);
429
      }
430
    });
431
    setOptionsLoading(false);
432
  };
433
 
434
  const handleDeletePersonFromGroup = async (urlDeletePersonFromGroup) => {
435
    await axios.post(urlDeletePersonFromGroup).then((response) => {
436
      const resData = response.data;
437
      if (resData.success) {
438
        loadGroupContacts();
439
      }
440
    });
441
  };
442
 
443
  const optionsDefaultTab = (
444
    <React.Fragment>
445
      <span className="optionBack" onClick={() => handleShowOptions()}>
446
        <i className="fa icon-arrow-left"></i>
447
      </span>
448
      <div className="optionsTab">
449
        <ul>
450
          {!!url_get_contact_group_list && (
451
            <li
452
              className="optionsTab__option"
453
              onClick={() => handleChangeTab(optionTabs.group_contacts_list)}
454
            >
455
              <span className="optionsTab__option__icon">
456
                <i className="fa fa-group"></i>
457
              </span>
458
              Integrantes
459
            </li>
460
          )}
461
          {!!url_add_user_to_group && (
462
            <li
463
              className="optionsTab__option"
464
              onClick={() => handleChangeTab(optionTabs.add_person_to_group)}
465
            >
466
              <span className="optionsTab__option__icon">
467
                <i className="fa fa-user-plus"></i>
468
              </span>
469
              Agregar contactos
470
            </li>
471
          )}
472
          {!!url_delete && (
473
            <li
474
              className="optionsTab__option"
475
              style={{ color: "red" }}
476
              onClick={() => {
477
                handleConfirmModalShow();
478
                modalActionUrl.current = url_delete;
479
              }}
480
            >
481
              <span className="optionsTab__option__icon">
482
                <i className="fa fa-trash"></i>
483
              </span>
484
              Eliminar grupo
485
            </li>
486
          )}
487
          {!!url_leave && (
488
            <li
489
              className="optionsTab__option"
490
              style={{ color: "red" }}
491
              onClick={() => {
492
                handleConfirmModalShow();
493
                modalActionUrl.current = url_leave;
494
              }}
495
            >
496
              <span className="optionsTab__option__icon">
497
                <i className="fa fa-user-times"></i>
498
              </span>
499
              Dejar grupo
500
            </li>
501
          )}
502
        </ul>
503
      </div>
504
    </React.Fragment>
505
  );
506
 
507
  const addPersonToGroupTab = (
508
    <React.Fragment>
509
      <span
510
        className="optionBack"
511
        onClick={() => handleChangeTab(optionTabs.default)}
512
      >
513
        <i className="fa icon-arrow-left"></i>
514
      </span>
515
      <div className="addPersonToGroupTab">
516
        {availableContactsToAdd.length ? (
517
          availableContactsToAdd.map(({ image, name, id }) => (
518
            <div className="addPersonToGroupTab__person" key={id}>
519
              <img
520
                className="chat-image img-circle pull-left"
521
                height="36"
522
                width="36"
523
                src={image}
524
                alt="image-image"
525
              />
526
              <div className="name">{name}</div>
527
              <span
528
                style={{
529
                  cursor: "pointer",
530
                }}
531
                onClick={() => {
532
                  handleAddPersonToGroup(id);
533
                }}
534
              >
535
                <i className="fa fa-plus-circle"></i>
536
              </span>
537
            </div>
538
          ))
539
        ) : (
540
          <div className="addPersonToGroupTab__person">No hay Contactos</div>
541
        )}
542
      </div>
543
    </React.Fragment>
544
  );
545
 
546
  const groupContactsListTab = (
547
    <React.Fragment>
548
      <span
549
        className="optionBack"
550
        onClick={() => handleChangeTab(optionTabs.default)}
551
      >
552
        <i className="fa icon-arrow-left"></i>
553
      </span>
554
      <div className="addPersonToGroupTab">
555
        {groupContactsList.length ? (
556
          groupContactsList.map(
557
            ({ image, name, url_remove_from_group, id }) => (
558
              <div className="addPersonToGroupTab__person" key={id}>
559
                <div style={{ display: "flex", alignItems: "center" }}>
560
                  <img
561
                    className="chat-image img-circle pull-left"
562
                    height="36"
563
                    width="36"
564
                    src={image}
565
                    alt="image-image"
566
                  />
567
                  <div className="name">{name}</div>
568
                </div>
569
                {url_remove_from_group && (
570
                  <span
571
                    style={{
572
                      cursor: "pointer",
573
                    }}
574
                    onClick={() => {
575
                      handleDeletePersonFromGroup(url_remove_from_group);
576
                    }}
577
                  >
578
                    <i className="fa fa-user-times"></i>
579
                  </span>
580
                )}
581
              </div>
582
            )
583
          )
584
        ) : (
585
          <div className="addPersonToGroupTab__person">No hay Contactos</div>
586
        )}
587
      </div>
588
    </React.Fragment>
589
  );
590
 
591
  const shareFileModal = (
592
    <SendFileModal
593
      show={shareFileModalShow}
594
      onHide={() => {
595
        setShareFileModalShow(false);
596
      }}
597
      urlUpload={url_upload}
598
    />
599
  );
600
 
601
  const userChat = (
602
    <React.Fragment>
603
      <div
604
        className="chatbox active-chat"
605
        style={{
606
          bottom: "0px",
607
          right: `${(index + 1) * 295}px`,
11 steven 608
          zIndex: "1",
1 www 609
          display: "block",
610
        }}
611
      >
612
        <div className="chatbox-icon">
613
          <div className="contact-floating red">
614
            <img className="chat-image img-circle pull-left" src={image} />
615
            <small className="unread-msg">2</small>
616
            {/* <small className="status"'+ status+'></small> */}
617
          </div>
618
        </div>
619
        <div className="panel personal-chat">
620
          <StyledChatHead>
621
            <div
932 stevensc 622
              className={`panel-heading chatboxhead ${unsee_messages ? "notify" : ""
623
                }`}
1 www 624
            >
625
              <div className="panel-title">
626
                <img
627
                  className="chat-image img-circle pull-left"
628
                  height="36"
629
                  width="36"
630
                  src={image}
631
                  alt="avatar-image"
632
                />
633
                <div className="header-elements">
634
                  <a href={profile} target="_blank">
635
                    {name}
636
                  </a>
637
                  <br />
1188 stevensc 638
                  <small className={`status ${online ? "Online" : "Offline"}`}>
639
                    <b>{online ? "En línea" : "Desconectado"}</b>
1 www 640
                  </small>
641
                  <div className="pull-right options">
642
                    <div
643
                      className="btn-group uploadFile"
644
                      id="uploadFile"
645
                      data-client="'+chatboxtitle+'"
646
                    >
647
                      {/* <span>
648
                      <i className="fa fa-trash"></i>
649
                    </span> */}
650
                    </div>
651
                    <div
652
                      className="btn-group"
932 stevensc 653
                    // onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
654
                    // href="javascript:void(0)"
1 www 655
                    >
656
                      {/* <span>
657
                      <i className="fa fa-trash"></i>
658
                    </span> */}
659
                    </div>
660
                    <div
661
                      className="btn-group"
932 stevensc 662
                    // onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
663
                    // href="javascript:void(0)"
1 www 664
                    >
665
                      <span>
666
                        <i
667
                          className={`fa fa-minus-circle`}
668
                          onClick={handleActive}
669
                        ></i>
670
                      </span>
671
                    </div>
672
                    <div
673
                      className="btn-group"
932 stevensc 674
                    // onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
675
                    // href="javascript:void(0)"
1 www 676
                    >
677
                      <span>
678
                        <i
679
                          className="fa fa-times-circle"
680
                          onClick={handleCloseChat}
681
                        ></i>
682
                      </span>
683
                    </div>
684
                  </div>
685
                </div>
686
              </div>
687
            </div>
688
          </StyledChatHead>
689
          <div
690
            className="panel-body"
691
            style={{ display: !minimized ? "block" : "none" }}
692
          >
693
            <div
694
              id="uploader_'+chatboxtitle+'"
695
              style={{ display: "none", height: "342px" }}
696
            >
697
              <p>
698
                Your browser does not have Flash, Silverlight or HTML5 support.
699
              </p>
700
            </div>
701
            <div className="chat-conversation" style={{ position: "relative" }}>
702
              <div className="reverseChatBox" ref={conversationListEl}>
703
                <ul
704
                  className="conversation-list chatboxcontent"
705
                  id="resultchat_'+chatboxtitle+'"
706
                >
707
                  {messagesRender()}
708
                </ul>
709
              </div>
710
              <div className="wchat-footer wchat-chat-footer chatboxinput">
711
                <div id="chatFrom">
1298 stevensc 712
                  <div className={responseMessage ? "resp_messages-container active" : "resp_messages-container"}>
713
                    {
714
                      responseMessage
715
                      &&
716
                      <>
717
                        <span>{responseMessage.user_name}</span>
718
                        <p>{responseMessage.m}</p>
719
                      </>
720
                    }
721
                  </div>
1 www 722
                  <div className="block-wchat">
723
                    <button
724
                      className="icon ti-clip attachment font-24 btn-attach btn-attach uploadFile"
725
                      id="uploadFile"
726
                      onClick={handleShareFileModalShow}
727
                    ></button>
728
                    <button
729
                      className="icon ti-face-smile font-24 btn-emoji"
730
                      id="toggle-emoji"
731
                      onClick={handleShowEmojiTab}
732
                    ></button>
733
                    <div className="input-container">
734
                      <div className="input-emoji">
735
                        <div
736
                          className="input-placeholder"
737
                          style={{ visibility: "hidden", display: "none" }}
738
                        >
739
                          Escribe un mensaje
740
                        </div>
741
                        <textarea
742
                          className="input chatboxtextarea"
743
                          id="chatboxtextarea"
744
                          name="chattxt"
745
                          style={{ resize: "none", height: "20px" }}
746
                          placeholder="Escribe un mensaje"
747
                          onKeyDown={handleChatBoxKeyDown}
748
                          ref={textAreaEl}
749
                        ></textarea>
750
                        <input
751
                          id="to_uname"
752
                          name="to_uname"
753
                          value="'+chatboxtitle+'"
754
                          type="hidden"
755
                        />
756
                        <input
757
                          id="from_uname"
758
                          name="from_uname"
759
                          value="Beenny"
760
                          type="hidden"
761
                        />
762
                      </div>
763
                    </div>
764
                  </div>
765
                </div>
766
                <div className="wchat-box-items-positioning-container">
767
                  <div className="wchat-box-items-overlay-container">
768
                    <div
769
                      className="target-emoji"
770
                      style={{ display: showEmojiTab ? "block" : "none" }}
771
                    >
772
                      <div id={`smileyPanel_${id}`}>
773
                        <div>
774
                          <Emojione onClickEmoji={handleClickEmoji} />
775
                        </div>
776
                      </div>
777
                    </div>
778
                  </div>
779
                </div>
780
              </div>
781
            </div>
782
          </div>
783
        </div>
784
      </div>
785
      {shareFileModal}
786
    </React.Fragment>
787
  );
788
 
789
  const groupChat = (
790
    <React.Fragment>
791
      <div
792
        className="chatbox active-chat"
793
        style={{
794
          bottom: "0px",
795
          right: `${(index + 1) * 295}px`,
796
          zIndes: "1",
797
          display: "block",
798
        }}
799
        id={`chatbox_${id}`}
800
        ref={chatboxEl}
801
      >
802
        <div className="chatbox-icon">
803
          <div className="contact-floating red">
804
            <img className="chat-image img-circle pull-left" src={image} />
805
            <small className="unread-msg">2</small>
806
            {/* <small className="status"'+ status+'></small> */}
807
          </div>
808
        </div>
809
        <div className="panel personal-chat">
810
          <StyledChatHead>
811
            <div
932 stevensc 812
              className={`panel-heading chatboxhead ${unsee_messages ? "notify" : ""
813
                }`}
1 www 814
            >
815
              <div className="panel-title-group">
816
                <img
817
                  className="chat-image img-circle pull-left"
818
                  height="36"
819
                  width="36"
820
                  src="/images/users-group.png"
821
                  alt="avatar-image"
822
                />
823
                <div className="header-elements">
824
                  <p>{name}</p>
825
                  <br />
826
                  <div className="pull-right options">
827
                    <div
828
                      className="btn-group uploadFile"
829
                      id="uploadFile"
830
                      data-client="'+chatboxtitle+'"
831
                    >
832
                      {/* <span>
833
                      <i className="fa fa-trash"></i>
834
                    </span> */}
835
                    </div>
836
                    <div
837
                      className="btn-group"
932 stevensc 838
                    // onClick="javascript:clearHistory(\''+chatboxtitle+'\')"
839
                    // href="javascript:void(0)"
1 www 840
                    >
841
                      {/* <span>
842
                      <i className="fa fa-trash"></i>
843
                    </span> */}
844
                    </div>
845
                    <div
846
                      className="btn-group addUser"
847
                      data-client="8cb2a840-56c2-4f93-9cf1-27ad598acd8f"
848
                      data-name="Grupo de jesus"
849
                    >
850
                      <span>
851
                        <i
852
                          // className="fa fa-user-plus"
853
                          className="fa fa-gear"
854
                          onClick={handleShowOptions}
855
                        ></i>
856
                      </span>
857
                    </div>
858
                    <div
859
                      className="btn-group"
932 stevensc 860
                    // onClick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')"
861
                    // href="javascript:void(0)"
1 www 862
                    >
863
                      <span>
864
                        <i
865
                          className={`fa fa-minus-circle`}
866
                          onClick={handleActive}
867
                        ></i>
868
                      </span>
869
                    </div>
870
                    <div
871
                      className="btn-group"
932 stevensc 872
                    // onClick="javascript:closeChatBox(\''+chatboxtitle+'\')"
873
                    // href="javascript:void(0)"
1 www 874
                    >
875
                      <span>
876
                        <i
877
                          className="fa fa-times-circle"
878
                          onClick={handleCloseChat}
879
                        ></i>
880
                      </span>
881
                    </div>
882
                  </div>
883
                </div>
884
              </div>
885
            </div>
886
          </StyledChatHead>
887
          <div
888
            className="panel-body"
889
            style={{ display: !minimized ? "block" : "none" }}
890
          >
891
            <StyledShowOptions className={` ${showOptions ? "show" : "hide"}`}>
892
              {optionRender()}
893
            </StyledShowOptions>
894
 
895
            <div
896
              className="chat-conversation"
897
              style={{
898
                display: showOptions ? "none" : "block",
899
                position: "relative",
900
              }}
901
            >
902
              <div className="reverseChatBox" ref={conversationListEl}>
903
                <ul
904
                  className="conversation-list chatboxcontent"
905
                  id="resultchat_'+chatboxtitle+'"
906
                >
907
                  {messagesRender()}
908
                </ul>
909
              </div>
910
              <div className="wchat-footer wchat-chat-footer chatboxinput">
911
                <div id="chatFrom">
912
                  <div className="block-wchat">
913
                    <button
914
                      className="icon ti-clip attachment font-24 btn-attach btn-attach uploadFile"
915
                      id="uploadFile"
916
                      onClick={handleShareFileModalShow}
917
                    ></button>
918
                    <button
919
                      className="icon ti-face-smile font-24 btn-emoji"
920
                      id="toggle-emoji"
921
                      onClick={handleShowEmojiTab}
922
                    ></button>
923
                    <div className="input-container">
924
                      <div className="input-emoji">
925
                        <div
926
                          className="input-placeholder"
927
                          style={{ visibility: "hidden", display: "none" }}
928
                        >
929
                          Escribe un mensaje
930
                        </div>
931
                        <textarea
932
                          className="input chatboxtextarea"
933
                          id="chatboxtextarea"
934
                          name="chattxt"
935
                          style={{ resize: "none", height: "20px" }}
936
                          placeholder="Escribe un mensaje"
937
                          onKeyDown={handleChatBoxKeyDown}
938
                          ref={textAreaEl}
939
                        ></textarea>
940
                        <input
941
                          id="to_uname"
942
                          name="to_uname"
943
                          value="'+chatboxtitle+'"
944
                          type="hidden"
945
                        />
946
                        <input
947
                          id="from_uname"
948
                          name="from_uname"
949
                          value="Beenny"
950
                          type="hidden"
951
                        />
952
                      </div>
953
                    </div>
954
                  </div>
955
                </div>
956
                <div className="wchat-box-items-positioning-container">
957
                  <div className="wchat-box-items-overlay-container">
958
                    <div
959
                      className="target-emoji"
960
                      style={{ display: showEmojiTab ? "block" : "none" }}
961
                    >
962
                      <div id={`smileyPanel_${id}`}>
963
                        <div>
964
                          <Emojione onClickEmoji={handleClickEmoji} />
965
                        </div>
966
                      </div>
967
                    </div>
968
                  </div>
969
                </div>
970
              </div>
971
            </div>
972
          </div>
973
        </div>
974
      </div>
975
      <ConfirmModal
976
        show={confirmModalShow}
977
        onClose={handleConfirmModalShow}
978
        onAccept={handleConfirmModalAccept}
979
      />
980
      {shareFileModal}
981
    </React.Fragment>
982
  );
983
 
984
  switch (type) {
985
    case "user":
986
      return userChat;
987
    case "group":
988
      return groupChat;
989
    default:
990
      break;
991
  }
992
};
993
 
994
export default PersonalChat;