Proyectos de Subversion LeadersLinked - SPA

Rev

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