Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 848 | Rev 931 | 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
import { device } from '../../styles/MediaQueries'
9
 
720 stevensc 10
import Spinner from '../UI/Spinner'
11
import StyledContainer from '../widgets/WidgetLayout'
12
import ConfirmModal from '../modals/ConfirmModal'
929 stevensc 13
import ButtonPrimary from 'components/UI/buttons/ButtonPrimary'
14
import ButtonSecondary from 'components/UI/buttons/ButtonSecondary'
15
import ButtonTertiary from 'components/UI/buttons/ButtonTertiary'
5 stevensc 16
 
17
const StyledSpinnerContainer = styled.div`
18
  position: absolute;
19
  left: 0;
20
  top: 0;
21
  width: 100%;
22
  height: 100%;
23
  background: rgba(255, 255, 255, 0.4);
24
  place-items: center;
496 stevensc 25
  z-index: 50;
720 stevensc 26
`
607 stevensc 27
 
613 stevensc 28
const StyledItemContainer = styled(StyledContainer)`
29
  display: flex;
30
  flex-direction: column;
31
  justify-content: center;
32
  height: 100%;
720 stevensc 33
  border-radius: 5px;
34
`
613 stevensc 35
 
607 stevensc 36
const StyledHeader = styled.div`
37
  align-items: center;
38
  display: flex;
39
  gap: 0.5rem;
663 andreina 40
  justify-content: flex-start;
607 stevensc 41
  position: relative;
663 andreina 42
  padding: 15px 5px;
720 stevensc 43
`
607 stevensc 44
 
611 stevensc 45
const StyledContent = styled.div`
46
  display: flex;
47
  flex-direction: column;
48
  text-align: center;
645 stevensc 49
  ul {
611 stevensc 50
    align-items: center;
51
    display: flex;
52
    justify-content: center;
721 stevensc 53
    gap: 0.5rem;
722 stevensc 54
    button {
721 stevensc 55
      align-items: center;
56
      border-radius: var(--border-radius);
57
      cursor: pointer;
58
      display: inline-flex;
59
      flex-direction: column;
60
      font-size: 0.9rem;
61
      padding: 5px;
62
      position: relative;
63
      &:hover {
64
        background-color: whitesmoke;
65
      }
66
      @media ${device.tablet} {
67
        flex-direction: row;
68
        gap: 0.5rem;
69
        font-size: 1rem;
70
      }
71
    }
611 stevensc 72
  }
720 stevensc 73
`
611 stevensc 74
 
848 stevensc 75
const Actions = styled.div`
76
  display: flex;
77
  justify-content: space-around;
78
  border-top: 1px solid rgb(211, 211, 211);
79
  padding: 5px;
929 stevensc 80
  gap: 0.5rem;
848 stevensc 81
`
82
 
607 stevensc 83
const StyledAvatar = styled(Avatar)`
665 andreina 84
  height: 60px !important;
720 stevensc 85
  width: 60px !important;
86
`
607 stevensc 87
 
