Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3677 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
 
3677 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,
3677 stevensc 96
  isTopData
5 stevensc 97
}) => {
3432 stevensc 98
  const [isShowConfirmation, setIsShowConfirmation] = useState(false);
99
  const [loading, setLoading] = useState(false);
3677 stevensc 100
  const confirmUrl = useRef('');
3432 stevensc 101
  const labels = useSelector(({ intl }) => intl.labels);
102
  const dispatch = useDispatch();
103
  const navigate = useNavigate();
5 stevensc 104
 
3677 stevensc 105
  const showConfirm = (url = '') => {
3432 stevensc 106
    setIsShowConfirmation(true);
107
    confirmUrl.current = url;
108
  };
5 stevensc 109
 
496 stevensc 110
  const closeConfirm = () => {
3432 stevensc 111
    setIsShowConfirmation(false);
3677 stevensc 112
    confirmUrl.current = '';
3432 stevensc 113
  };
5 stevensc 114
 
3677 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) {
3677 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 =
3677 stevensc 137
            typeof data === 'string'
5 stevensc 138
              ? data
3677 stevensc 139
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.';
5 stevensc 140
 
3677 stevensc 141
          dispatch(addNotification({ style: 'danger', msg: errorMessage }));
3432 stevensc 142
          return;
5 stevensc 143
        }
144
 
3432 stevensc 145
        if (fetchCallback) fetchCallback();
3677 stevensc 146
        dispatch(addNotification({ style: 'success', msg: data }));
5 stevensc 147
      })
