Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6511 | Rev 6531 | 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 { useForm } from 'react-hook-form'
6511 stevensc 4
import { useDispatch, useSelector } from 'react-redux'
6509 stevensc 5
import Recaptcha from 'react-recaptcha'
6
import cryptoJsAesJson from '../../../utils/crypto-js/cryptojs-aes-format'
7
 
6513 stevensc 8
import { login } from '../../../redux/auth/auth.actions'
9
import { addNotification } from '../../../redux/notification/notification.actions'
10
 
6509 stevensc 11
import Spinner from '../../../components/UI/Spinner'
12
import FormErrorFeedback from '../../../components/UI/FormErrorFeedback'
13
 
14
const Login = ({
15
  facebookOauth = '/signin/facebook',
16
  twitterOauth = '/signin/twitter',
17
  googleOauth = '/signin/google',
18
}) => {
19
  const { site_key, aes, defaultNetwork } = useSelector(({ auth }) => auth)
20
  const [rememberChecked, setRememberChecked] = useState(false)
21
  const [isLoading, setIsLoading] = useState(false)
22
  const [isVerified, setIsVerified] = useState(false)
23
 
24
  const reCaptchaToken = useRef('')
6511 stevensc 25
  const reCaptchaInstance = useRef(null)
6509 stevensc 26
 
6511 stevensc 27
  const dispatch = useDispatch()
28
 
6509 stevensc 29
  const { register, handleSubmit, errors, setError, getValues, setValue } =
30
    useForm({ mode: 'onBlur' })
31
 
32
  useEffect(() => {
33
    reCaptchaInstance.current?.reset()
34
  }, [])
35
 
36
  const onSubmitHandler = async (data, event) => {
37
    const formData = new FormData()
38
    Object.entries(data).map(([key, value]) => {
39
      if (key === 'email' && value)
40
        return formData.append(key, cryptoJsAesJson.encrypt(value, aes))
41
      if (key === 'password' && value)
42
        return formData.append(key, cryptoJsAesJson.encrypt(value, aes))
43
      if (value) formData.append(key, value)
44
    })
45
    formData.append('captcha', reCaptchaToken.current)
46
    await axios
47
      .post('/signin', formData)
48
      .then(({ data: response }) => {
49
        const { success, data } = response
50
        if (!success) {
51
          if (data.constructor.name === 'Object') {
52
            Object.entries(data).map(([key, value]) => {
53
              if (key in getValues()) {
54
                setError(key, {
55
                  type: 'manual',
56
                  message: Array.isArray(value) ? value[0] : value,
57
                })
58
              }
59
            })
60
            return
61
          }
6511 stevensc 62
          dispatch(addNotification({ style: 'danger', msg: data }))
6509 stevensc 63
          return
64
        }
65
 
6513 stevensc 66
        dispatch(login())
6509 stevensc 67
        event.target.reset()
68
      })
6511 stevensc 69
      .catch((err) => {
70
        dispatch(
71
          addNotification({
72
            style: 'danger',
73
            msg: 'Disculpe, ha ocurrido un error',
74
          })
75
        )
76
        console.log(`Error: ${err}`)
77
        throw new Error(err)
78
      })
6509 stevensc 79
      .finally(() => setIsLoading(false))
80
 
81
    reCaptchaInstance.current.reset()
82
    loginExpiredCallbackHandler()
83
    setValue('password', '')
84
  }
85
 
86
  const loginVerifyCallbackHandler = (response) => {
87
    reCaptchaToken.current = response
88
    setIsVerified(true)
89
  }
90
 
91
  const loginExpiredCallbackHandler = () => {
92
    reCaptchaToken.current = ''
93
    setIsVerified(false)
94
  }
95
 
96
  const handleOnRecaptchaLoad = () => {
97
    reCaptchaToken.current = ''
98
  }
99
 
100
  const getRedirectUrl = async (endpoint) => {
101
    try {
102
      const res = await axios.get(endpoint)
103
      if (res.data && res.data.data) {
104
        window.location.href = res.data.data
105
      }
106
    } catch (error) {
107
      console.log('>>: error > ', error)
108
    }
109
  }
110
 
111
  return (
112
    <>
113
      <h3>Entrar</h3>
114
      <form onSubmit={handleSubmit(onSubmitHandler)}>
115
        <div className="inputContainer">
116
          <div className="sn-field">
117
            <input
118
              type="email"
119
              name="email"
120
              ref={register({
121
                required: 'Este campo es requerido',
122
                pattern: {
123
                  value: /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/i,
124
                  message:
125
                    'Debe ser una dirección de correo electrónico valida',
126
                },
127
              })}
128
              placeholder="Correo electrónico"
129
              maxLength="64"
130
            />
131
            <i className="la la-envelope" />
132
          </div>
133
          {errors.email && (
134
            <FormErrorFeedback>{errors.email.message}</FormErrorFeedback>
135
          )}
136
        </div>
137
        <div className="inputContainer">
138
          <div className="sn-field">
139
            <input
140
              type="password"
141
              name="password"
142
              ref={register({
143
                required: 'Este campo es requerido',
144
                pattern: {
145
                  value:
146
                    /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$^x%x*-]).{6,16}$/i,
147
                  message:
148
                    'Debe contener entre 6 y 16 caracteres, incluida una letra mayúscula, un número y un carácter especial #?!@$^%*-',
149
                },
150
              })}
