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 Languages = (props) => {
25
  // props destructuring
26
  const {
27
    companyId,
28
    jobId,
29
    addNotification,
30
    jobLanguages,
31
    languageOptions,
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 [jobLanguagesArray, setJobLanguagesArray] = useState([]);
48
  const [languageOptionsArray, setLanguageOptionsArray] = useState([]);
49
  const [settedLanguageTags, setSettedLanguageTags] = useState([]);
50
 
51
  useEffect(() => {
52
    register("languages", {
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("languages", newTags);
77
      setSettedLanguageTags(tags);
78
    } else {
79
      setValue("languages", "");
80
      setSettedLanguageTags("");
81
    }
82
  };
83
 
84
  const onSubmitHandler = async (data) => {
85
    setModalLoading(true);
86
    const formData = new FormData();
87
    getValues("languages").map((language) => {
88
      formData.append("languages[]", language);
89
    });
90
    await axios
91
      .post(`/my-company/${companyId}/job/edit/${jobId}/languages`, formData)
92
      .then((response) => {
93
        const resData = response.data;
94
        if (resData.success) {
95
          setJobLanguagesArray(settedLanguageTags);
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
     (getValues("languages"));
117
    setModalLoading(false);
118
  };
119
 
120
  useEffect(() => {
121
    axios
122
      .get(`/my-company/${companyId}/job/edit/${jobId}/languages`)
123
      .then((response) => {
124
        const resData = response.data;
125
         (resData);
126
        let newLanguagesArray = [];
127
        resData.data.map((index) => {
128
          newLanguagesArray = [
129
            ...newLanguagesArray,
130
            { value: index, name: languageOptions[index] },
131
          ];
132
        });
133
         (newLanguagesArray);
134
        setJobLanguagesArray(newLanguagesArray);
135
      });
136
  }, []);
137
 
138
  useEffect(() => {
139
    let newlanguageOptionsArray = [];
140
    Object.entries(languageOptions).map(([key, value]) => {
141
      newlanguageOptionsArray = [
142
        ...newlanguageOptionsArray,
143
        { value: key, name: value },
144
      ];
145
    });
146
    setLanguageOptionsArray(newlanguageOptionsArray);
147
  }, [languageOptions]);
148
 
149
  return (
150
    <React.Fragment>
151
      <div className="user-profile-ov">
152
        <h3>
153
          Idiomas
154
          <a
155
            href="#"
156
            title=""
157
            className="btn-languages-edit"
158
            onClick={handleEdit}
159
          >
160
            <i className="fa fa-pencil"></i>
161
          </a>
162
        </h3>
163
        <ul id="list-languages">
164
          {jobLanguagesArray.map(({ name, value }) => (
165
            <li key={value}>
166
              <a href="#" title="">
167
                {name}
168
              </a>
169
            </li>
170
          ))}
171
        </ul>
172
      </div>
173
 
174
      {/* modal */}
175
      <Modal
176
        show={isModalOpen}
177
        onHide={handleModalOpen}
178
        style={{ overflowY: "scroll" }}
179
      >
180
        <Modal.Header closeButton>
181
          <Modal.Title>Idiomas</Modal.Title>
182
        </Modal.Header>
183
        <form onSubmit={handleSubmit(onSubmitHandler)}>
184
          <Modal.Body>
185
            <div className="form-group">
186
              <TagsInput
187
                suggestions={languageOptionsArray}
188
                settedTags={jobLanguagesArray}
189
                onChange={handleTagsChange}
190
              />
191
              {errors.languages && (
192
                <FormErrorFeedback>
193
                  {errors.languages.message}
194
                </FormErrorFeedback>
195
              )}
196
            </div>
197
          </Modal.Body>
198
          <Modal.Footer>
199
            <Button type="submit">Enviar</Button>
200
            <Button variant="danger" onClick={handleModalOpen}>
201
              Cancel
202
            </Button>
203
          </Modal.Footer>
204
        </form>
205
        {modalLoading && (
206
          <StyledSpinnerContainer>
207
            <Spinner />
208
          </StyledSpinnerContainer>
209
        )}
210
      </Modal>
211
    </React.Fragment>
212
  );
213
};
214
 
215
export default Languages;