Proyectos de Subversion LeadersLinked - SPA

Rev

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