Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3156 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useState } from "react";
import { connect } from "react-redux";
import { Avatar } from "@mui/material";

import { axios } from "@app/utils";
import { addNotification } from "@app/redux/notification/notification.actions";

import Button from "@app/components/UI/buttons/Buttons";
import Widget from "@app/components/UI/Widget";
import Spinner from "@app/components/UI/Spinner";
import DropzoneComponent from "@app/components/dropzone/DropzoneComponent";
import FormErrorFeedback from "@app/components/UI/form/FormErrorFeedback";

const ChangeImage = ({ addNotification }) => {
  const [imageUrl, setImageUrl] = useState("");
  const [imageFile, setImageFile] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  const handleOnDropImage = (acceptedFile) => {
    if (!acceptedFile) {
      setImageUrl("");
      setImageFile(null);
      setError("");
      return;
    }

    setError("");
    const newImgUrl = URL.createObjectURL(acceptedFile);
    setImageUrl(newImgUrl);
    setImageFile(acceptedFile);
  };

  const handleSubmit = async () => {
    if (!validate()) return;

    setLoading(true);

    const formData = new FormData();
    formData.append("image", imageFile);

    axios
      .post("/account-settings/image/upload", formData)
      .then((response) => {
        const { data, success } = response.data;

        if (!success) {
          const errorMessage =
            typeof data === "string"
              ? data
              : "Ha ocurrido un error, Por favor intente más tarde";
          throw new Error(errorMessage);
        }

        sessionStorage.setItem("user_session_image", data);
        addNotification({
          style: "success",
          msg: "Imagen cambiada exitosamente",
        });
      })
      .catch((err) => addNotification({ style: "danger", msg: err.message }))
      .finally(() => setLoading(false));
  };

  const validate = () => {
    let errorMsg = "";

    if (!imageFile) {
      errorMsg = "Por favor ingrese una imagen";
      setError(errorMsg);
      return false;
    }

    return true;
  };

  const getUserImage = () => {
    setLoading(true);

    axios
      .get("/account-settings/image/upload")
      .then((response) => {
        const { data, success } = response.data;

        if (!success) {
          throw new Error(data);
        }

        setImageUrl(data);
      })
      .catch((err) => {
        addNotification({ style: "danger", msg: err.message });
      })
      .finally(() => setLoading(false));
  };

  useEffect(() => {
    getUserImage();
  }, []);

  return (
    <Widget>
      <Widget.Header title="Cambiar Imagen" />

      <Widget.Body>
        {imageUrl && (
          <Avatar
            src={imageUrl}
            sx={{ width: 100, height: 100, margin: "auto" }}
          />
        )}

        <DropzoneComponent onUploaded={handleOnDropImage} modalType="IMAGE" />
        {error ? <FormErrorFeedback>{error}</FormErrorFeedback> : null}

        {loading && <Spinner />}

        <Button
          color="primary"
          onClick={handleSubmit}
          styles={{ marginTop: "1rem" }}
          fullWidth
        >
          Guardar
        </Button>
      </Widget.Body>
    </Widget>
  );
};

const mapDispatchToProps = {
  addNotification: (notification) => addNotification(notification),
};

export default connect(null, mapDispatchToProps)(ChangeImage);