Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
15801 stevensc 1
import React from "react";
2
import ChatMail from "./ChatRoom";
3
import Sidebar from "./Sidebar";
4
import { Modal } from "react-bootstrap";
5
import { axios } from "../../../utils";
6
import Chat from "../chat/Chat";
11347 nelberth 7
import styled from "styled-components";
15801 stevensc 8
import Spinner from "../../../shared/loading-spinner/Spinner";
11347 nelberth 9
 
10
const StyledSpinnerContainer = styled.div`
11
  position: absolute;
12
  left: 0;
13
  top: 0;
14
  width: 100%;
15
  height: 100%;
16
  background: rgba(255, 255, 255, 0.4);
17
  display: flex;
18
  justify-content: center;
19
  align-items: center;
20
  z-index: 300;
21
`;
15801 stevensc 22
export default (props) => {
23
  const defaultPage = { current: 1, last: 1 };
24
  const [conversations, setConversations] = React.useState([]);
25
  const [selectedConversation, setSelectedConversation] = React.useState(null);
26
  const [page, setPage] = React.useState(defaultPage);
27
  const [messages, setMessages] = React.useState([]);
28
  const [isGettingMessages, setIsGettingMessages] = React.useState(false);
29
  const [visible, setVisible] = React.useState(false);
30
  const [inmailPersons, setInmailPersons] = React.useState([]);
31
  const [search, setSearch] = React.useState("");
32
  const [loading, setLoading] = React.useState(false);
33
  const getMessages = async (
34
    conversation = selectedConversation,
35
    _page = page.current,
36
    justPaginate = false
37
  ) => {
38
    try {
39
      const res = await axios.get(
40
        conversation.messages_link + "?page=" + _page
41
      );
42
      if (justPaginate) {
43
        const _messages = [...messages, ...res.data.data];
44
        setMessages(_messages);
45
      } else {
46
        setMessages(res.data.data || []);
47
      }
48
      if (
49
        res.data.pagination &&
50
        res.data.pagination.last &&
51
        res.data.pagination.last !== page.last
52
      ) {
53
        setPage({
54
          ...page,
55
          last: res.data.pagination.last,
56
        });
57
      }
58
    } catch (error) {
59
      console.log(">>: error > ", error);
60
    } finally {
61
      if (isGettingMessages) {
62
        setIsGettingMessages(false);
63
      }
11347 nelberth 64
    }
15801 stevensc 65
  };
66
  const handleChangeConversation = async (conversation) => {
67
    // setPage(defaultPage)
68
    setLoading(true);
69
    setSelectedConversation(null);
70
    setTimeout(() => {
71
      setSelectedConversation(conversation);
72
      setLoading(false);
73
    }, 1000);
74
    // getMessages(conversation, defaultPage.current)
75
  };
11347 nelberth 76
 
15801 stevensc 77
  const handleSend = async (message) => {
78
    if (selectedConversation) {
79
      try {
80
        const params = {
81
          message,
82
        };
83
        const formData = new FormData();
84
        Object.entries(params).map(([key, value]) => {
85
          formData.append(key, value);
86
        });
87
        const res = await axios.post(selectedConversation.send_link, formData);
88
        const _messages = [...messages];
89
        _messages.push(res.data.data);
90
        setMessages(_messages);
91
      } catch (error) {
92
        console.log(">>: err0r > ", error);
93
      } finally {
94
        getMessages();
95
      }
11347 nelberth 96
    }
15801 stevensc 97
  };
11347 nelberth 98
 
15801 stevensc 99
  const getMoreMessages = () => {
100
    if (page.last > page.current) {
101
      let { current } = page;
102
      current += 1;
103
      if (!isGettingMessages) {
104
        setIsGettingMessages(true);
105
        setPage({
106
          ...page,
107
          current,
108
        });
109
        getMessages(selectedConversation, current, true);
110
      }
11347 nelberth 111
    }
15801 stevensc 112
  };
113
  const onClose = () => {
114
    setVisible(false);
115
  };
11347 nelberth 116
 
15801 stevensc 117
  const handleChange = async (e) => {
118
    const value = e.target.value;
119
    setSearch(value);
120
    try {
121
      const res = await axios.get("/helpers/search-people?search=" + value);
122
      if (res.data.success) {
123
        setInmailPersons(res.data.data);
124
      }
125
    } catch (error) {
126
      console.log(">>: error > ", error);
11347 nelberth 127
    }
15801 stevensc 128
  };
11347 nelberth 129
 
15801 stevensc 130
  const handleInmailPerson = (uuid) => {
131
    onClose();
132
    window.location.href = "/inmail/" + uuid;
133
    setTimeout(() => {
134
      window.location.reload();
135
    }, 1000);
136
  };
11347 nelberth 137
 
15801 stevensc 138
  const handleCloseChat = () => {
139
    console.log(">>: close chat");
140
  };
11347 nelberth 141
 
15801 stevensc 142
  return (
143
    <>
144
      {loading && (
145
        <StyledSpinnerContainer>
146
          <Spinner />
147
        </StyledSpinnerContainer>
148
      )}
149
      <Modal show={visible} onHide={onClose}>
150
        <div className="card">
151
          <div className="card-body">
152
            <h3 className="card-title font-weight-bold">Crear sala de Chat</h3>
153
            <div class="form-group">
154
              <label for="search-people">Direccion de email</label>
155
              <input
156
                type="email"
157
                className="form-control"
158
                id="search-people"
159
                aria-describedby="Buscador de personas"
160
                placeholder="Escribe el nombre de la persona"
161
                onChange={handleChange}
162
              />
163
            </div>
164
            <div className="container">
165
              {inmailPersons.map((element) => {
166
                return (
167
                  <div className="row" key={element.value}>
168
                    <div className="col-8">
169
                      <p> {element.text} </p>
11347 nelberth 170
                    </div>
15801 stevensc 171
                    <div className="col-4">
172
                      <button
173
                        className="btn btn-primary"
174
                        onClick={() => handleInmailPerson(element.value)}
175
                      >
176
                        <i className="fa fa-check" />
177
                      </button>
11347 nelberth 178
                    </div>
15801 stevensc 179
                  </div>
180
                );
181
              })}
182
            </div>
183
            <a href="#" onClick={onClose} className="btn btn-danger">
184
              Cerrar
185
            </a>
186
          </div>
187
        </div>
188
      </Modal>
189
      <section className="messages-page">
190
        <div className="messages-sec">
191
          <div className="row">
192
            <div className="col-lg-4 col-md-12 no-pdd">
193
              <div className="chat_contacts">
194
                <h2 className="chat-title">Personas y grupos</h2>
195
                <Sidebar
196
                  onClick={(conversation) =>
197
                    handleChangeConversation(conversation)
198
                  }
199
                  conversations={[...props.chatUsers, ...props.chatGroups]}
200
                  selectedConversation={selectedConversation}
201
                />
202
              </div>
203
            </div>
204
            <div className="col-12 col-md-8">
205
              {!!selectedConversation ? (
206
                <Chat
207
                  entity={selectedConversation}
208
                  onCloseChat={handleCloseChat}
209
                />
210
              ) : (
211
                <div>
212
                  <p>Seleccione un chat</p>
11347 nelberth 213
                </div>
15801 stevensc 214
              )}
215
            </div>
216
          </div>
217
        </div>
218
      </section>
219
    </>
220
  );
221
};