Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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