5 stevensc 88
const ProfileItem = ({
89
  image,
90
  name,
91
  email,
92
  network,
93
  status,
94
  fetchCallback,
95
  link_remove,
96
  link_view,
97
  link_edit,
98
  link_delete,
99
  link_cancel,
100
  link_block,
101
  link_reject,
102
  link_accept,
103
  link_inmail,
104
  link_request,
105
  link_unblock,
106
  link_unfollow,
107
  link_approve,
108
  link_leave,
109
  link_admin,
110
  link_impersonate,
720 stevensc 111
  btnAcceptTitle = 'Ver',
112
  btnCancelTitle = 'Borrar',
113
  btnEditTitle = 'Editar',
114
  btnLeaveTitle = 'Dejar',
115
  isTopData
5 stevensc 116
}) => {
720 stevensc 117
  const [isShowConfirmation, setIsShowConfirmation] = useState(false)
118
  const [loading, setLoading] = useState(false)
119
  const confirmUrl = useRef('')
120
  const labels = useSelector(({ intl }) => intl.labels)
121
  const dispatch = useDispatch()
122
  const history = useHistory()
5 stevensc 123
 
720 stevensc 124
  const showConfirm = (url = '') => {
125
    setIsShowConfirmation(true)
126
    confirmUrl.current = url
127
  }
5 stevensc 128
 
496 stevensc 129
  const closeConfirm = () => {
720 stevensc 130
    setIsShowConfirmation(false)
131
    confirmUrl.current = ''
132
  }
5 stevensc 133
 
720 stevensc 134
  const getImpersonateUrl = async (url = '') => {
5 stevensc 135
    try {
720 stevensc 136
      const { data } = await axios.get(url)
137
      if (data.success) window.location.href = data.data
5 stevensc 138
    } catch (error) {
720 stevensc 139
      console.log('>>: error > ', error)
5 stevensc 140
    }
720 stevensc 141
  }
5 stevensc 142
 
143
  const onConfirm = (url) => {
720 stevensc 144
    setLoading(true)
5 stevensc 145
    axios
146
      .post(url)
147
      .then((response) => {
720 stevensc 148
        const { success, data } = response.data
5 stevensc 149
 
150
        if (!success) {
151
          const errorMessage =
720 stevensc 152
            typeof data === 'string'
5 stevensc 153
              ? data
720 stevensc 154
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 155
 
720 stevensc 156
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
157
          return
5 stevensc 158
        }
159
 
720 stevensc 160
        if (fetchCallback) fetchCallback()
161
        dispatch(addNotification({ style: 'success', msg: data }))
5 stevensc 162
      })
526 stevensc 163
      .catch(() => {
5 stevensc 164
        dispatch(
165
          addNotification({
720 stevensc 166
            style: 'error',
167
            msg: 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 168
          })
720 stevensc 169
        )
5 stevensc 170
      })
171
      .finally(() => {
720 stevensc 172
        confirmUrl.current = ''
173
        setLoading(false)
174
      })
175
  }
5 stevensc 176
 
177
  const handleUnfollow = (link_unfollow) => {
720 stevensc 178
    setLoading(true)
5 stevensc 179
    axios
180
      .post(link_unfollow)
181
      .then((response) => {
720 stevensc 182
        const { data, success } = response.data
5 stevensc 183
 
184
        if (!success) {
185
          const errorMessage =
720 stevensc 186
            typeof data === 'string'
5 stevensc 187
              ? data
720 stevensc 188
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 189
 
720 stevensc 190
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
191
          return
5 stevensc 192
        }
193
 
720 stevensc 194
        if (fetchCallback) fetchCallback()
195
        dispatch(addNotification({ style: 'success', msg: data }))
5 stevensc 196
      })
720 stevensc 197
      .finally(() => setLoading(false))
198
  }
5 stevensc 199
 
200
  const getManageUrl = async () => {
201
    try {
720 stevensc 202
      const { data } = await axios.get(link_admin)
203
      if (data.success) window.open(data.data, '_backend')
5 stevensc 204
    } catch (error) {
720 stevensc 205
      console.log('>>: error > ', error)
5 stevensc 206
    }
720 stevensc 207
  }
5 stevensc 208
 
723 stevensc 209
  const navigateTo = (url) => {
210
    history.push(url)
211
  }
212
 
5 stevensc 213
  return (
597 stevensc 214
    <>
613 stevensc 215
      <StyledItemContainer>
607 stevensc 216
        <StyledHeader>
217
          {image && <StyledAvatar src={image} alt={`${name} image`} />}
611 stevensc 218
          <StyledContent>
219
            <h2>{name}</h2>
597 stevensc 220
            {isTopData && email && <h4>{email}</h4>}
611 stevensc 221
            {network && <span>{network}</span>}
222
            {status && <span>{status}</span>}
597 stevensc 223
            {isTopData && (
224
              <ul>
225
                {link_view && (
226
                  <li>
929 stevensc 227
                    <ButtonPrimary
228
                      label={btnAcceptTitle || labels.view_profile}
229
                      onClick={() => navigateTo(link_view)}
230
                    />
597 stevensc 231
                  </li>
232
                )}
233
                {link_inmail && (
234
                  <li>
929 stevensc 235
                    <ButtonSecondary
236
                      label={labels.message}
237
                      onClick={() => navigateTo(link_inmail)}
238
                    />
597 stevensc 239
                  </li>
240
                )}
241
              </ul>
242
            )}
611 stevensc 243
          </StyledContent>
607 stevensc 244
        </StyledHeader>
848 stevensc 245
        <Actions>
929 stevensc 246
          {link_view ? (
247
            <ButtonPrimary
248
              onClick={() => navigateTo(link_view)}
249
              label={btnAcceptTitle || labels.view_profile}
250
            />
251
          ) : null}
5 stevensc 252
 
929 stevensc 253
          {link_edit ? (
254
            <ButtonSecondary
255
              onClick={() => navigateTo(link_edit)}
256
              label={btnEditTitle || labels.edit}
257
            />
258
          ) : null}
5 stevensc 259
 
929 stevensc 260
          {link_accept ? (
261
            <ButtonSecondary
262
              onClick={() => onConfirm(link_accept)}
263
              label={labels.accept}
264
            />
265
          ) : null}
5 stevensc 266
 
929 stevensc 267
          {link_inmail ? (
268
            <ButtonSecondary
269
              onClick={() => navigateTo(link_inmail)}
270
              label={labels.message}
271
            />
272
          ) : null}
5 stevensc 273
 
929 stevensc 274
          {link_admin ? (
275
            <ButtonSecondary
276
              onClick={() => getManageUrl(link_admin)}
277
              label={labels.administrate}
278
            />
279
          ) : null}
5 stevensc 280
 
929 stevensc 281
          {link_approve ? (
282
            <ButtonSecondary
283
              onClick={() => confirmUrl(link_approve)}
284
              label={labels.approve}
285
            />
286
          ) : null}
5 stevensc 287
 
929 stevensc 288
          {link_unblock ? (
289
            <ButtonSecondary
290
              onClick={() => confirmUrl(link_unblock)}
291
              label={labels.unblock}
292
            />
293
          ) : null}
5 stevensc 294
 
929 stevensc 295
          {link_request ? (
296
            <ButtonSecondary
297
              onClick={() => confirmUrl(link_request)}
298
              label={labels.connect}
299
            />
300
          ) : null}
301
 
302
          {link_impersonate ? (
303
            <ButtonSecondary
304
              onClick={() => getImpersonateUrl(link_impersonate)}
305
              label='Personificar'
306
            />
307
          ) : null}
308
 
309
          {link_remove ? (
310
            <ButtonTertiary
311
              onClick={() => showConfirm(link_remove)}
312
              label={labels.remove_application}
313
            />
314
          ) : null}
315
 
316
          {link_reject ? (
317
            <ButtonTertiary
318
              onClick={() => showConfirm(link_reject)}
319
              label={labels.reject}
320
            />
321
          ) : null}
322
 
323
          {link_delete ? (
324
            <ButtonTertiary
325
              onClick={() => showConfirm(link_delete)}
326
              label={btnCancelTitle || labels.cancel}
327
            />
328
          ) : null}
329
 
330
          {link_unfollow ? (
331
            <ButtonTertiary
332
              onClick={() => handleUnfollow(link_unfollow)}
333
              label={labels.unfollow}
334
            />
335
          ) : null}
336
 
337
          {link_block ? (
338
            <ButtonTertiary
339
              onClick={() => showConfirm(link_block)}
340
              label={labels.block}
341
            />
342
          ) : null}
343
 
344
          {link_cancel ? (
345
            <ButtonTertiary
346
              onClick={() => showConfirm(link_cancel)}
347
              label={labels.cancel}
348
            />
349
          ) : null}
350
 
351
          {link_leave ? (
352
            <ButtonTertiary
353
              onClick={() => showConfirm(link_leave)}
354
              label={btnLeaveTitle}
355
            />
356
          ) : null}
848 stevensc 357
        </Actions>
597 stevensc 358
        {loading && (
359
          <StyledSpinnerContainer>
360
            <Spinner />
361
          </StyledSpinnerContainer>
362
        )}
613 stevensc 363
      </StyledItemContainer>
597 stevensc 364
      <ConfirmModal
365
        show={isShowConfirmation}
366
        onClose={() => closeConfirm()}
367
        onAccept={() => onConfirm(confirmUrl.current)}
368
      />
369
    </>
720 stevensc 370
  )
371
}
5 stevensc 372
 
720 stevensc 373
export default ProfileItem