Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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