Proyectos de Subversion LeadersLinked - SPA

Rev

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