Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 stevensc 1
import React, { useRef, useState } from "react";
2
import { axios } from "../../utils";
3
import { Avatar } from "@mui/material";
4
import { useNavigate } from "react-router-dom";
5
import { addNotification } from "store/notification/notification.actions";
6
import { useDispatch, useSelector } from "react-redux";
7
import styled from "styled-components";
929 stevensc 8
 
3432 stevensc 9
import Spinner from "../UI/Spinner";
10
import WidgetWrapper from "../widgets/WidgetLayout";
11
import ConfirmModal from "../modals/ConfirmModal";
12
import Button from "../UI/buttons/Buttons";
5 stevensc 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
  place-items: center;
496 stevensc 22
  z-index: 50;
3432 stevensc 23
`;
607 stevensc 24
 
1507 stevensc 25
const StyledItemContainer = styled(WidgetWrapper)`
613 stevensc 26
  display: flex;
27
  flex-direction: column;
28
  justify-content: center;
2184 stevensc 29
  height: fit-content;
720 stevensc 30
  border-radius: 5px;
3432 stevensc 31
`;
613 stevensc 32
 
607 stevensc 33
const StyledHeader = styled.div`
34
  align-items: center;
35
  display: flex;
36
  gap: 0.5rem;
663 andreina 37
  justify-content: flex-start;
607 stevensc 38
  position: relative;
966 stevensc 39
  padding: 0.5rem;
3432 stevensc 40
`;
607 stevensc 41
 
611 stevensc 42
const StyledContent = styled.div`
43
  display: flex;
44
  flex-direction: column;
45
  text-align: center;
645 stevensc 46
  ul {
611 stevensc 47
    align-items: center;
48
    display: flex;
49
    justify-content: center;
721 stevensc 50
    gap: 0.5rem;
611 stevensc 51
  }
3432 stevensc 52
`;
611 stevensc 53
 
848 stevensc 54
const Actions = styled.div`
55
  display: flex;
1330 stevensc 56
  flex-wrap: wrap;
848 stevensc 57
  justify-content: space-around;
58
  border-top: 1px solid rgb(211, 211, 211);
966 stevensc 59
  padding: 0.5rem;
929 stevensc 60
  gap: 0.5rem;
3432 stevensc 61
`;
848 stevensc 62
 
607 stevensc 63
const StyledAvatar = styled(Avatar)`
665 andreina 64
  height: 60px !important;
720 stevensc 65
  width: 60px !important;
