Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1507 | Rev 1617 | 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 {
720 stevensc 116
      const { data } = await axios.get(url)
117
      if (data.success) window.location.href = data.data
5 stevensc 118
    } catch (error) {
720 stevensc 119
      console.log('>>: error > ', error)
5 stevensc 120
    }
720 stevensc 121
  }
5 stevensc 122
 
123
  const onConfirm = (url) => {
720 stevensc 124
    setLoading(true)
5 stevensc 125
    axios
126
      .post(url)
127
      .then((response) => {
720 stevensc 128
        const { success, data } = response.data
5 stevensc 129
 
130
        if (!success) {
131
          const errorMessage =
720 stevensc 132
            typeof data === 'string'
5 stevensc 133
              ? data
720 stevensc 134
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 135
 
720 stevensc 136
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
137
          return
5 stevensc 138
        }
139
 
720 stevensc 140
        if (fetchCallback) fetchCallback()
141
        dispatch(addNotification({ style: 'success', msg: data }))
5 stevensc 142
      })
526 stevensc 143
      .catch(() => {
5 stevensc 144
        dispatch(
145
          addNotification({
720 stevensc 146
            style: 'error',
147
            msg: 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 148
          })
720 stevensc 149
        )
5 stevensc 150
      })
151
      .finally(() => {
720 stevensc 152
        confirmUrl.current = ''
153
        setLoading(false)
154
      })
155
  }
5 stevensc 156
 
157
  const handleUnfollow = (link_unfollow) => {
720 stevensc 158
    setLoading(true)
5 stevensc 159
    axios
160
      .post(link_unfollow)
161
      .then((response) => {
720 stevensc 162
        const { data, success } = response.data
5 stevensc 163
 
164
        if (!success) {
165
          const errorMessage =
720 stevensc 166
            typeof data === 'string'
5 stevensc 167
              ? data
720 stevensc 168
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 169
 
720 stevensc 170
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
171
          return
5 stevensc 172
        }
173
 
720 stevensc 174
        if (fetchCallback) fetchCallback()
175
        dispatch(addNotification({ style: 'success', msg: data }))
5 stevensc 176
      })
720 stevensc 177
      .finally(() => setLoading(false))
178
  }
5 stevensc 179
 
180
  const getManageUrl = async () => {
181
    try {
720 stevensc 182
      const { data } = await axios.get(link_admin)
183
      if (data.success) window.open(data.data, '_backend')
5 stevensc 184
    } catch (error) {
720 stevensc 185
      console.log('>>: error > ', error)
5 stevensc 186
    }
720 stevensc 187
  }
5 stevensc 188
 
723 stevensc 189
  const navigateTo = (url) => {
190
    history.push(url)
191
  }
192
 
