Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 stevensc 1
import React, { useEffect, useState } from "react";
2
import { connect } from "react-redux";
3
import { Avatar } from "@mui/material";
2781 stevensc 4
 
3432 stevensc 5
import { axios } from "@app/utils";
6
import { addNotification } from "@app/redux/notification/notification.actions";
2781 stevensc 7
 
3432 stevensc 8
import Button from "@app/components/UI/buttons/Buttons";
9
import Widget from "@app/components/UI/Widget";
10
import Spinner from "@app/components/UI/Spinner";
11
import DropzoneComponent from "@app/components/dropzone/DropzoneComponent";
12
import FormErrorFeedback from "@app/components/UI/form/FormErrorFeedback";
2781 stevensc 13
 
14
const ChangeImage = ({ addNotification }) => {
3432 stevensc 15
  const [imageUrl, setImageUrl] = useState("");
16
  const [imageFile, setImageFile] = useState(null);
17
  const [loading, setLoading] = useState(false);
18
  const [error, setError] = useState("");
2781 stevensc 19
 
20
  const handleOnDropImage = (acceptedFile) => {
21
    if (!acceptedFile) {
3432 stevensc 22
      setImageUrl("");
23
      setImageFile(null);
24
      setError("");
25
      return;
2781 stevensc 26
    }
27
 
3432 stevensc 28
    setError("");
29
    const newImgUrl = URL.createObjectURL(acceptedFile);
30
    setImageUrl(newImgUrl);
31
    setImageFile(acceptedFile);
32
  };
2781 stevensc 33
 
34
  const handleSubmit = async () => {
3432 stevensc 35
    if (!validate()) return;
2781 stevensc 36
 
3432 stevensc 37
    setLoading(true);
2781 stevensc 38
 
3432 stevensc 39
    const formData = new FormData();
40
    formData.append("image", imageFile);
2781 stevensc 41
 
42
    axios
3432 stevensc 43
      .post("/account-settings/image/upload", formData)
44
      .then((response) => {
45
        const { data, success } = response.data;
2781 stevensc 46
 
47
        if (!success) {
48
          const errorMessage =
3432 stevensc 49
            typeof data === "string"
2781 stevensc 50
              ? data
3432 stevensc 51
              : "Ha ocurrido un error, Por favor intente más tarde";
52
          throw new Error(errorMessage);
2781 stevensc 53
        }
54
 
3432 stevensc 55
        sessionStorage.setItem("user_session_image", data);
2781 stevensc 56
        addNotification({
3432 stevensc 57
          style: "success",
58
          msg: "Imagen cambiada exitosamente",
59
        });
2781 stevensc 60
      })
3432 stevensc 61
      .catch((err) => addNotification({ style: "danger", msg: err.message }))
62
      .finally(() => setLoading(false));
63
  };
2781 stevensc 64
 
65
  const validate = () => {
3432 stevensc 66
    let errorMsg = "";
2781 stevensc 67
 
68
    if (!imageFile) {
3432 stevensc 69
      errorMsg = "Por favor ingrese una imagen";
70
      setError(errorMsg);
71
      return false;
2781 stevensc 72
    }
73
 
3432 stevensc 74
    return true;
75
  };
2781 stevensc 76
 
77
  const getUserImage = () => {
3432 stevensc 78
    setLoading(true);
2781 stevensc 79
 
80
    axios
3432 stevensc 81
      .get("/account-settings/image/upload")
82
      .then((response) => {
83
        const { data, success } = response.data;
2781 stevensc 84
 
85
        if (!success) {
3432 stevensc 86
          throw new Error(data);
2781 stevensc 87
        }
88
 
3432 stevensc 89
        setImageUrl(data);
2781 stevensc 90
      })
91
      .catch((err) => {
3432 stevensc 92
        addNotification({ style: "danger", msg: err.message });
2781 stevensc 93
      })
3432 stevensc 94
      .finally(() => setLoading(false));
95
  };
2781 stevensc 96
 
97
  useEffect(() => {
3432 stevensc 98
    getUserImage();
99
  }, []);
2781 stevensc 100
 
101
  return (
102
    <Widget>
3432 stevensc 103
      <Widget.Header title="Cambiar Imagen" />
2781 stevensc 104
 
105
      <Widget.Body>
106
        {imageUrl && (
107
          <Avatar
108
            src={imageUrl}
3432 stevensc 109
            sx={{ width: 100, height: 100, margin: "auto" }}
2781 stevensc 110
          />
111
        )}
112
 
3432 stevensc 113
        <DropzoneComponent onUploaded={handleOnDropImage} modalType="IMAGE" />
2781 stevensc 114
        {error ? <FormErrorFeedback>{error}</FormErrorFeedback> : null}
115
 
116
        {loading && <Spinner />}
117
 
118
        <Button
3432 stevensc 119
          color="primary"
2781 stevensc 120
          onClick={handleSubmit}
3432 stevensc 121
          styles={{ marginTop: "1rem" }}
2781 stevensc 122
          fullWidth
123
        >
124
          Guardar
125
        </Button>
126
      </Widget.Body>
127
    </Widget>
3432 stevensc 128
  );
129
};
2781 stevensc 130
 
131
const mapDispatchToProps = {
3432 stevensc 132
  addNotification: (notification) => addNotification(notification),
133
};
2781 stevensc 134
 
3432 stevensc 135
export default connect(null, mapDispatchToProps)(ChangeImage);