Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

import React from "react";
import { useState } from "react";
import { Button, Modal } from "react-bootstrap";
import { useForm } from "react-hook-form";
import styled from "styled-components";
import {axios} from "../../../../../../utils";
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 StyledSwitch = styled.label`
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
  input {
    opacity: 0;
    width: 0;
    height: 0;
  }
  .slider {
    position: absolute;
    cursor: pointer;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: #ccc;
    -webkit-transition: 0.4s;
    transition: 0.4s;
  }
  .slider:before {
    position: absolute;
    content: "";
    height: 26px;
    width: 26px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    -webkit-transition: 0.4s;
    transition: 0.4s;
  }
  input:checked + .slider {
    background-color: #2196f3;
  }
  input:focus + .slider {
    box-shadow: 0 0 1px #2196f3;
  }
  input:checked + .slider:before {
    -webkit-transform: translateX(26px);
    -ms-transform: translateX(26px);
    transform: translateX(26px);
  }
  .slider.round {
    border-radius: 34px;
  }

  .slider.round:before {
    border-radius: 50%;
  }
`;

const Salary = (props) => {
  // props destructuring
  const { companyId, jobId, addNotification, salary, currencies } = props;

  // react hook form
  const {
    register,
    errors,
    handleSubmit,
    setValue,
    clearErrors,
    getValues,
    setError,
  } = useForm();

  // states
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [loading, setLoading] = useState(false);
  const [settedSalary, setSettedSalary] = useState(salary);

  const handleEdit = async () => {
    setLoading(true);
    handleModalOpen();
    await axios
      .get(`/my-company/${companyId}/job/edit/${jobId}/salary`)
      .then((response) => {
        const resData = response.data;
         (resData);
        if (resData.success) {
          Object.entries(resData.data).map(([key, value]) => {
            if (value && value !== "n") setValue(key, value);
          });
        } 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,
            });
          }
        }
      });
    setLoading(false);
  };

  const handleModalOpen = (event) => {
    event && event.preventDefault();
    setIsModalOpen(!isModalOpen);
  };

  const onSubmitHandler = async (data) => {
    setLoading(true);
    const formData = new FormData();
     (data);
    Object.entries(data).map(([key, value]) => {
      if (value) formData.append(key, value);
    });
    await axios
      .post(`/my-company/${companyId}/job/edit/${jobId}/salary`, formData)
      .then((response) => {
        const resData = response.data;
         (resData);
        if (resData.success) {
          setSettedSalary(resData.data);
          handleModalOpen();
        } 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,
            });
          }
        }
      });
    setLoading(false);
  };
  return (
    <React.Fragment>
      <div className="user-profile-ov">
        <h3>
          Salario
          <a
            href="#"
            title=""
            className="btn-salary-edit"
            onClick={(e) => {
              e.preventDefault();
              handleEdit();
            }}
          >
            <i className="fa fa-pencil"></i>
          </a>
        </h3>
        <span id="overview-salary">{settedSalary}</span>
      </div>
      {/* modal */}
      <Modal
        show={isModalOpen}
        onHide={handleModalOpen}
        style={{ overflowY: "scroll" }}
      >
        <Modal.Header closeButton>
          <Modal.Title>Salario</Modal.Title>
        </Modal.Header>
        <form onSubmit={handleSubmit(onSubmitHandler)}>
          <Modal.Body>
            <label htmlFor="salary_visible">Visible</label>
            <div className="form-group">
              <StyledSwitch className="switch">
                <input
                  type="checkbox"
                  name="salary_visible"
                  id="salary_visible"
                  value="y"
                  ref={register}
                />
                <span className="slider round"></span>
              </StyledSwitch>
            </div>
            <div className="form-group">
              <select
                name="salary_currency"
                id="salary_currency"
                ref={register({
                  required: "Por favor seleccione una moneda",
                })}
                defaultValue=""
              >
                <option value="" hidden>
                  Salario
                </option>
                {Object.entries(currencies).map(([key, value]) => (
                  <option value={key} key={key}>
                    {value}
                  </option>
                ))}
              </select>
              {errors.salary_currency && (
                <FormErrorFeedback>
                  {errors.salary_currency.message}
                </FormErrorFeedback>
              )}
            </div>
            <div className="form-group">
              <input
                type="text"
                name="salary_min"
                id="salary_min"
                ref={register({
                  required: "Por favor ingrese un salario",
                  pattern: {
                    value: /^[0-9\.]+$/,
                    message: 'Por favor ingrese solo números y "." ',
                  },
                })}
                placeholder="Minimo"
              />
              {errors.salary_min && (
                <FormErrorFeedback>
                  {errors.salary_min.message}
                </FormErrorFeedback>
              )}
            </div>
            <div className="form-group">
              <input
                type="text"
                name="salary_max"
                id="salary_max"
                ref={register({
                  required: "Por favor ingrese un salario",
                  pattern: {
                    value: /^[0-9\.]+$/,
                    message: 'Por favor ingrese solo números y "." ',
                  },
                })}
                placeholder="Máximo"
              />
              {errors.salary_max && (
                <FormErrorFeedback>
                  {errors.salary_max.message}
                </FormErrorFeedback>
              )}
            </div>
          </Modal.Body>
          <Modal.Footer>
            <Button type="submit">Enviar</Button>
            <Button variant="danger" onClick={handleModalOpen}>
              Cancel
            </Button>
          </Modal.Footer>
        </form>
        {loading && (
          <StyledSpinnerContainer>
            <Spinner />
          </StyledSpinnerContainer>
        )}
      </Modal>
    </React.Fragment>
  );
};

export default Salary;