Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1330 | Rev 1567 | 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
 
956 stevensc 9
import { ButtonPrimary, ButtonSecondary, ButtonTertiary } from '@buttons'
720 stevensc 10
import Spinner from '../UI/Spinner'
1507 stevensc 11
import WidgetWrapper from '../widgets/WidgetLayout'
720 stevensc 12
import ConfirmModal from '../modals/ConfirmModal'
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>
929 stevensc 207
                    <ButtonPrimary
208
                      label={btnAcceptTitle || labels.view_profile}
209
                      onClick={() => navigateTo(link_view)}
210
                    />
597 stevensc 211
                  </li>
212
                )}
213
                {link_inmail && (
214
                  <li>
929 stevensc 215
                    <ButtonSecondary
216
                      label={labels.message}
217
                      onClick={() => navigateTo(link_inmail)}
218
                    />
597 stevensc 219
                  </li>
220
                )}
221
              </ul>
222
            )}
611 stevensc 223
          </StyledContent>
607 stevensc 224
        </StyledHeader>
848 stevensc 225
        <Actions>
931 stevensc 226
          {link_view && !isTopData ? (
929 stevensc 227
            <ButtonPrimary
228
              onClick={() => navigateTo(link_view)}
229
              label={btnAcceptTitle || labels.view_profile}
230
            />
231
          ) : null}
5 stevensc 232
 
929 stevensc 233
          {link_edit ? (
234
            <ButtonSecondary
235
              onClick={() => navigateTo(link_edit)}
236
              label={btnEditTitle || labels.edit}
237
            />
238
          ) : null}
5 stevensc 239
 
929 stevensc 240
          {link_accept ? (
241
            <ButtonSecondary
242
              onClick={() => onConfirm(link_accept)}
243
              label={labels.accept}
244
            />
245
          ) : null}
5 stevensc 246
 
931 stevensc 247
          {link_inmail && !isTopData ? (
929 stevensc 248
            <ButtonSecondary
249
              onClick={() => navigateTo(link_inmail)}
250
              label={labels.message}
251
            />
252
          ) : null}
5 stevensc 253
 
929 stevensc 254
          {link_admin ? (
255
            <ButtonSecondary
256
              onClick={() => getManageUrl(link_admin)}
257
              label={labels.administrate}
258
            />
259
          ) : null}
5 stevensc 260
 
929 stevensc 261
          {link_approve ? (
262
            <ButtonSecondary
933 stevensc 263
              onClick={() => onConfirm(link_approve)}
929 stevensc 264
              label={labels.approve}
265
            />
266
          ) : null}
5 stevensc 267
 
929 stevensc 268
          {link_unblock ? (
269
            <ButtonSecondary
933 stevensc 270
              onClick={() => onConfirm(link_unblock)}
929 stevensc 271
              label={labels.unblock}
272
            />
273
          ) : null}
5 stevensc 274
 
929 stevensc 275
          {link_request ? (
276
            <ButtonSecondary
933 stevensc 277
              onClick={() => onConfirm(link_request)}
929 stevensc 278
              label={labels.connect}
279
            />
280
          ) : null}
281
 
282
          {link_impersonate ? (
283
            <ButtonSecondary
284
              onClick={() => getImpersonateUrl(link_impersonate)}
285
              label='Personificar'
286
            />
287
          ) : null}
288
 
289
          {link_remove ? (
290
            <ButtonTertiary
291
              onClick={() => showConfirm(link_remove)}
292
              label={labels.remove_application}
293
            />
294
          ) : null}
295
 
296
          {link_reject ? (
297
            <ButtonTertiary
298
              onClick={() => showConfirm(link_reject)}
299
              label={labels.reject}
300
            />
301
          ) : null}
302
 
303
          {link_delete ? (
304
            <ButtonTertiary
305
              onClick={() => showConfirm(link_delete)}
306
              label={btnCancelTitle || labels.cancel}
307
            />
308
          ) : null}
309
 
310
          {link_unfollow ? (
311
            <ButtonTertiary
312
              onClick={() => handleUnfollow(link_unfollow)}
313
              label={labels.unfollow}
314
            />
315
          ) : null}
316
 
317
          {link_block ? (
318
            <ButtonTertiary
319
              onClick={() => showConfirm(link_block)}
320
              label={labels.block}
321
            />
322
          ) : null}
323
 
324
          {link_cancel ? (
325
            <ButtonTertiary
326
              onClick={() => showConfirm(link_cancel)}
327
              label={labels.cancel}
328
            />
329
          ) : null}
330
 
331
          {link_leave ? (
332
            <ButtonTertiary
333
              onClick={() => showConfirm(link_leave)}
933 stevensc 334
              label={btnLeaveTitle || labels.group_leave}
929 stevensc 335
            />
336
          ) : null}
848 stevensc 337
        </Actions>
597 stevensc 338
        {loading && (
339
          <StyledSpinnerContainer>
340
            <Spinner />
341
          </StyledSpinnerContainer>
342
        )}
613 stevensc 343
      </StyledItemContainer>
597 stevensc 344
      <ConfirmModal
345
        show={isShowConfirmation}
346
        onClose={() => closeConfirm()}
347
        onAccept={() => onConfirm(confirmUrl.current)}
348
      />
349
    </>
720 stevensc 350
  )
351
}
5 stevensc 352
 
720 stevensc 353
export default ProfileItem