526 stevensc 148
      .catch(() => {
5 stevensc 149
        dispatch(
150
          addNotification({
3677 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(() => {
3677 stevensc 157
        confirmUrl.current = '';
3432 stevensc 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 =
3677 stevensc 171
            typeof data === 'string'
5 stevensc 172
              ? data
3677 stevensc 173
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.';
5 stevensc 174
 
3677 stevensc 175
          dispatch(addNotification({ style: 'danger', msg: errorMessage }));
3432 stevensc 176
          return;
5 stevensc 177
        }
178
 
3432 stevensc 179
        if (fetchCallback) fetchCallback();
3677 stevensc 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(() => {
3677 stevensc 196
          window.open(data, '_backend');
3432 stevensc 197
        }, 0);
1872 stevensc 198
      })
199
      .catch((error) => {
3677 stevensc 200
        console.log('>>: error > ', error);
3432 stevensc 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>
3677 stevensc 222
                    <Button color='primary' onClick={() => navigateTo(link_view)}>
1567 stevensc 223
                      {btnAcceptTitle || labels.view_profile}
224
                    </Button>
597 stevensc 225
                  </li>
226
                )}
227
                {link_inmail && (
228
                  <li>
3677 stevensc 229
                    <Button color='secondary' onClick={() => navigateTo(link_inmail)}>
1567 stevensc 230
                      {labels.message}
231
                    </Button>
597 stevensc 232
                  </li>
233
                )}
234
              </ul>
235
            )}
611 stevensc 236
          </StyledContent>
607 stevensc 237
        </StyledHeader>
848 stevensc 238
        <Actions>
931 stevensc 239
          {link_view && !isTopData ? (
3677 stevensc 240
            <Button color='primary' onClick={() => navigateTo(link_view)}>
1567 stevensc 241
              {btnAcceptTitle || labels.view_profile}
242
            </Button>
929 stevensc 243
          ) : null}
5 stevensc 244
 
929 stevensc 245
          {link_edit ? (
3677 stevensc 246
            <Button onClick={() => navigateTo(link_edit)} color='secondary'>
1567 stevensc 247
              {btnEditTitle || labels.edit}
248
            </Button>
929 stevensc 249
          ) : null}
5 stevensc 250
 
929 stevensc 251
          {link_accept ? (
3677 stevensc 252
            <Button onClick={() => onConfirm(link_accept)} color='secondary'>
1567 stevensc 253
              {labels.accept}
254
            </Button>
929 stevensc 255
          ) : null}
5 stevensc 256
 
931 stevensc 257
          {link_inmail && !isTopData ? (
3677 stevensc 258
            <Button color='secondary' onClick={() => navigateTo(link_inmail)}>
1567 stevensc 259
              {labels.message}
260
            </Button>
929 stevensc 261
          ) : null}
5 stevensc 262
 
929 stevensc 263
          {link_admin ? (
3677 stevensc 264
            <Button color='secondary' onClick={() => getManageUrl(link_admin)}>
1567 stevensc 265
              {labels.administrate}
266
            </Button>
929 stevensc 267
          ) : null}
5 stevensc 268
 
929 stevensc 269
          {link_approve ? (
3677 stevensc 270
            <Button color='secondary' onClick={() => onConfirm(link_approve)}>
1567 stevensc 271
              {labels.approve}
272
            </Button>
929 stevensc 273
          ) : null}
5 stevensc 274
 
929 stevensc 275
          {link_unblock ? (
3677 stevensc 276
            <Button color='secondary' onClick={() => onConfirm(link_unblock)}>
1567 stevensc 277
              {labels.unblock}
278
            </Button>
929 stevensc 279
          ) : null}
5 stevensc 280
 
929 stevensc 281
          {link_request ? (
3677 stevensc 282
            <Button color='secondary' onClick={() => onConfirm(link_request)}>
1567 stevensc 283
              {labels.connect}
284
            </Button>
929 stevensc 285
          ) : null}
286
 
287
          {link_impersonate ? (
3677 stevensc 288
            <Button color='secondary' onClick={() => getImpersonateUrl(link_impersonate)}>
1567 stevensc 289
              Personificar
290
            </Button>
929 stevensc 291
          ) : null}
292
 
293
          {link_remove ? (
3677 stevensc 294
            <Button color='info' onClick={() => showConfirm(link_remove)}>
2937 stevensc 295
              {btnRemoveLabel}
1567 stevensc 296
            </Button>
929 stevensc 297
          ) : null}
298
 
299
          {link_reject ? (
3677 stevensc 300
            <Button color='info' onClick={() => showConfirm(link_reject)}>
1567 stevensc 301
              {labels.reject}
302
            </Button>
929 stevensc 303
          ) : null}
304
 
305
          {link_delete ? (
3677 stevensc 306
            <Button color='info' onClick={() => showConfirm(link_delete)}>
1567 stevensc 307
              {btnCancelTitle || labels.cancel}
308
            </Button>
929 stevensc 309
          ) : null}
310
 
311
          {link_unfollow ? (
3677 stevensc 312
            <Button color='info' onClick={() => handleUnfollow(link_unfollow)}>
1567 stevensc 313
              {labels.unfollow}
314
            </Button>
929 stevensc 315
          ) : null}
316
 
317
          {link_block ? (
3677 stevensc 318
            <Button color='info' onClick={() => showConfirm(link_block)}>
1567 stevensc 319
              {labels.block}
320
            </Button>
929 stevensc 321
          ) : null}
322
 
323
          {link_cancel ? (
3677 stevensc 324
            <Button color='info' onClick={() => showConfirm(link_cancel)}>
1567 stevensc 325
              {labels.cancel}
326
            </Button>
929 stevensc 327
          ) : null}
328
 
329
          {link_leave ? (
3677 stevensc 330
            <Button color='info' onClick={() => showConfirm(link_leave)}>
1567 stevensc 331
              {btnLeaveTitle || labels.group_leave}
332
            </Button>
929 stevensc 333
          ) : null}
848 stevensc 334
        </Actions>
597 stevensc 335
        {loading && (
336
          <StyledSpinnerContainer>
337
            <Spinner />
338
          </StyledSpinnerContainer>
339
        )}
613 stevensc 340
      </StyledItemContainer>
597 stevensc 341
      <ConfirmModal
342
        show={isShowConfirmation}
343
        onClose={() => closeConfirm()}
344
        onAccept={() => onConfirm(confirmUrl.current)}
345
      />
346
    </>
3432 stevensc 347
  );
348
};
5 stevensc 349
 
3432 stevensc 350
export default ProfileItem;