Proyectos de Subversion LeadersLinked - SPA

Rev

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