Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 1 | Rev 3177 | 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";
6
import {axios} from "../../../../../utils";
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 {
53
          path: `/storage/type/user-profile/code/${entityId}/${
54
            image && `filename/${image}`
55
          }`,
56
          uid: Date.now(),
57
        };
58
      case profileTypes.COMPANY:
59
        return {
60
          path: `/storage/type/company/code/${entityId}/${
61
            image && `filename/${image}`
62
          }`,
63
          uid: Date.now(),
64
        };
65
        break;
66
      default:
67
        break;
68
    }
69
  });
70
 
71
  const handleModalOpen = (event) => {
72
    event && event.preventDefault();
73
    setIsModalOpen(!isModalOpen);
74
  };
75
 
76
  const onUploadedHandler = (files) => {
77
    setValue("image", files);
78
    clearErrors("image");
79
  };
80
 
81
  const dropZoneRender = () => (
82
    <DropzoneComponent
83
      modalType="IMAGE"
84
      onUploaded={onUploadedHandler}
85
      recomendationText={`Imágenes recomendadas de ${imageProfileCover}`}
86
    />
87
  );
88
 
89
  useEffect(() => {
90
    register("image", {
91
      required: { value: "true", message: "El campo es requerido" },
92
    });
93
    // setSettedCover(false);
94
  }, []);
95
 
96
  const onSubmitHandler = async (data) => {
97
    let postPath = "";
98
    switch (profileType) {
99
      case profileTypes.USER:
100
        postPath = `/profile/my-profiles/image/${profileId}/operation/upload`;
101
        break;
102
      case profileTypes.COMPANY:
103
        postPath = `/my-company/${profileId}/profile/image/upload`;
104
        break;
105
      default:
106
        break;
107
    }
108
     ("called");
109
    setLoading(true);
110
    const formData = new FormData();
111
    Object.entries(data).map(([key, value]) => {
112
      formData.append(key, value);
113
    });
114
    await axios.post(postPath, formData).then((response) => {
115
      const resData = response.data;
116
       (resData);
117
      if (resData.success) {
118
        setLoading(false);
119
        const newCoverImg = {
120
          path: resData.data.profile,
121
          uid: Date.now(),
122
        };
123
        setProfileImg(newCoverImg);
124
        setValue("image", "");
125
        handleModalOpen();
126
      } else {
127
        const resError = resData.data;
128
        if (resError.constructor.name === "Object") {
129
          Object.entries(resError).map(([key, value]) => {
130
            if (key in getValues()) {
131
              setError(key, {
132
                type: "manual",
133
                message: Array.isArray(value) ? value[0] : value,
134
              });
135
            }
136
          });
137
        } else {
138
          addNotification({
139
            style: "danger",
140
            msg: resError,
141
          });
142
        }
143
      }
144
    });
145
    setLoading(false);
146
  };
147
 
148
  return (
149
    <React.Fragment>
150
      <div className="user-pro-img">
151
        <img
152
          id="user-profile-img"
153
          src={`${profileImg.path}?${profileImg.uid}`}
154
          alt=""
155
        />
156
        <div className="add-dp" id="OpenImgUpload">
157
          <a href="#" className="btn-image-open" onClick={handleModalOpen}>
158
            <i className="fas fa-camera"></i>
159
          </a>
160
        </div>
161
      </div>
162
 
163
      {/* modal */}
164
      <Modal
165
        show={isModalOpen}
166
        onHide={handleModalOpen}
167
        style={{ overflowY: "scroll" }}
168
      >
169
        <Modal.Header closeButton>
170
          <Modal.Title>Portada</Modal.Title>
171
        </Modal.Header>
172
        <form
173
          encType="multipart/form-data"
174
          onSubmit={handleSubmit(onSubmitHandler)}
175
        >
176
          <Modal.Body>
177
            {dropZoneRender()}
178
            {errors.image && (
179
              <FormErrorFeedback>{errors.image.message}</FormErrorFeedback>
180
            )}
181
          </Modal.Body>
182
          <Modal.Footer>
183
            <Button type="submit">Enviar</Button>
184
            <Button variant="danger" onClick={handleModalOpen}>
3148 stevensc 185
              Cancelar
1 www 186
            </Button>
187
          </Modal.Footer>
188
        </form>
189
        {loading && (
190
          <StyledSpinnerContainer>
191
            <Spinner />
192
          </StyledSpinnerContainer>
193
        )}
194
      </Modal>
195
    </React.Fragment>
196
  );
197
};
198
 
199
export default ProfileImg;