Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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