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