Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Autoría | Ultima modificación | Ver Log |

import React from "react";
import { useState, useEffect } from "react";
import { Button, Modal } from "react-bootstrap";
import { useForm } from "react-hook-form";
import styled from "styled-components";
import {axios} from "../../../../../../utils";
import TagsInput from "../../../../../../shared/tags-input/TagsInput";
import FormErrorFeedback from "../../../../../../shared/form-error-feedback/FormErrorFeedback";
import Spinner from "../../../../../../shared/loading-spinner/Spinner";

const StyledSpinnerContainer = styled.div`
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.4);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 300;
`;

const Skills = (props) => {
  // props destructuring
  const { jobSkills, skillsOptions, companyId, jobId, addNotification } = props;
  // React hook form
  const {
    register,
    errors,
    handleSubmit,
    setValue,
    getValues,
    setError,
  } = useForm();
  // states
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [modalLoading, setModalLoading] = useState(false);
  const [jobSkillsArray, setJobSkillsArray] = useState([]);
  const [skillsOptionsArray, setSkillsOptionsArray] = useState([]);
  const [settedSkillTags, setSettedSkillTags] = useState([]);

  useEffect(() => {
    register("skills", {
      required: "Por favor seleccione al menos una habilidad",
    });
  }, []);

  const handleModalOpen = (event) => {
    event && event.preventDefault();
    Object.entries(getValues()).map(([key, value]) => {
      setValue(key, "");
    });
    setIsModalOpen(!isModalOpen);
  };

  const handleEdit = async (event) => {
    event.preventDefault();
    handleModalOpen();
  };

  const handleTagsChange = (tags) => {
    if (tags.length) {
      let newTags = [];
      tags.map((tag) => {
        newTags = [...newTags, tag.value];
      });
      setValue("skills", newTags);
      setSettedSkillTags(tags);
    } else {
      setValue("skills", "");
      setSettedSkillTags("");
    }
  };

  useEffect(() => {
    let newSkillsOptionsArray = [];
    Object.entries(skillsOptions).map(([key, value]) => {
      newSkillsOptionsArray = [
        ...newSkillsOptionsArray,
        { value: key, name: value },
      ];
    });
    setSkillsOptionsArray(newSkillsOptionsArray);
  }, [skillsOptions]);

  useEffect(() => {
    // let newJobSkillsArray = [];
    // Object.entries(jobSkills).map(([key, value]) => {
    //   newJobSkillsArray = [...newJobSkillsArray, { value: key, name: value }];
    // });
    //  (newJobSkillsArray);
    // setJobSkillsArray(newJobSkillsArray);

    axios
      .get(`/my-company/${companyId}/job/edit/${jobId}/skills`)
      .then((response) => {
        const resData = response.data;
         (resData);
        let newJobSkillsArray = [];
        resData.data.map((skillIndex) => {
          newJobSkillsArray = [
            ...newJobSkillsArray,
            { value: skillIndex, name: skillsOptions[skillIndex] },
          ];
        });
         (newJobSkillsArray);
        setJobSkillsArray(newJobSkillsArray);
      });
  }, []);

  const onSubmitHandler = async (data) => {
    setModalLoading(true);
    const formData = new FormData();
    getValues("skills").map((language) => {
      formData.append("skills[]", language);
    });
    await axios
      .post(`/my-company/${companyId}/job/edit/${jobId}/skills`, formData)
      .then((response) => {
        const resData = response.data;
         (resData);
        if (resData.success) {
          setJobSkillsArray(settedSkillTags);
          setIsModalOpen();
        } else {
          const resError = resData.data;
          if (resError.constructor.name === "Object") {
            Object.entries(resError).map(([key, value]) => {
              if (key in getValues()) {
                setError(key, {
                  type: "manual",
                  message: Array.isArray(value) ? value[0] : value,
                });
              }
            });
          } else {
            addNotification({
              style: "danger",
              msg: resError,
            });
          }
        }
      });
    setModalLoading(false);
  };

  return (
    <React.Fragment>
      <div className="user-profile-ov">
        <h3>
          Habilidades
          <a href="#" title="" className="btn-skills-edit" onClick={handleEdit}>
            <i className="fa fa-pencil"></i>
          </a>
        </h3>
        <ul id="list-skills">
          {jobSkillsArray.map(({ name, value }) => (
            <li key={value}>
              <a href="#" title="">
                {name}
              </a>
            </li>
          ))}
        </ul>
      </div>

      {/* Modal */}
      <Modal
        show={isModalOpen}
        onHide={handleModalOpen}
        style={{ overflowY: "scroll" }}
      >
        <Modal.Header closeButton>
          <Modal.Title>Habilidades</Modal.Title>
        </Modal.Header>
        <form onSubmit={handleSubmit(onSubmitHandler)}>
          <Modal.Body>
            <div className="form-group">
              <TagsInput
                suggestions={skillsOptionsArray}
                settedTags={jobSkillsArray}
                onChange={handleTagsChange}
              />
              {errors.skills && (
                <FormErrorFeedback>{errors.skills.message}</FormErrorFeedback>
              )}
            </div>
          </Modal.Body>
          <Modal.Footer>
            <Button type="submit">Enviar</Button>
            <Button variant="danger" onClick={handleModalOpen}>
              Cancel
            </Button>
          </Modal.Footer>
        </form>
        {modalLoading && (
          <StyledSpinnerContainer>
            <Spinner />
          </StyledSpinnerContainer>
        )}
      </Modal>
    </React.Fragment>
  );
};

export default Skills;