Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 4412 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
4115 stevensc 1
/* eslint-disable react/prop-types */
2
/* eslint-disable no-mixed-spaces-and-tabs */
1 www 3
import React, { useEffect, useState } from "react";
4
import { useForm } from "react-hook-form";
2641 stevensc 5
import { axios } from '../../../utils';
1 www 6
import { connect } from "react-redux";
7
import { addNotification } from "../../../redux/notification/notification.actions";
4405 stevensc 8
 
1 www 9
import Spinner from "../../../shared/loading-spinner/Spinner";
4405 stevensc 10
import FormErrorFeedback from "../../../shared/form-error-feedback/FormErrorFeedback";
11
import PhoneInput from "react-phone-input-2";
12
import SwitchInput from "../shared/switch-input/SwitchInput";
13
import "react-phone-input-2/lib/style.css";
1 www 14
 
4115 stevensc 15
const BasicSettings = ({
16
  addNotification = function () { }, // Redux action
17
  timezones = {}
18
}) => {
1 www 19
 
20
  const [loading, setLoading] = useState(false);
4405 stevensc 21
  const [isAdult, setIsAdult] = useState(false);
1 www 22
 
4412 stevensc 23
  const { register, handleSubmit, setValue, watch, errors, getValues } = useForm()
1 www 24
 
25
  useEffect(() => {
26
    register("phone", {
27
      required: "Por favor ingrese su número de teléfono",
4408 stevensc 28
    })
4113 efrain 29
    register("timezone", {
30
      required: "Por favor ingrese su zona horaria",
4408 stevensc 31
    })
1 www 32
  }, []);
33
 
34
  const handleOnSubmit = async (data) => {
35
    setLoading(true);
36
    const formData = new FormData();
4408 stevensc 37
 
4405 stevensc 38
    formData.append("is_adult", isAdult ? 'y' : 'n')
4408 stevensc 39
    Object.entries(data).map(([key, value]) => formData.append(key, value))
4405 stevensc 40
 
4408 stevensc 41
    axios.post("/account-settings/basic", formData)
42
      .then(({ data: response }) => {
43
        if (!response.success) {
44
          const errorMessage = typeof response.data === "string" ? response.data : "Ha ocurrido un error, Por favor intente mas tarde"
45
          return addNotification({ style: "danger", msg: errorMessage })
1 www 46
        }
4408 stevensc 47
 
48
        return addNotification({ style: "success", msg: response.data })
49
      })
50
      .finally(() => setLoading(false))
1 www 51
  };
52
 
53
  useEffect(async () => {
54
    setLoading(true);
4405 stevensc 55
    axios
56
      .get("/account-settings/basic")
4407 stevensc 57
      .then(({ data: response }) => {
58
        if (response.success) {
59
          Object
60
            .entries(response.data)
4412 stevensc 61
            .map(([key, value]) => {
62
              const currentValue = getValues(key)
4414 stevensc 63
 
4412 stevensc 64
              if (key === 'is_adult') {
65
                return setIsAdult(value === 'y' ? true : false)
66
              }
67
 
68
              if (!currentValue) {
69
                register(key, { required: true })
70
              }
71
 
72
              setValue(key, value)
73
            })
4405 stevensc 74
        }
75
      })
76
      .finally(() => setLoading(false))
1 www 77
  }, []);
78
 
79
  return (
4405 stevensc 80
    <div className="acc-setting">
2642 stevensc 81
      <h2>Básica</h2>
4405 stevensc 82
      {loading
83
        ? <Spinner />
84
        :
2641 stevensc 85
        <form onSubmit={handleSubmit(handleOnSubmit)}>
4405 stevensc 86
          <div className="inputs__container">
2641 stevensc 87
            <div className="cp-field">
88
              <label htmlFor="first_name">Nombre</label>
4414 stevensc 89
              <input type="text" name="first_name" ref={register} defaultValue={watch('first_name')} />
4410 stevensc 90
              {errors.first_name && <FormErrorFeedback>Por favor ingrese su nombre</FormErrorFeedback>}
2641 stevensc 91
            </div>
92
            <div className="cp-field">
93
              <label htmlFor="last_name">Apellido</label>
4414 stevensc 94
              <input type="text" name="last_name" ref={register} defaultValue={watch('last_name')} />
4410 stevensc 95
              {errors.last_name && <FormErrorFeedback>Por favor ingrese su apellido</FormErrorFeedback>}
2641 stevensc 96
            </div>
97
          </div>
4405 stevensc 98
          <div className="inputs__container">
2641 stevensc 99
            <div className="cp-field">
4414 stevensc 100
              <label htmlFor="email">Email</label>
101
              <input type="text" name="email" ref={register} defaultValue={watch('email')} />
4410 stevensc 102
              {errors.email && <FormErrorFeedback>Por favor ingrese un correo electrónico valido</FormErrorFeedback>}
2641 stevensc 103
            </div>
2642 stevensc 104
            <div className="cp-field">
4405 stevensc 105
              <label htmlFor="phone">Teléfono</label>
2642 stevensc 106
              <PhoneInput
107
                name="phone"
2644 stevensc 108
                inputClass="custom-input"
2642 stevensc 109
                value={watch("phone")}
4408 stevensc 110
                onChange={(phone) => setValue("phone", phone)}
2642 stevensc 111
              />
4410 stevensc 112
              {errors.phone && <FormErrorFeedback>Por favor ingrese un número telefónico valido</FormErrorFeedback>}
2642 stevensc 113
            </div>
2641 stevensc 114
          </div>
4405 stevensc 115
          <div className="inputs__container">
2641 stevensc 116
            <div className="cp-field">
117
              <label htmlFor="gender">Género</label>
118
              <select
4414 stevensc 119
                defaultValue={watch('gender')}
120
                name="gender"
121
                ref={register}
2641 stevensc 122
              >
123
                <option value="" hidden>
124
                  Seleccione un género
125
                </option>
126
                <option value="m">Masculino</option>
127
                <option value="f">Femenino</option>
128
              </select>
4410 stevensc 129
              {errors.gender && <FormErrorFeedback>Por favor selecciona un genero</FormErrorFeedback>}
2641 stevensc 130
            </div>
4113 efrain 131
            <div className="cp-field">
4115 stevensc 132
              <label htmlFor="timezone">Zona horaria</label>
4414 stevensc 133
              <select name="timezone" ref={register} defaultValue={watch('timezone')}>
4115 stevensc 134
                <option value="" hidden>
135
                  Zona horaria
136
                </option>
4410 stevensc 137
                {Object.entries(timezones).map(([key, value]) =>
4115 stevensc 138
                  <option value={key} key={key}>
139
                    {value}
140
                  </option>
4410 stevensc 141
                )}
4115 stevensc 142
              </select>
4410 stevensc 143
              {errors.timezone && <FormErrorFeedback>Por favor selecciona una zona horaria</FormErrorFeedback>}
4113 efrain 144
            </div>
2641 stevensc 145
          </div>
4411 stevensc 146
          <div className="cp-field">
147
            <label htmlFor="timezone">Eres mayor de 18</label>
148
            <SwitchInput
149
              isChecked={isAdult}
150
              setValue={(value) => setIsAdult(value)}
151
            />
152
          </div>
4405 stevensc 153
          <button type="submit" className="btn btn-secondary">
154
            Guardar
155
          </button>
2641 stevensc 156
        </form>
157
      }
4405 stevensc 158
 
159
 
160
    </div >
1 www 161
  );
162
};
163
 
164
const mapDispatchToProps = {
165
  addNotification: (notification) => addNotification(notification),
166
};
167
 
168
export default connect(null, mapDispatchToProps)(BasicSettings);