Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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