151
              placeholder="Clave"
152
            />
153
            <i className="la la-lock"></i>
154
          </div>
155
          {errors.password && (
156
            <FormErrorFeedback>{errors.password.message}</FormErrorFeedback>
157
          )}
158
        </div>
159
        <div className="checky-sec">
160
          <div className="fgt-sec">
161
            <input
162
              type="checkbox"
163
              name="remember"
164
              id="remember"
165
              checked={rememberChecked}
166
              ref={register}
167
              value="1"
168
              readOnly
169
            />
170
            <label onClick={() => setRememberChecked(!rememberChecked)}>
171
              <span></span>
172
            </label>
173
            <small onClick={() => setRememberChecked(!rememberChecked)}>
174
              Recuerdame
175
            </small>
176
          </div>
177
        </div>
178
        <div className="sn-field">
179
          <Recaptcha
180
            sitekey={site_key}
181
            verifyCallback={loginVerifyCallbackHandler}
182
            verifyCallbackName="loginVerifyCallbackHandler"
183
            expiredCallback={loginExpiredCallbackHandler}
184
            expiredCallbackName="loginExpiredCallbackHandler"
185
            ref={reCaptchaInstance}
186
            render="explicit"
187
            onloadCallback={handleOnRecaptchaLoad}
188
            hl="es"
189
          />
190
        </div>
191
        <button
192
          type="submit"
193
          value="submit"
194
          id="btn-submit"
195
          disabled={!isVerified}
196
        >
197
          Entrar
198
        </button>
199
      </form>
200
      {defaultNetwork && (
201
        <div className="login-resources">
202
          <h4>Entrar usando su red social</h4>
203
          <ul>
204
            <li>
205
              <a
206
                onClick={() => getRedirectUrl(facebookOauth)}
207
                className="cursor-pointer fb text-white"
208
                title=""
209
              >
210
                <i className="fa fa-facebook"></i> FACEBOOK
211
              </a>
212
            </li>
213
            <li>
214
              <a
215
                onClick={() => getRedirectUrl(twitterOauth)}
216
                className="cursor-pointer tw btn-connect-social-media text-white"
217
                title=""
218
              >
219
                <i className="fa fa-twitter"></i> TWITTER
220
              </a>
221
            </li>
222
            <li className="bg-secondary">
223
              <a
224
                onClick={() => getRedirectUrl(googleOauth)}
225
                className="cursor-pointer go btn-connect-social-media text-white"
226
                title=""
227
              >
228
                <i className="fa fa-google"></i> GOOGLE
229
              </a>
230
            </li>
231
          </ul>
232
        </div>
233
      )}
234
      {isLoading && <Spinner />}
235
    </>
236
  )
237
}
238
 
239
export default Login