Proyectos de Subversion LeadersLinked - SPA

Rev

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