Proyectos de Subversion LeadersLinked - SPA

Rev

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

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