Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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