Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3177 | Ir a la última revisión | Autoría | Comparar con el anterior | 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 Spinner from "../../../../loading-spinner/Spinner";
import DropzoneComponent from "../../../../dropzone/DropzoneComponent";
import { profileTypes } from "../../../Profile.types";
import FormErrorFeedback from "../../../../form-error-feedback/FormErrorFeedback";

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 ProfileImg = (props) => {
  // props destructuring
  const {
    entityId,
    profileId,
    image,
    imageProfileCover,
    profileType,
    addNotification,
  } = props;

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

  // states
  const [isModalOpen, setIsModalOpen] = useState(false);
  const [loading, setLoading] = useState(false);
  const [profileImg, setProfileImg] = useState(() => {
    switch (profileType) {
      case profileTypes.USER:
        return {
          path: `/storage/type/user-profile/code/${entityId}/${
            image && `filename/${image}`
          }`,
          uid: Date.now(),
        };
      case profileTypes.COMPANY:
        return {
          path: `/storage/type/company/code/${entityId}/${
            image && `filename/${image}`
          }`,
          uid: Date.now(),
        };
        break;
      default:
        break;
    }
  });

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

  const onUploadedHandler = (files) => {
    setValue("image", files);
    clearErrors("image");
  };

  const dropZoneRender = () => (
    <DropzoneComponent
      modalType="IMAGE"
      onUploaded={onUploadedHandler}
      recomendationText={`Imágenes recomendadas de ${imageProfileCover}`}
    />
  );

  useEffect(() => {
    register("image", {
      required: { value: "true", message: "El campo es requerido" },
    });
    // setSettedCover(false);
  }, []);

  const onSubmitHandler = async (data) => {
    let postPath = "";
    switch (profileType) {
      case profileTypes.USER:
        postPath = `/profile/my-profiles/image/${profileId}/operation/upload`;
        break;
      case profileTypes.COMPANY:
        postPath = `/my-company/${profileId}/profile/image/upload`;
        break;
      default:
        break;
    }
     ("called");
    setLoading(true);
    const formData = new FormData();
    Object.entries(data).map(([key, value]) => {
      formData.append(key, value);
    });
    await axios.post(postPath, formData).then((response) => {
      const resData = response.data;
       (resData);
      if (resData.success) {
        setLoading(false);
        const newCoverImg = {
          path: resData.data.profile,
          uid: Date.now(),
        };
        setProfileImg(newCoverImg);
        setValue("image", "");
        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-pro-img">
        <img
          id="user-profile-img"
          src={`${profileImg.path}?${profileImg.uid}`}
          alt=""
        />
        <div className="add-dp" id="OpenImgUpload">
          <a href="#" className="btn-image-open" onClick={handleModalOpen}>
            <i className="fas fa-camera"></i>
          </a>
        </div>
      </div>

      {/* modal */}
      <Modal
        show={isModalOpen}
        onHide={handleModalOpen}
        style={{ overflowY: "scroll" }}
      >
        <Modal.Header closeButton>
          <Modal.Title>Portada</Modal.Title>
        </Modal.Header>
        <form
          encType="multipart/form-data"
          onSubmit={handleSubmit(onSubmitHandler)}
        >
          <Modal.Body>
            {dropZoneRender()}
            {errors.image && (
              <FormErrorFeedback>{errors.image.message}</FormErrorFeedback>
            )}
          </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 ProfileImg;