Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1617 | Rev 1872 | 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'
723 stevensc 4
import { useHistory } 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;
29
  height: 100%;
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()
102
  const history = useHistory()
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
 
184
  const getManageUrl = async () => {
185
    try {
720 stevensc 186
      const { data } = await axios.get(link_admin)
187
      if (data.success) window.open(data.data, '_backend')
5 stevensc 188
    } catch (error) {
720 stevensc 189
      console.log('>>: error > ', error)
5 stevensc 190
    }
720 stevensc 191
  }
5 stevensc 192
 
723 stevensc 193
  const navigateTo = (url) => {
194
    history.push(url)
195
  }
196
 
5 stevensc 197
  return (
597 stevensc 198
    <>
613 stevensc 199
      <StyledItemContainer>
607 stevensc 200
        <StyledHeader>
201
          {image && <StyledAvatar src={image} alt={`${name} image`} />}
611 stevensc 202
          <StyledContent>
203
            <h2>{name}</h2>
597 stevensc 204
            {isTopData && email && <h4>{email}</h4>}
611 stevensc 205
            {network && <span>{network}</span>}
206
            {status && <span>{status}</span>}
597 stevensc 207
            {isTopData && (
208
              <ul>
209
                {link_view && (
210
                  <li>
1567 stevensc 211
                    <Button
212
                      variant='primary'
929 stevensc 213
                      onClick={() => navigateTo(link_view)}
1567 stevensc 214
                    >
215
                      {btnAcceptTitle || labels.view_profile}
216
                    </Button>
597 stevensc 217
                  </li>
218
                )}
219
                {link_inmail && (
220
                  <li>
1567 stevensc 221
                    <Button
222
                      variant='secondary'
929 stevensc 223
                      onClick={() => navigateTo(link_inmail)}
1567 stevensc 224
                    >
225
                      {labels.message}
226
                    </Button>
597 stevensc 227
                  </li>
228
                )}
229
              </ul>
230
            )}
611 stevensc 231
          </StyledContent>
607 stevensc 232
        </StyledHeader>
848 stevensc 233
        <Actions>
931 stevensc 234
          {link_view && !isTopData ? (
1567 stevensc 235
            <Button variant='primary' onClick={() => navigateTo(link_view)}>
236
              {btnAcceptTitle || labels.view_profile}
237
            </Button>
929 stevensc 238
          ) : null}
5 stevensc 239
 
929 stevensc 240
          {link_edit ? (
1567 stevensc 241
            <Button onClick={() => navigateTo(link_edit)} variant='secondary'>
242
              {btnEditTitle || labels.edit}
243
            </Button>
929 stevensc 244
          ) : null}
5 stevensc 245
 
929 stevensc 246
          {link_accept ? (
1567 stevensc 247
            <Button onClick={() => onConfirm(link_accept)} variant='secondary'>
248
              {labels.accept}
249
            </Button>
929 stevensc 250
          ) : null}
5 stevensc 251
 
931 stevensc 252
          {link_inmail && !isTopData ? (
1567 stevensc 253
            <Button variant='secondary' onClick={() => navigateTo(link_inmail)}>
254
              {labels.message}
255
            </Button>
929 stevensc 256
          ) : null}
5 stevensc 257
 
929 stevensc 258
          {link_admin ? (
1567 stevensc 259
            <Button
260
              variant='secondary'
929 stevensc 261
              onClick={() => getManageUrl(link_admin)}
1567 stevensc 262
            >
263
              {labels.administrate}
264
            </Button>
929 stevensc 265
          ) : null}
5 stevensc 266
 
929 stevensc 267
          {link_approve ? (
1567 stevensc 268
            <Button variant='secondary' onClick={() => onConfirm(link_approve)}>
269
              {labels.approve}
270
            </Button>
929 stevensc 271
          ) : null}
5 stevensc 272
 
929 stevensc 273
          {link_unblock ? (
1567 stevensc 274
            <Button variant='secondary' onClick={() => onConfirm(link_unblock)}>
275
              {labels.unblock}
276
            </Button>
929 stevensc 277
          ) : null}
5 stevensc 278
 
929 stevensc 279
          {link_request ? (
1567 stevensc 280
            <Button variant='secondary' onClick={() => onConfirm(link_request)}>
281
              {labels.connect}
282
            </Button>
929 stevensc 283
          ) : null}
284
 
285
          {link_impersonate ? (
1567 stevensc 286
            <Button
287
              variant='secondary'
929 stevensc 288
              onClick={() => getImpersonateUrl(link_impersonate)}
1567 stevensc 289
            >
290
              Personificar
291
            </Button>
929 stevensc 292
          ) : null}
293
 
294
          {link_remove ? (
1567 stevensc 295
            <Button variant='tertiary' onClick={() => showConfirm(link_remove)}>
296
              {labels.remove_application}
297
            </Button>
929 stevensc 298
          ) : null}
299
 
300
          {link_reject ? (
1567 stevensc 301
            <Button variant='tertiary' onClick={() => showConfirm(link_reject)}>
302
              {labels.reject}
303
            </Button>
929 stevensc 304
          ) : null}
305
 
306
          {link_delete ? (
1567 stevensc 307
            <Button variant='tertiary' onClick={() => showConfirm(link_delete)}>
308
              {btnCancelTitle || labels.cancel}
309
            </Button>
929 stevensc 310
          ) : null}
311
 
312
          {link_unfollow ? (
1567 stevensc 313
            <Button
314
              variant='tertiary'
929 stevensc 315
              onClick={() => handleUnfollow(link_unfollow)}
1567 stevensc 316
            >
317
              {labels.unfollow}
318
            </Button>
929 stevensc 319
          ) : null}
320
 
321
          {link_block ? (
1567 stevensc 322
            <Button variant='tertiary' onClick={() => showConfirm(link_block)}>
323
              {labels.block}
324
            </Button>
929 stevensc 325
          ) : null}
326
 
327
          {link_cancel ? (
1567 stevensc 328
            <Button variant='tertiary' onClick={() => showConfirm(link_cancel)}>
329
              {labels.cancel}
330
            </Button>
929 stevensc 331
          ) : null}
332
 
333
          {link_leave ? (
1567 stevensc 334
            <Button variant='tertiary' onClick={() => showConfirm(link_leave)}>
335
              {btnLeaveTitle || labels.group_leave}
336
            </Button>
929 stevensc 337
          ) : null}
848 stevensc 338
        </Actions>
597 stevensc 339
        {loading && (
340
          <StyledSpinnerContainer>
341
            <Spinner />
342
          </StyledSpinnerContainer>
343
        )}
613 stevensc 344
      </StyledItemContainer>
597 stevensc 345
      <ConfirmModal
346
        show={isShowConfirmation}
347
        onClose={() => closeConfirm()}
348
        onAccept={() => onConfirm(confirmUrl.current)}
349
      />
350
    </>
720 stevensc 351
  )
352
}
5 stevensc 353
 
720 stevensc 354
export default ProfileItem