Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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