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, useEffect } 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 TagsInput from "../../../../../../shared/tags-input/TagsInput";
8
import FormErrorFeedback from "../../../../../../shared/form-error-feedback/FormErrorFeedback";
9
import Spinner from "../../../../../../shared/loading-spinner/Spinner";
10
 
11
const StyledSpinnerContainer = styled.div`
12
  position: absolute;
13
  left: 0;
14
  top: 0;
15
  width: 100%;
16
  height: 100%;
17
  background: rgba(255, 255, 255, 0.4);
18
  display: flex;
19
  justify-content: center;
20
  align-items: center;
21
  z-index: 300;
22
`;
23
 
24
const Degrees = (props) => {
25
  // props destructuring
26
  const {
27
    companyId,
28
    jobId,
29
    addNotification,
30
    jobDegrees,
31
    degreeOptions,
32
  } = props;
33
 
34
  // React hook form
35
  const {
36
    register,
37
    errors,
38
    handleSubmit,
39
    setValue,
40
    getValues,
41
    setError,
42
  } = useForm();
43
 
44
  // states
45
  const [isModalOpen, setIsModalOpen] = useState(false);
46
  const [modalLoading, setModalLoading] = useState(false);
47
  const [jobDegreesArray, setJobDegreesArray] = useState([]);
48
  const [degreeOptionsArray, setDegreeOptionsArray] = useState([]);
49
  const [settedDegreeTags, setSettedDegreeTags] = useState([]);
50
 
51
  useEffect(() => {
52
    register("degrees", {
53
      required: "Por favor seleccione al menos un lenguaje",
54
    });
55
  }, []);
56
 
57
  const handleModalOpen = (event) => {
58
    event && event.preventDefault();
59
    Object.entries(getValues()).map(([key, value]) => {
60
      setValue(key, "");
61
    });
62
    setIsModalOpen(!isModalOpen);
63
  };
64
 
65
  const handleEdit = (event) => {
66
    event.preventDefault();
67
    handleModalOpen();
68
  };
69
 
70
  const handleTagsChange = (tags) => {
71
    if (tags.length) {
72
      let newTags = [];
73
      tags.map((tag) => {
74
        newTags = [...newTags, tag.value];
75
      });
76
      setValue("degrees", newTags);
77
      setSettedDegreeTags(tags);
78
    } else {
79
      setValue("degrees", "");
80
      setSettedDegreeTags("");
81
    }
82
  };
83
 
84
  const onSubmitHandler = async (data) => {
85
    setModalLoading(true);
86
    const formData = new FormData();
87
    getValues("degrees").map((degree) => {
88
      formData.append("degrees[]", degree);
89
    });
90
    await axios
91
      .post(`/my-company/${companyId}/job/edit/${jobId}/degrees`, formData)
92
      .then((response) => {
93
        const resData = response.data;
94
        if (resData.success) {
95
          setJobDegreesArray(settedDegreeTags);
96
          setIsModalOpen();
97
        } else {
98
          const resError = resData.data;
99
          if (resError.constructor.name === "Object") {
100
            Object.entries(resError).map(([key, value]) => {
101
              if (key in getValues()) {
102
                setError(key, {
103
                  type: "manual",
104
                  message: Array.isArray(value) ? value[0] : value,
105
                });
106
              }
107
            });
108
          } else {
109
            addNotification({
110
              style: "danger",
111
              msg: resError,
112
            });
113
          }
114
        }
115
      });
116
    setModalLoading(false);
117
  };
118
 
119
  useEffect(() => {
120
    axios
121
      .get(`/my-company/${companyId}/job/edit/${jobId}/degrees`)
122
      .then((response) => {
123
        const resData = response.data;
124
        let newDegreesArray = [];
125
        resData.data.map((index) => {
126
          newDegreesArray = [
127
            ...newDegreesArray,
128
            { value: index, name: degreeOptions[index] },
129
          ];
130
        });
131
        setJobDegreesArray(newDegreesArray);
132
      });
133
  }, []);
134
 
135
  useEffect(() => {
136
    let newDegreeOptionsArray = [];
137
    Object.entries(degreeOptions).map(([key, value]) => {
138
      newDegreeOptionsArray = [
139
        ...newDegreeOptionsArray,
140
        { value: key, name: value },
141
      ];
142
    });
143
    setDegreeOptionsArray(newDegreeOptionsArray);
144
  }, [degreeOptions]);
145
 
146
  return (
147
    <React.Fragment>
148
      <div className="user-profile-ov">
149
        <h3>
150
          Grados
151
          <a
152
            href="#"
153
            title=""
154
            className="btn-degrees-edit"
155
            onClick={handleEdit}
156
          >
157
            <i className="fa fa-pencil"></i>
158
          </a>
159
        </h3>
160
        <ul id="list-degrees">
161
          {jobDegreesArray.map(({ name, value }) => (
162
            <li key={value}>
163
              <a href="#" title="">
164
                {name}
165
              </a>
166
            </li>
167
          ))}
168
        </ul>
169
      </div>
170
 
171
      {/* modal */}
172
      <Modal
173
        show={isModalOpen}
174
        onHide={handleModalOpen}
175
        style={{ overflowY: "scroll" }}
176
      >
177
        <Modal.Header closeButton>
178
          <Modal.Title>Grados</Modal.Title>
179
        </Modal.Header>
180
        <form onSubmit={handleSubmit(onSubmitHandler)}>
181
          <Modal.Body>
182
            <div className="form-group">
183
              <TagsInput
184
                suggestions={degreeOptionsArray}
185
                settedTags={jobDegreesArray}
186
                onChange={handleTagsChange}
187
              />
188
              {errors.degrees && (
189
                <FormErrorFeedback>{errors.degrees.message}</FormErrorFeedback>
190
              )}
191
            </div>
192
          </Modal.Body>
193
          <Modal.Footer>
194
            <Button type="submit">Enviar</Button>
195
            <Button variant="danger" onClick={handleModalOpen}>
196
              Cancel
197
            </Button>
198
          </Modal.Footer>
199
        </form>
200
        {modalLoading && (
201
          <StyledSpinnerContainer>
202
            <Spinner />
203
          </StyledSpinnerContainer>
204
        )}
205
      </Modal>
206
    </React.Fragment>
207
  );
208
};
209
 
210
export default Degrees;