Proyectos de Subversion LeadersLinked - SPA

Rev

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