Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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