Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 655 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
import React from "react";
2
import { useRef, useState, useEffect } from "react";
3
import { useForm } from "react-hook-form";
4
import styled from "styled-components";
5
import {axios} from "../../../../utils";
6
import FormErrorFeedback from "../../../../shared/form-error-feedback/FormErrorFeedback";
7
import Recaptcha from "react-recaptcha";
8
import Spinner from "../../../../shared/loading-spinner/Spinner";
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
`;
22
 
23
const Login = (props) => {
24
  // props destructuring
25
  const {
26
    captchaKey,
27
    addNotification,
28
    facebookOauth,
29
    twitterOauth,
30
    googleOauth,
31
    aes,
32
  } = props;
33
 
34
  const {
35
    register,
36
    handleSubmit,
37
    errors,
38
    setError,
39
    clearErrors,
40
    getValues,
41
    setValue,
42
  } = useForm();
43
 
44
  // Recaptcha
45
  const reCaptchaToken = useRef("");
46
  const [isVerified, setIsVerified] = useState(false);
47
  const reCaptchaInstance = useRef();
48
 
49
  // states
50
  const [rememberChecked, setRememberChecked] = useState(false);
51
  const [isLoading, setIsLoading] = useState(false);
52
 
53
  useEffect(() => {
54
    reCaptchaInstance.current.reset();
55
  }, []);
56
 
57
  const onSubmitHandler = async (data, event) => {
58
    // setIsLoading(true);
59
    const formData = new FormData();
60
    Object.entries(data).map(([key, value]) => {
61
      if (key === "email" && value)
62
        return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
63
      if (key === "password" && value)
64
        return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
65
      if (value) formData.append(key, value);
66
    });
67
    formData.append("captcha", reCaptchaToken.current);
68
    await axios
69
      .post("/signin", formData)
70
      .then((response) => {
71
        const resData = response.data;
72
        if (resData.success) {
73
          window.location.replace(resData.data);
74
          event.target.reset();
75
        } else {
76
          setIsLoading(false);
77
          const resError = resData.data;
78
          if (resError.constructor.name === "Object") {
79
            Object.entries(resError).map(([key, value]) => {
80
              if (key in getValues()) {
81
                setError(key, {
82
                  type: "manual",
83
                  message: Array.isArray(value) ? value[0] : value,
84
                });
85
              }
86
            });
87
          } else {
88
            addNotification({
89
              style: "danger",
90
              msg: resError,
91
            });
92
          }
93
        }
94
      })
95
      .catch((error) => {
96
        setIsLoading(false);
97
      });
98
    reCaptchaInstance.current.reset();
99
    loginExpiredCallbackHandler();
100
    // setIsLoading(false);
101
    setValue("password", "");
102
  };
103
 
104
  const loginVerifyCallbackHandler = (response) => {
105
    reCaptchaToken.current = response;
106
    setIsVerified(true);
107
  };
108
 
109
  const loginExpiredCallbackHandler = () => {
110
    reCaptchaToken.current = "";
111
    setIsVerified(false);
112
  };
113
  const handleOnRecaptchaLoad = () => {
114
    reCaptchaToken.current = "";
115
  };
116
 
117
  const getRedirectUrl = async (endpoint) => {
118
    try {
119
      const res = await axios.get(endpoint)
120
      if(res.data && res.data.data){
121
        window.location.href = res.data.data
122
      }
123
    } catch (error) {
124
       ('>>: error > ', error)
125
    }
126
  }
127
  return (
128
    <React.Fragment>
129
      <h3>Entrar</h3>
130
      <form onSubmit={handleSubmit(onSubmitHandler)}>
131
        <div className="row">
132
          <div className="col-lg-12 no-pdd">
133
            <div className="inputContainer">
134
              <div className="sn-field">
135
                <input
136
                  type="email"
137
                  name="email"
138
                  ref={register({
139
                    required: "Este campo es requerido",
140
                  })}
141
                  placeholder="Correo electrónico"
142
                  maxLength="64"
143
                  // onChange={() => clearErrors("email")}
144
                />
145
                <i className="la la-envelope"></i>
146
              </div>
147
              {errors.email && (
148
                <FormErrorFeedback>{errors.email.message}</FormErrorFeedback>
149
              )}
150
            </div>
151
          </div>
152
          <div className="col-lg-12 no-pdd">
153
            <div className="inputContainer">
154
              <div className="sn-field">
155
                <input
156
                  type="password"
157
                  name="password"
158
                  // pattern="^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$"
159
                  ref={register({
160
                    required: "Este campo es requerido",
161
                  })}
162
                  placeholder="Clave"
163
                  maxLength="16"
164
                />
165
                <i className="la la-lock"></i>
166
              </div>
167
              {errors.password && (
168
                <FormErrorFeedback>{errors.password.message}</FormErrorFeedback>
169
              )}
170
            </div>
171
          </div>
172
 
173
          <div className="col-lg-12 no-pdd">
174
            <div className="inputContainer">
175
              <div className="checky-sec">
176
                <div className="fgt-sec">
177
                  <input
178
                    type="checkbox"
179
                    name="remember"
180
                    id="remember"
181
                    checked={rememberChecked}
182
                    ref={register}
183
                    value="1"
184
                    readOnly
185
                  />
186
                  <label
187
                    forhtml="remember"
188
                    onClick={() => setRememberChecked(!rememberChecked)}
189
                  >
190
                    <span></span>
191
                  </label>
192
                  <small onClick={() => setRememberChecked(!rememberChecked)}>
193
                    Recuerdame
194
                  </small>
195
                </div>
196
              </div>
197
            </div>
198
          </div>
199
 
200
          <div className="col-lg-12 no-pdd">
201
            <div className="sn-field border">
202
              <Recaptcha
203
                sitekey={captchaKey}
204
                verifyCallback={loginVerifyCallbackHandler}
205
                verifyCallbackName="loginVerifyCallbackHandler"
206
                expiredCallback={loginExpiredCallbackHandler}
207
                expiredCallbackName="loginExpiredCallbackHandler"
208
                ref={reCaptchaInstance}
209
                render="explicit"
210
                onloadCallback={handleOnRecaptchaLoad}
211
                hl="es"
212
              />
213
            </div>
214
          </div>
215
          <div className="col-lg-12 no-pdd"></div>
216
          <div className="col-lg-12 no-pdd">
217
            <button
218
              type="submit"
219
              value="submit"
220
              id="btn-submit"
221
              disabled={!isVerified}
222
            >
223
              Entrar
224
            </button>
225
          </div>
226
        </div>
227
      </form>
228
      {
229
        window.location.hostname.includes('dev') && (
230
          <div className="login-resources">
231
            <h4>Entrar usando su red social</h4>
232
            <ul>
233
              <li>
234
                <a onClick={() => getRedirectUrl(facebookOauth)}
235
                title=""
236
                className="cursor-pointer fb text-white">
237
                  <i className="fa fa-facebook"></i> FACEBOOK
238
                </a>
239
              </li>
240
              <li>
241
                <a
242
                  onClick={() => getRedirectUrl(twitterOauth)}
243
                  title=""
244
                  className="cursor-pointer tw btn-connect-social-media text-white"
245
                >
246
                  <i className="fa fa-twitter"></i> TWITTER
247
                </a>
248
              </li>
249
              <li
250
                className="bg-secondary"
251
              >
252
                <a
253
                  onClick={() => getRedirectUrl(googleOauth)}
254
                  title=""
255
                  className="cursor-pointer go btn-connect-social-media text-white"
256
                >
257
                  <i className="fa fa-google"></i> GOOGLE
258
                </a>
259
              </li>
260
            </ul>
261
          </div>
262
        )
263
      }
264
      {isLoading ? (
265
        <StyledSpinnerContainer>
266
          <Spinner />
267
        </StyledSpinnerContainer>
268
      ) : (
269
        ""
270
      )}
271
    </React.Fragment>
272
  );
273
};
274
 
275
export default Login;