Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3183 | 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";
2613 stevensc 6
import { axios } from "../../../../../utils";
1 www 7
import FormErrorFeedback from "../../../../../shared/form-error-feedback/FormErrorFeedback";
8
import Spinner from "../../../../../shared/loading-spinner/Spinner";
3182 stevensc 9
import Accessibility from "../accessibility/Accessibility";
1 www 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 Privacy = (props) => {
25
  // props destructuring
3182 stevensc 26
  const { groupId, addNotification, privacies, settedPrivacy, setSettedPrivacy, setSettedAccesibility } = props;
1 www 27
  // react hook form
28
  const {
29
    register,
30
    errors,
31
    handleSubmit,
32
    setValue,
33
    clearErrors,
34
    getValues,
35
    setError,
36
  } = useForm();
37
 
38
  // states
39
  const [isModalOpen, setIsModalOpen] = useState(false);
40
  const [loading, setLoading] = useState(false);
41
  const [settedPrivacyKey, setSettedPrivacyKey] = useState("");
42
 
43
  const handleModalOpen = (event) => {
44
    event && event.preventDefault();
45
    setIsModalOpen(!isModalOpen);
46
  };
47
 
48
  useEffect(() => {
49
    axios.get(`/group/my-groups/privacy/${groupId}`).then((response) => {
50
      const resData = response.data;
2613 stevensc 51
      (resData);
1 www 52
      if (resData.success) {
53
        if (resData.data) setSettedPrivacyKey(resData.data);
54
      }
55
    });
56
  }, [settedPrivacy]);
57
 
58
  const onSubmitHandler = async (data) => {
59
    // profile/my-profiles/extended', [ 'id' => $user_profile_id_encrypted]
60
    // https://leaderslinked.com/profile/my-profiles/extended/MzU4NDg3ODcg
61
    const formData = new FormData();
3184 stevensc 62
    Object.entries(data).map(async ([key, value]) => {
63
      setLoading(true);
3183 stevensc 64
      if (value === 'pr') {
3182 stevensc 65
        const accessibilityData = new FormData()
66
        accessibilityData.append('accessibility', 'aa')
3184 stevensc 67
        const { data } = await axios.post(`/group/my-groups/accessibility/${groupId}`, accessibilityData)
68
        if (data.success) {
69
          setSettedAccesibility(data.data)
70
          setLoading(false)
71
        }
72
 
73
        setLoading(false)
3182 stevensc 74
      }
75
      formData.append(key, value)
76
    })
3184 stevensc 77
 
78
    if (!loading) {
79
      setLoading(true)
80
      await axios.post(`/group/my-groups/privacy/${groupId}`, formData)
81
        .then((response) => {
82
          const resData = response.data;
83
          (resData);
84
          if (resData.success) {
85
            setSettedPrivacy(resData.data);
86
            handleModalOpen();
1 www 87
          } else {
3184 stevensc 88
            const resError = resData.data;
89
            if (resError.constructor.name === "Object") {
90
              Object.entries(resError).map(([key, value]) => {
91
                if (key in getValues()) {
92
                  setError(key, {
93
                    type: "manual",
94
                    message: Array.isArray(value) ? value[0] : value,
95
                  });
96
                }
97
              });
98
            } else {
99
              addNotification({
100
                style: "danger",
101
                msg: resError,
102
              });
103
            }
1 www 104
          }
3184 stevensc 105
        });
106
    }
1 www 107
    setLoading(false);
108
  };
109
 
110
  return (
111
    <React.Fragment>
112
      <div className="user-profile-extended-ov">
113
        <h3>
114
          Privacidad
115
          <a
116
            href="#"
117
            title=""
118
            className="btn-privacy-edit"
119
            onClick={handleModalOpen}
120
          >
121
            <i className="fa fa-pencil"></i>
122
          </a>
123
        </h3>
124
        <span id="overview-privacy">{settedPrivacy}</span>
125
      </div>
126
 
127
      {/* modal */}
128
      <Modal
129
        show={isModalOpen}
130
        onHide={handleModalOpen}
131
        style={{ overflowY: "scroll" }}
132
      >
133
        <Modal.Header closeButton>
1180 stevensc 134
          <Modal.Title>Privacidad</Modal.Title>
1 www 135
        </Modal.Header>
136
        <form onSubmit={handleSubmit(onSubmitHandler)}>
137
          <Modal.Body>
138
            <select
139
              name="privacy"
140
              id="privacy"
141
              defaultValue={settedPrivacyKey ? settedPrivacyKey : ""}
142
              ref={register({
143
                required: "Por favor eliga una privacidad",
144
              })}
145
            >
146
              <option value="" hidden>
147
                Privacidad
148
              </option>
149
              {Object.entries(privacies).map(([key, value]) => (
150
                <option value={key} key={key}>
151
                  {value}
152
                </option>
153
              ))}
154
            </select>
155
            {errors.privacy && (
156
              <FormErrorFeedback>{errors.privacy.message}</FormErrorFeedback>
157
            )}
158
          </Modal.Body>
159
          <Modal.Footer>
160
            <Button type="submit">Enviar</Button>
161
            <Button variant="danger" onClick={handleModalOpen}>
1206 stevensc 162
              Cancelar
1 www 163
            </Button>
164
          </Modal.Footer>
165
        </form>
166
        {loading && (
167
          <StyledSpinnerContainer>
168
            <Spinner />
169
          </StyledSpinnerContainer>
170
        )}
171
      </Modal>
172
    </React.Fragment>
173
  );
174
};
175
 
176
export default Privacy;