Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
import React from "react";
2
import { useState } from "react";
3
import { Button, Modal } from "react-bootstrap";
4
import { useForm } from "react-hook-form";
5
import styled from "styled-components";
6
import {axios} from "../../../../../../utils";
7
import FormErrorFeedback from "../../../../../../shared/form-error-feedback/FormErrorFeedback";
8
import Spinner from "../../../../../../shared/loading-spinner/Spinner";
9
 
10
const StyledSpinnerContainer = styled.div`
11
  position: absolute;
12
  left: 0;
13
  top: 0;
14
  width: 100%;
15
  height: 100%;
16
  background: rgba(255, 255, 255, 0.4);
17
  display: flex;
18
  justify-content: center;
19
  align-items: center;
20
  z-index: 300;
21
`;
22
 
23
const StyledSwitch = styled.label`
24
  position: relative;
25
  display: inline-block;
26
  width: 60px;
27
  height: 34px;
28
  input {
29
    opacity: 0;
30
    width: 0;
31
    height: 0;
32
  }
33
  .slider {
34
    position: absolute;
35
    cursor: pointer;
36
    top: 0;
37
    left: 0;
38
    right: 0;
39
    bottom: 0;
40
    background-color: #ccc;
41
    -webkit-transition: 0.4s;
42
    transition: 0.4s;
43
  }
44
  .slider:before {
45
    position: absolute;
46
    content: "";
47
    height: 26px;
48
    width: 26px;
49
    left: 4px;
50
    bottom: 4px;
51
    background-color: white;
52
    -webkit-transition: 0.4s;
53
    transition: 0.4s;
54
  }
55
  input:checked + .slider {
56
    background-color: #2196f3;
57
  }
58
  input:focus + .slider {
59
    box-shadow: 0 0 1px #2196f3;
60
  }
61
  input:checked + .slider:before {
62
    -webkit-transform: translateX(26px);
63
    -ms-transform: translateX(26px);
64
    transform: translateX(26px);
65
  }
66
  .slider.round {
67
    border-radius: 34px;
68
  }
69
 
70
  .slider.round:before {
71
    border-radius: 50%;
72
  }
73
`;
74
 
75
const Experience = (props) => {
76
  // props destructuring
77
  const { companyId, jobId, addNotification, experience } = props;
78
 
79
  // react hook form
80
  const {
81
    register,
82
    errors,
83
    handleSubmit,
84
    setValue,
85
    clearErrors,
86
    getValues,
87
    setError,
88
  } = useForm();
89
 
90
  // states
91
  const [isModalOpen, setIsModalOpen] = useState(false);
92
  const [loading, setLoading] = useState(false);
93
  const [settedExperience, setSettedExperience] = useState(experience);
94
 
95
  const handleEdit = async () => {
96
    setLoading(true);
97
    handleModalOpen();
98
    await axios
99
      .get(`/my-company/${companyId}/job/edit/${jobId}/experience`)
100
      .then((response) => {
101
        const resData = response.data;
102
        if (resData.success) {
103
          Object.entries(resData.data).map(([key, value]) => {
104
            setValue(key, value);
105
          });
106
        } else {
107
          const resError = resData.data;
108
          if (resError.constructor.name === "Object") {
109
            Object.entries(resError).map(([key, value]) => {
110
              if (key in getValues()) {
111
                setError(key, {
112
                  type: "manual",
113
                  message: Array.isArray(value) ? value[0] : value,
114
                });
115
              }
116
            });
117
          } else {
118
            addNotification({
119
              style: "danger",
120
              msg: resError,
121
            });
122
          }
123
        }
124
      });
125
    setLoading(false);
126
  };
127
 
128
  const handleModalOpen = (event) => {
129
    event && event.preventDefault();
130
    setIsModalOpen(!isModalOpen);
131
  };
132
 
133
  const onSubmitHandler = async (data) => {
134
    setLoading(true);
135
    const formData = new FormData();
136
     (data);
137
    Object.entries(data).map(([key, value]) => {
138
      if (value) formData.append(key, value);
139
    });
140
    await axios
141
      .post(`/my-company/${companyId}/job/edit/${jobId}/experience`, formData)
142
      .then((response) => {
143
        const resData = response.data;
144
         (resData);
145
        if (resData.success) {
146
          setSettedExperience(resData.data);
147
          handleModalOpen();
148
        } else {
149
          const resError = resData.data;
150
          if (resError.constructor.name === "Object") {
151
            Object.entries(resError).map(([key, value]) => {
152
              if (key in getValues()) {
153
                setError(key, {
154
                  type: "manual",
155
                  message: Array.isArray(value) ? value[0] : value,
156
                });
157
              }
158
            });
159
          } else {
160
            addNotification({
161
              style: "danger",
162
              msg: resError,
163
            });
164
          }
165
        }
166
      });
167
    setLoading(false);
168
  };
169
  return (
170
    <React.Fragment>
171
      <div className="user-profile-ov">
172
        <h3>
173
          Experiencia
174
          <a
175
            href="#"
176
            title=""
177
            className="btn-experience-edit"
178
            onClick={(e) => {
179
              e.preventDefault();
180
              handleEdit();
181
            }}
182
          >
183
            <i className="fa fa-pencil"></i>
184
          </a>
185
        </h3>
186
        <span id="overview-experience">{`${settedExperience} años`}</span>
187
      </div>
188
 
189
      {/* modal */}
190
      <Modal
191
        show={isModalOpen}
192
        onHide={handleModalOpen}
193
        style={{ overflowY: "scroll" }}
194
      >
195
        <Modal.Header closeButton>
196
          <Modal.Title>Experiencia</Modal.Title>
197
        </Modal.Header>
198
        <form onSubmit={handleSubmit(onSubmitHandler)}>
199
          <Modal.Body>
200
            <label htmlFor="experience_visible">Visible</label>
201
            <div className="form-group">
202
              <StyledSwitch className="switch">
203
                <input
204
                  type="checkbox"
205
                  name="experience_visible"
206
                  id="experience_visible"
207
                  value="y"
208
                  ref={register}
209
                />
210
                <span className="slider round"></span>
211
              </StyledSwitch>
212
            </div>
213
            <div className="form-group">
214
              <input
215
                type="text"
216
                name="experience_min"
217
                id="experience_min"
218
                maxLength="2"
219
                ref={register({
220
                  required: "Por favor ingrese un año",
221
                })}
222
                placeholder="minimo"
223
              />
224
              {errors.experience_min && (
225
                <FormErrorFeedback>
226
                  {errors.experience_min.message}
227
                </FormErrorFeedback>
228
              )}
229
            </div>
230
            <div className="form-group">
231
              <input
232
                type="text"
233
                name="experience_max"
234
                id="experience_max"
235
                maxLength="2"
236
                ref={register({
237
                  required: "Por favor ingrese un año",
238
                })}
239
                placeholder="Máximo"
240
              />
241
              {errors.experience_max && (
242
                <FormErrorFeedback>
243
                  {errors.experience_max.message}
244
                </FormErrorFeedback>
245
              )}
246
            </div>
247
          </Modal.Body>
248
          <Modal.Footer>
249
            <Button type="submit">Enviar</Button>
250
            <Button variant="danger" onClick={handleModalOpen}>
251
              Cancel
252
            </Button>
253
          </Modal.Footer>
254
        </form>
255
        {loading && (
256
          <StyledSpinnerContainer>
257
            <Spinner />
258
          </StyledSpinnerContainer>
259
        )}
260
      </Modal>
261
    </React.Fragment>
262
  );
263
};
264
 
265
export default Experience;