Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 615 | Rev 645 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

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