Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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