Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3071 stevensc 1
/* eslint-disable react/prop-types */
1 www 2
import React from "react";
3
import { useRef, useState, useEffect } from "react";
4
import { useForm } from "react-hook-form";
5
import styled from "styled-components";
3071 stevensc 6
import { axios } from "../../../../utils";
1 www 7
import FormErrorFeedback from "../../../../shared/form-error-feedback/FormErrorFeedback";
8
import Recaptcha from "react-recaptcha";
9
import Spinner from "../../../../shared/loading-spinner/Spinner";
10
import { Link } from "react-router-dom";
662 steven 11
import CryptoJSAesJson from "../../../../utils/crypto-js/cryptojs-aes-format";
1 www 12
 
13
const StyledCheck = styled.div`
14
  display: flex;
15
  flex-direction: column;
16
  justify-content: center;
17
  align-items: center;
18
  img {
19
    width: 100px;
20
    margin-bottom: 1rem;
21
  }
22
  p {
23
    text-align: center;
24
  }
25
`;
26
const StyledSpinnerContainer = styled.div`
27
  position: absolute;
28
  left: 0;
29
  top: 0;
30
  width: 100%;
31
  height: 100%;
32
  background: rgba(255, 255, 255, 0.4);
33
  display: flex;
34
  justify-content: center;
35
  align-items: center;
36
  z-index: 300;
37
`;
38
const Signup = (props) => {
39
  // props destructuging
40
  const { captchaKey, addNotification, aes } = props;
41
 
42
  // React Hook Form
3680 stevensc 43
  const { register, handleSubmit, setError, errors, watch } = useForm({ mode: 'onBlur' });
1 www 44
 
45
  // states
46
  const [termsChecked, setTermsChecked] = useState(false);
47
  const [registered, setRegistered] = useState(false);
48
  const [isLoading, setIsLoading] = useState(false);
49
 
50
  // Recaptcha
51
  const [isVerified, setIsVerified] = useState(false);
52
  const reCaptchaInstance = useRef();
53
  const reCaptchaToken = useRef("");
54
 
55
  useEffect(() => {
56
    reCaptchaInstance.current.reset();
57
  }, []);
58
 
59
  const signupVerifyCallbackHandler = (response) => {
60
    if (response) {
61
      reCaptchaToken.current = response;
62
      setIsVerified(true);
63
    }
64
  };
65
 
66
  const signupExpiredCallbackHandler = () => {
67
    reCaptchaToken.current = "";
68
    setIsVerified(false);
69
  };
70
 
3071 stevensc 71
  const onSubmitHandler = async (data) => {
1 www 72
    setIsLoading(true);
73
    const formData = new FormData();
74
    Object.entries(data).map(([key, value]) => {
75
      if (key === "email" && value)
76
        return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
77
      if (key === "password" && value)
78
        return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
79
      if (key === "confirmation" && value)
80
        return formData.append(key, CryptoJSAesJson.encrypt(value, aes));
81
      formData.append(key, value);
82
    });
83
    formData.append("captcha", reCaptchaToken.current);
84
    await axios.post("/signup", formData).then((response) => {
85
      const resData = response.data;
86
      if (resData.success) {
87
        // window.location.replace(resData.data);
88
        reCaptchaInstance.current.reset();
89
        signupExpiredCallbackHandler();
90
        setRegistered(true);
91
      } else {
92
        const resError = resData.data;
93
        if (resError.constructor.name === "Object") {
94
          Object.entries(resError).map(([key, value]) => {
95
            // if (key in getValues()) {
3071 stevensc 96
            setError(key, {
97
              type: "manual",
98
              message: Array.isArray(value) ? value[0] : value,
99
            });
1 www 100
            // }
101
          });
102
        } else {
103
          addNotification({
104
            style: "danger",
105
            msg: resError,
106
          });
107
        }
108
        reCaptchaInstance.current.reset();
109
        signupVerifyCallbackHandler();
110
      }
111
    })
3071 stevensc 112
      .catch(err => {
113
        ('>>: err > ', err)
114
        addNotification({
115
          style: "error",
116
          msg: 'Disculpe, ha ocurrido un error',
117
        });
118
      })
119
      .finally(() => {
120
        setIsLoading(false);
1 www 121
      });
122
  };
123
 
124
  const handleOnRecaptchaLoad = () => {
125
    reCaptchaToken.current = "";
126
  };
127
 
128
  if (registered) {
129
    return (
130
      <StyledCheck>
131
        <img src="/images/check.png" alt="check" />
132
        <p>
133
          Se ha registrado correctamente. Por favor, active la cuenta desde su
134
          correo
135
        </p>
136
        <Link to="/signin">
137
          <button id="btn-submit" className="sign_in_sec_button">
138
            Entrar
139
          </button>
140
        </Link>
141
      </StyledCheck>
142
    );
143
  }
144
  return (
145
    <React.Fragment>
146
      <h3>Registrarse</h3>
147
      <form onSubmit={handleSubmit(onSubmitHandler)}>
148
        <div className="row">
149
          <div className="col-lg-12 no-pdd">
150
            <div className="inputContainer">
151
              <div className="sn-field">
152
                <input
153
                  type="email"
154
                  name="email"
155
                  ref={register({
156
                    required: "Este campo es requerido",
3680 stevensc 157
                    pattern: {
158
                      value: /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/i,
159
                      message: "Debe ser una dirección de correo electrónico valida"
160
                    }
1 www 161
                  })}
162
                  maxLength="64"
163
                  placeholder="Correo electrónico"
164
                />
165
                <i className="la la-envelope"></i>
166
              </div>
167
              {errors.email && (
168
                <FormErrorFeedback>{errors.email.message}</FormErrorFeedback>
169
              )}
170
            </div>
171
 
172
            {/* <!--sn-field end--> */}
173
          </div>
174
 
175
          <div className="col-lg-12 no-pdd">
176
            <div className="inputContainer">
177
              <div className="sn-field">
178
                <input
179
                  type="text"
180
                  name="first_name"
181
                  ref={register({
182
                    required: "Este campo es requerido",
3680 stevensc 183
                    maxLength: {
184
                      value: 64,
185
                      message: 'Limite de carateres superior al permitido'
186
                    }
1 www 187
                  })}
188
                  placeholder="Nombre"
189
                />
190
                <i className="la la-user"></i>
191
              </div>
192
              {errors.first_name && (
193
                <FormErrorFeedback>
194
                  {errors.first_name.message}
195
                </FormErrorFeedback>
196
              )}
197
            </div>
198
          </div>
199
          <div className="col-lg-12 no-pdd">
200
            <div className="inputContainer">
201
              <div className="sn-field">
202
                <input
203
                  type="text"
204
                  name="last_name"
205
                  ref={register({
206
                    required: "Este campo es requerido",
3680 stevensc 207
                    maxLength: {
208
                      value: 64,
209
                      message: 'Limite de carateres superior al permitido'
210
                    }
1 www 211
                  })}
212
                  placeholder="Apellido"
213
                />
214
                <i className="la la-user"></i>
215
              </div>
216
              {errors.last_name && (
217
                <FormErrorFeedback>
218
                  {errors.last_name.message}
219
                </FormErrorFeedback>
220
              )}
221
            </div>
222
          </div>
223
 
224
          <div className="col-lg-12 no-pdd">
225
            <div className="inputContainer">
226
              <div className="sn-field">
227
                <input
228
                  type="password"
229
                  name="password"
230
                  ref={register({
231
                    required: "Este campo es requerido",
3680 stevensc 232
                    pattern: {
233
                      value: /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
234
                      message: 'Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-'
235
                    }
1 www 236
                  })}
237
                  title="La clave debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-"
238
                  placeholder="Clave"
239
                />
240
                <i className="la la-lock"></i>
241
              </div>
242
              {errors.password && (
243
                <FormErrorFeedback>{errors.password.message}</FormErrorFeedback>
244
              )}
245
            </div>
246
          </div>
247
          <div className="col-lg-12 no-pdd">
248
            <div className="inputContainer">
249
              <div className="sn-field">
250
                <input
251
                  type="password"
252
                  name="confirmation"
253
                  ref={register({
254
                    required: "Este campo es requerido",
3680 stevensc 255
                    validate: (v) => v === watch('password') || 'Las contraseñas deben coincidir'
1 www 256
                  })}
257
                  placeholder="Confirme su clave"
258
                />
259
                <i className="la la-lock"></i>
260
              </div>
261
              {errors.confirmation && (
262
                <FormErrorFeedback>
263
                  {errors.confirmation.message}
264
                </FormErrorFeedback>
265
              )}
266
            </div>
267
          </div>
268
 
269
          <div className="col-lg-12 no-pdd">
270
            <div className="inputContainer">
271
              <div className="checky-sec st2">
272
                <div className="sn-field fgt-sec">
273
                  <input
274
                    type="checkbox"
275
                    name="terms_and_conditions"
276
                    id="terms_and_conditions"
277
                    checked={termsChecked}
278
                    ref={register({
279
                      required: "Este campo es requerido",
280
                    })}
281
                    value="1"
282
                    readOnly
283
                  />
3071 stevensc 284
                  <label htmlFor="terms_and_conditions" onClick={() => setTermsChecked(!termsChecked)}>
1 www 285
                    <span></span>
286
                  </label>
3071 stevensc 287
                  <small onClick={() => setTermsChecked(!termsChecked)}>
3680 stevensc 288
                    Si, acepto los <a href="/terms-and-conditions">Términos y Condiciones.</a>
1 www 289
                  </small>
290
                </div>
291
                {/* <!--fgt-sec end--> */}
292
              </div>
293
              {errors.terms_and_conditions && (
294
                <FormErrorFeedback>
295
                  {errors.terms_and_conditions.message}
296
                </FormErrorFeedback>
297
              )}
298
            </div>
299
          </div>
300
 
301
          <div className="col-lg-12 no-pdd">
302
            <div className="sn-field">
303
              <Recaptcha
304
                sitekey={captchaKey}
305
                verifyCallback={signupVerifyCallbackHandler}
306
                verifyCallbackName="signupVerifyCallbackHandler"
307
                expiredCallback={signupExpiredCallbackHandler}
308
                expiredCallbackName="signupExpiredCallbackHandler"
309
                ref={reCaptchaInstance}
310
                render="explicit"
311
                onloadCallback={handleOnRecaptchaLoad}
312
                hl="es"
313
              />
314
            </div>
315
          </div>
316
 
317
          <div className="col-lg-12 no-pdd">
318
            <button
319
              type="submit"
320
              value="submit"
321
              id="btn-submit"
322
              disabled={!isVerified}
323
            >
324
              Registrarse
325
            </button>
326
          </div>
327
        </div>
328
        {/* <?php echo $this->form()->closeTag($form); ?> */}
329
      </form>
330
      {isLoading ? (
331
        <StyledSpinnerContainer>
332
          <Spinner />
333
        </StyledSpinnerContainer>
334
      ) : (
335
        ""
336
      )}
337
    </React.Fragment>
338
  );
339
};
340
 
341
export default Signup;