Proyectos de Subversion LeadersLinked - SPA

Rev

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