Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3730 stevensc 1
/* eslint-disable react/prop-types */
1 www 2
import React from "react";
3
import { useState, useEffect } from "react";
4
import { Button, Modal } from "react-bootstrap";
5
import { useForm } from "react-hook-form";
6
import styled from "styled-components";
3177 stevensc 7
import { axios } from "../../../../../utils";
1 www 8
import Spinner from "../../../../loading-spinner/Spinner";
9
import DropzoneComponent from "../../../../dropzone/DropzoneComponent";
10
import { profileTypes } from "../../../Profile.types";
11
import FormErrorFeedback from "../../../../form-error-feedback/FormErrorFeedback";
3730 stevensc 12
import { addNotification } from "../../../../../redux/notification/notification.actions";
1 www 13
 
14
const StyledSpinnerContainer = styled.div`
15
  position: absolute;
16
  left: 0;
17
  top: 0;
18
  width: 100%;
19
  height: 100%;
20
  background: rgba(255, 255, 255, 0.4);
21
  display: flex;
22
  justify-content: center;
23
  align-items: center;
24
  z-index: 300;
25
`;
26
 
3730 stevensc 27
const ProfileImg = ({
28
  entityId = '',
29
  profileId = '',
30
  image = '',
31
  imageProfileCover = '',
32
  profileType = ''
33
}) => {
1 www 34
 
35
  const {
36
    register,
37
    errors,
38
    handleSubmit,
39
    setValue,
40
    clearErrors,
41
    setError,
3730 stevensc 42
    getValues
1 www 43
  } = useForm();
44
 
45
  // states
46
  const [isModalOpen, setIsModalOpen] = useState(false);
47
  const [loading, setLoading] = useState(false);
48
  const [profileImg, setProfileImg] = useState(() => {
49
    switch (profileType) {
50
      case profileTypes.USER:
51
        return {
3872 stevensc 52
          path: `/storage/type/user-profile/code/${entityId}/${image ? `filename/${image}` : ''}`,
1 www 53
          uid: Date.now(),
54
        };
55
      case profileTypes.COMPANY:
56
        return {
3872 stevensc 57
          path: `/storage/type/company/code/${entityId}/${image ? `filename/${image}` : ''}`,
1 www 58
          uid: Date.now(),
3730 stevensc 59
        }
1 www 60
      default:
61
        break;
62
    }
63
  });
64
 
65
  const handleModalOpen = (event) => {
66
    event && event.preventDefault();
67
    setIsModalOpen(!isModalOpen);
68
  };
69
 
70
  const onUploadedHandler = (files) => {
71
    setValue("image", files);
72
    clearErrors("image");
73
  };
74
 
75
  const dropZoneRender = () => (
76
    <DropzoneComponent
77
      modalType="IMAGE"
78
      onUploaded={onUploadedHandler}
79
      recomendationText={`Imágenes recomendadas de ${imageProfileCover}`}
80
    />
81
  );
82
 
83
  useEffect(() => {
84
    register("image", {
85
      required: { value: "true", message: "El campo es requerido" },
86
    });
87
    // setSettedCover(false);
88
  }, []);
89
 
90
  const onSubmitHandler = async (data) => {
91
    let postPath = "";
92
    switch (profileType) {
93
      case profileTypes.USER:
94
        postPath = `/profile/my-profiles/image/${profileId}/operation/upload`;
95
        break;
96
      case profileTypes.COMPANY:
97
        postPath = `/my-company/${profileId}/profile/image/upload`;
98
        break;
99
      default:
100
        break;
101
    }
3177 stevensc 102
    ("called");
1 www 103
    setLoading(true);
104
    const formData = new FormData();
105
    Object.entries(data).map(([key, value]) => {
106
      formData.append(key, value);
107
    });
108
    await axios.post(postPath, formData).then((response) => {
109
      const resData = response.data;
3177 stevensc 110
      (resData);
1 www 111
      if (resData.success) {
112
        setLoading(false);
113
        const newCoverImg = {
114
          path: resData.data.profile,
115
          uid: Date.now(),
116
        };
3177 stevensc 117
        if (resData.data.update_navbar) sessionStorage.setItem('user_session_image', resData.data.user)
1 www 118
        setProfileImg(newCoverImg);
119
        setValue("image", "");
120
        handleModalOpen();
121
      } else {
122
        const resError = resData.data;
123
        if (resError.constructor.name === "Object") {
124
          Object.entries(resError).map(([key, value]) => {
125
            if (key in getValues()) {
126
              setError(key, {
127
                type: "manual",
128
                message: Array.isArray(value) ? value[0] : value,
129
              });
130
            }
131
          });
132
        } else {
133
          addNotification({
134
            style: "danger",
135
            msg: resError,
136
          });
137
        }
138
      }
139
    });
140
    setLoading(false);
141
  };
142
 
143
  return (
144
    <React.Fragment>
145
      <div className="user-pro-img">
146
        <img
147
          id="user-profile-img"
148
          src={`${profileImg.path}?${profileImg.uid}`}
149
          alt=""
150
        />
151
        <div className="add-dp" id="OpenImgUpload">
152
          <a href="#" className="btn-image-open" onClick={handleModalOpen}>
153
            <i className="fas fa-camera"></i>
154
          </a>
155
        </div>
156
      </div>
157
 
158
      {/* modal */}
159
      <Modal
160
        show={isModalOpen}
161
        onHide={handleModalOpen}
162
        style={{ overflowY: "scroll" }}
163
      >
164
        <Modal.Header closeButton>
165
          <Modal.Title>Portada</Modal.Title>
166
        </Modal.Header>
167
        <form
168
          encType="multipart/form-data"
169
          onSubmit={handleSubmit(onSubmitHandler)}
170
        >
171
          <Modal.Body>
172
            {dropZoneRender()}
173
            {errors.image && (
174
              <FormErrorFeedback>{errors.image.message}</FormErrorFeedback>
175
            )}
176
          </Modal.Body>
177
          <Modal.Footer>
178
            <Button type="submit">Enviar</Button>
179
            <Button variant="danger" onClick={handleModalOpen}>
3148 stevensc 180
              Cancelar
1 www 181
            </Button>
182
          </Modal.Footer>
183
        </form>
184
        {loading && (
185
          <StyledSpinnerContainer>
186
            <Spinner />
187
          </StyledSpinnerContainer>
188
        )}
189
      </Modal>
190
    </React.Fragment>
191
  );
192
};
193
 
194
export default ProfileImg;