3432 stevensc 66
`;
607 stevensc 67
 
5 stevensc 68
const ProfileItem = ({
69
  image,
70
  name,
71
  email,
72
  network,
73
  status,
74
  fetchCallback,
75
  link_remove,
76
  link_view,
77
  link_edit,
78
  link_delete,
79
  link_cancel,
80
  link_block,
81
  link_reject,
82
  link_accept,
83
  link_inmail,
84
  link_request,
85
  link_unblock,
86
  link_unfollow,
87
  link_approve,
88
  link_leave,
89
  link_admin,
90
  link_impersonate,
933 stevensc 91
  btnAcceptTitle,
92
  btnCancelTitle,
93
  btnEditTitle,
94
  btnLeaveTitle,
2937 stevensc 95
  btnRemoveLabel,
3432 stevensc 96
  isTopData,
5 stevensc 97
}) => {
3432 stevensc 98
  const [isShowConfirmation, setIsShowConfirmation] = useState(false);
99
  const [loading, setLoading] = useState(false);
100
  const confirmUrl = useRef("");
101
  const labels = useSelector(({ intl }) => intl.labels);
102
  const dispatch = useDispatch();
103
  const navigate = useNavigate();
5 stevensc 104
 
3432 stevensc 105
  const showConfirm = (url = "") => {
106
    setIsShowConfirmation(true);
107
    confirmUrl.current = url;
108
  };
5 stevensc 109
 
496 stevensc 110
  const closeConfirm = () => {
3432 stevensc 111
    setIsShowConfirmation(false);
112
    confirmUrl.current = "";
113
  };
5 stevensc 114
 
3432 stevensc 115
  const getImpersonateUrl = async (url = "") => {
5 stevensc 116
    try {
3432 stevensc 117
      const response = await axios.get(url);
118
      const { data, success } = response.data;
1617 stevensc 119
 
120
      if (success) {
3432 stevensc 121
        window.location.href = data;
1617 stevensc 122
      }
5 stevensc 123
    } catch (error) {
3432 stevensc 124
      console.log(">>: error > ", error);
5 stevensc 125
    }
3432 stevensc 126
  };
5 stevensc 127
 
128
  const onConfirm = (url) => {
3432 stevensc 129
    setLoading(true);
5 stevensc 130
    axios
131
      .post(url)
132
      .then((response) => {
3432 stevensc 133
        const { success, data } = response.data;
5 stevensc 134
 
135
        if (!success) {
136
          const errorMessage =
3432 stevensc 137
            typeof data === "string"
5 stevensc 138
              ? data
3432 stevensc 139
              : "Error interno. Por favor, inténtelo de nuevo más tarde.";
5 stevensc 140
 
3432 stevensc 141
          dispatch(addNotification({ style: "danger", msg: errorMessage }));
142
          return;
5 stevensc 143
        }
144
 
3432 stevensc 145
        if (fetchCallback) fetchCallback();
146
        dispatch(addNotification({ style: "success", msg: data }));
5 stevensc 147
      })
526 stevensc 148
      .catch(() => {
5 stevensc 149
        dispatch(
150
          addNotification({
3432 stevensc 151
            style: "error",
152
            msg: "Error interno. Por favor, inténtelo de nuevo más tarde.",
5 stevensc 153
          })
3432 stevensc 154
        );
5 stevensc 155
      })
156
      .finally(() => {
3432 stevensc 157
        confirmUrl.current = "";
158
        setLoading(false);
159
      });
160
  };
5 stevensc 161
 
162
  const handleUnfollow = (link_unfollow) => {
3432 stevensc 163
    setLoading(true);
5 stevensc 164
    axios
165
      .post(link_unfollow)
166
      .then((response) => {
3432 stevensc 167
        const { data, success } = response.data;
5 stevensc 168
 
169
        if (!success) {
170
          const errorMessage =
3432 stevensc 171
            typeof data === "string"
5 stevensc 172
              ? data
3432 stevensc 173
              : "Error interno. Por favor, inténtelo de nuevo más tarde.";
5 stevensc 174
 
3432 stevensc 175
          dispatch(addNotification({ style: "danger", msg: errorMessage }));
176
          return;
5 stevensc 177
        }
178
 
3432 stevensc 179
        if (fetchCallback) fetchCallback();
180
        dispatch(addNotification({ style: "success", msg: data }));
5 stevensc 181
      })
3432 stevensc 182
      .finally(() => setLoading(false));
183
  };
5 stevensc 184
 
1872 stevensc 185
  const getManageUrl = () => {
186
    axios
187
      .get(link_admin)
188
      .then((response) => {
3432 stevensc 189
        const { data, success } = response.data;
1872 stevensc 190
 
191
        if (!success) {
3432 stevensc 192
          throw new Error(data);
1872 stevensc 193
        }
194
 
1884 stevensc 195
        setTimeout(() => {
3432 stevensc 196
          window.open(data, "_backend");
197
        }, 0);
1872 stevensc 198
      })
199
      .catch((error) => {
3432 stevensc 200
        console.log(">>: error > ", error);
201
      });
202
  };
5 stevensc 203
 
723 stevensc 204
  const navigateTo = (url) => {
3432 stevensc 205
    navigate(url);
206
  };
723 stevensc 207
 
5 stevensc 208
  return (
597 stevensc 209
    <>
613 stevensc 210
      <StyledItemContainer>
607 stevensc 211
        <StyledHeader>
212
          {image && <StyledAvatar src={image} alt={`${name} image`} />}
611 stevensc 213
          <StyledContent>
214
            <h2>{name}</h2>
597 stevensc 215
            {isTopData && email && <h4>{email}</h4>}
611 stevensc 216
            {network && <span>{network}</span>}
217
            {status && <span>{status}</span>}
597 stevensc 218
            {isTopData && (
219
              <ul>
220
                {link_view && (
221
                  <li>
1567 stevensc 222
                    <Button
3432 stevensc 223
                      color="primary"
929 stevensc 224
                      onClick={() => navigateTo(link_view)}
1567 stevensc 225
                    >
226
                      {btnAcceptTitle || labels.view_profile}
227
                    </Button>
597 stevensc 228
                  </li>
229
                )}
230
                {link_inmail && (
231
                  <li>
1567 stevensc 232
                    <Button
3432 stevensc 233
                      color="secondary"
929 stevensc 234
                      onClick={() => navigateTo(link_inmail)}
1567 stevensc 235
                    >
236
                      {labels.message}
237
                    </Button>
597 stevensc 238
                  </li>
239
                )}
240
              </ul>
241
            )}
611 stevensc 242
          </StyledContent>
607 stevensc 243
        </StyledHeader>
848 stevensc 244
        <Actions>
931 stevensc 245
          {link_view && !isTopData ? (
3432 stevensc 246
            <Button color="primary" onClick={() => navigateTo(link_view)}>
1567 stevensc 247
              {btnAcceptTitle || labels.view_profile}
248
            </Button>
929 stevensc 249
          ) : null}
5 stevensc 250
 
929 stevensc 251
          {link_edit ? (
3432 stevensc 252
            <Button onClick={() => navigateTo(link_edit)} color="secondary">
1567 stevensc 253
              {btnEditTitle || labels.edit}
254
            </Button>
929 stevensc 255
          ) : null}
5 stevensc 256
 
929 stevensc 257
          {link_accept ? (
3432 stevensc 258
            <Button onClick={() => onConfirm(link_accept)} color="secondary">
1567 stevensc 259
              {labels.accept}
260
            </Button>
929 stevensc 261
          ) : null}
5 stevensc 262
 
931 stevensc 263
          {link_inmail && !isTopData ? (
3432 stevensc 264
            <Button color="secondary" onClick={() => navigateTo(link_inmail)}>
1567 stevensc 265
              {labels.message}
266
            </Button>
929 stevensc 267
          ) : null}
5 stevensc 268
 
929 stevensc 269
          {link_admin ? (
3432 stevensc 270
            <Button color="secondary" onClick={() => getManageUrl(link_admin)}>
1567 stevensc 271
              {labels.administrate}
272
            </Button>
929 stevensc 273
          ) : null}
5 stevensc 274
 
929 stevensc 275
          {link_approve ? (
3432 stevensc 276
            <Button color="secondary" onClick={() => onConfirm(link_approve)}>
1567 stevensc 277
              {labels.approve}
278
            </Button>
929 stevensc 279
          ) : null}
5 stevensc 280
 
929 stevensc 281
          {link_unblock ? (
3432 stevensc 282
            <Button color="secondary" onClick={() => onConfirm(link_unblock)}>
1567 stevensc 283
              {labels.unblock}
284
            </Button>
929 stevensc 285
          ) : null}
5 stevensc 286
 
929 stevensc 287
          {link_request ? (
3432 stevensc 288
            <Button color="secondary" onClick={() => onConfirm(link_request)}>
1567 stevensc 289
              {labels.connect}
290
            </Button>
929 stevensc 291
          ) : null}
292
 
293
          {link_impersonate ? (
1567 stevensc 294
            <Button
3432 stevensc 295
              color="secondary"
929 stevensc 296
              onClick={() => getImpersonateUrl(link_impersonate)}
1567 stevensc 297
            >
298
              Personificar
299
            </Button>
929 stevensc 300
          ) : null}
301
 
302
          {link_remove ? (
3432 stevensc 303
            <Button color="info" onClick={() => showConfirm(link_remove)}>
2937 stevensc 304
              {btnRemoveLabel}
1567 stevensc 305
            </Button>
929 stevensc 306
          ) : null}
307
 
308
          {link_reject ? (
3432 stevensc 309
            <Button color="info" onClick={() => showConfirm(link_reject)}>
1567 stevensc 310
              {labels.reject}
311
            </Button>
929 stevensc 312
          ) : null}
313
 
314
          {link_delete ? (
3432 stevensc 315
            <Button color="info" onClick={() => showConfirm(link_delete)}>
1567 stevensc 316
              {btnCancelTitle || labels.cancel}
317
            </Button>
929 stevensc 318
          ) : null}
319
 
320
          {link_unfollow ? (
3432 stevensc 321
            <Button color="info" onClick={() => handleUnfollow(link_unfollow)}>
1567 stevensc 322
              {labels.unfollow}
323
            </Button>
929 stevensc 324
          ) : null}
325
 
326
          {link_block ? (
3432 stevensc 327
            <Button color="info" onClick={() => showConfirm(link_block)}>
1567 stevensc 328
              {labels.block}
329
            </Button>
929 stevensc 330
          ) : null}
331
 
332
          {link_cancel ? (
3432 stevensc 333
            <Button color="info" onClick={() => showConfirm(link_cancel)}>
1567 stevensc 334
              {labels.cancel}
335
            </Button>
929 stevensc 336
          ) : null}
337
 
338
          {link_leave ? (
3432 stevensc 339
            <Button color="info" onClick={() => showConfirm(link_leave)}>
1567 stevensc 340
              {btnLeaveTitle || labels.group_leave}
341
            </Button>
929 stevensc 342
          ) : null}
848 stevensc 343
        </Actions>
597 stevensc 344
        {loading && (
345
          <StyledSpinnerContainer>
346
            <Spinner />
347
          </StyledSpinnerContainer>
348
        )}
613 stevensc 349
      </StyledItemContainer>
597 stevensc 350
      <ConfirmModal
351
        show={isShowConfirmation}
352
        onClose={() => closeConfirm()}
353
        onAccept={() => onConfirm(confirmUrl.current)}
354
      />
355
    </>
3432 stevensc 356
  );
357
};
5 stevensc 358
 
3432 stevensc 359
export default ProfileItem;