5 stevensc 193
  return (
597 stevensc 194
    <>
613 stevensc 195
      <StyledItemContainer>
607 stevensc 196
        <StyledHeader>
197
          {image && <StyledAvatar src={image} alt={`${name} image`} />}
611 stevensc 198
          <StyledContent>
199
            <h2>{name}</h2>
597 stevensc 200
            {isTopData && email && <h4>{email}</h4>}
611 stevensc 201
            {network && <span>{network}</span>}
202
            {status && <span>{status}</span>}
597 stevensc 203
            {isTopData && (
204
              <ul>
205
                {link_view && (
206
                  <li>
1567 stevensc 207
                    <Button
208
                      variant='primary'
929 stevensc 209
                      onClick={() => navigateTo(link_view)}
1567 stevensc 210
                    >
211
                      {btnAcceptTitle || labels.view_profile}
212
                    </Button>
597 stevensc 213
                  </li>
214
                )}
215
                {link_inmail && (
216
                  <li>
1567 stevensc 217
                    <Button
218
                      variant='secondary'
929 stevensc 219
                      onClick={() => navigateTo(link_inmail)}
1567 stevensc 220
                    >
221
                      {labels.message}
222
                    </Button>
597 stevensc 223
                  </li>
224
                )}
225
              </ul>
226
            )}
611 stevensc 227
          </StyledContent>
607 stevensc 228
        </StyledHeader>
848 stevensc 229
        <Actions>
931 stevensc 230
          {link_view && !isTopData ? (
1567 stevensc 231
            <Button variant='primary' onClick={() => navigateTo(link_view)}>
232
              {btnAcceptTitle || labels.view_profile}
233
            </Button>
929 stevensc 234
          ) : null}
5 stevensc 235
 
929 stevensc 236
          {link_edit ? (
1567 stevensc 237
            <Button onClick={() => navigateTo(link_edit)} variant='secondary'>
238
              {btnEditTitle || labels.edit}
239
            </Button>
929 stevensc 240
          ) : null}
5 stevensc 241
 
929 stevensc 242
          {link_accept ? (
1567 stevensc 243
            <Button onClick={() => onConfirm(link_accept)} variant='secondary'>
244
              {labels.accept}
245
            </Button>
929 stevensc 246
          ) : null}
5 stevensc 247
 
931 stevensc 248
          {link_inmail && !isTopData ? (
1567 stevensc 249
            <Button variant='secondary' onClick={() => navigateTo(link_inmail)}>
250
              {labels.message}
251
            </Button>
929 stevensc 252
          ) : null}
5 stevensc 253
 
929 stevensc 254
          {link_admin ? (
1567 stevensc 255
            <Button
256
              variant='secondary'
929 stevensc 257
              onClick={() => getManageUrl(link_admin)}
1567 stevensc 258
            >
259
              {labels.administrate}
260
            </Button>
929 stevensc 261
          ) : null}
5 stevensc 262
 
929 stevensc 263
          {link_approve ? (
1567 stevensc 264
            <Button variant='secondary' onClick={() => onConfirm(link_approve)}>
265
              {labels.approve}
266
            </Button>
929 stevensc 267
          ) : null}
5 stevensc 268
 
929 stevensc 269
          {link_unblock ? (
1567 stevensc 270
            <Button variant='secondary' onClick={() => onConfirm(link_unblock)}>
271
              {labels.unblock}
272
            </Button>
929 stevensc 273
          ) : null}
5 stevensc 274
 
929 stevensc 275
          {link_request ? (
1567 stevensc 276
            <Button variant='secondary' onClick={() => onConfirm(link_request)}>
277
              {labels.connect}
278
            </Button>
929 stevensc 279
          ) : null}
280
 
281
          {link_impersonate ? (
1567 stevensc 282
            <Button
283
              variant='secondary'
929 stevensc 284
              onClick={() => getImpersonateUrl(link_impersonate)}
1567 stevensc 285
            >
286
              Personificar
287
            </Button>
929 stevensc 288
          ) : null}
289
 
290
          {link_remove ? (
1567 stevensc 291
            <Button variant='tertiary' onClick={() => showConfirm(link_remove)}>
292
              {labels.remove_application}
293
            </Button>
929 stevensc 294
          ) : null}
295
 
296
          {link_reject ? (
1567 stevensc 297
            <Button variant='tertiary' onClick={() => showConfirm(link_reject)}>
298
              {labels.reject}
299
            </Button>
929 stevensc 300
          ) : null}
301
 
302
          {link_delete ? (
1567 stevensc 303
            <Button variant='tertiary' onClick={() => showConfirm(link_delete)}>
304
              {btnCancelTitle || labels.cancel}
305
            </Button>
929 stevensc 306
          ) : null}
307
 
308
          {link_unfollow ? (
1567 stevensc 309
            <Button
310
              variant='tertiary'
929 stevensc 311
              onClick={() => handleUnfollow(link_unfollow)}
1567 stevensc 312
            >
313
              {labels.unfollow}
314
            </Button>
929 stevensc 315
          ) : null}
316
 
317
          {link_block ? (
1567 stevensc 318
            <Button variant='tertiary' onClick={() => showConfirm(link_block)}>
319
              {labels.block}
320
            </Button>
929 stevensc 321
          ) : null}
322
 
323
          {link_cancel ? (
1567 stevensc 324
            <Button variant='tertiary' onClick={() => showConfirm(link_cancel)}>
325
              {labels.cancel}
326
            </Button>
929 stevensc 327
          ) : null}
328
 
329
          {link_leave ? (
1567 stevensc 330
            <Button variant='tertiary' onClick={() => showConfirm(link_leave)}>
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
    </>
720 stevensc 347
  )
348
}
5 stevensc 349
 
720 stevensc 350
export default ProfileItem