Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 721 | Rev 723 | 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'
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
 
213
  const linksOptions = [
214
    {
215
      label: btnAcceptTitle || labels.accept,
216
      url: link_view,
720 stevensc 217
      color: 'primary',
218
      icon: OpenInNew
5 stevensc 219
    },
220
    {
720 stevensc 221
      label: btnEditTitle || labels.edit,
222
      url: link_edit,
223
      color: 'secondary',
224
      icon: Edit
225
    },
226
    { label: labels.approve, url: link_approve, color: 'tertiary', icon: Done },
227
    { label: btnLeaveTitle, url: link_remove, color: 'tertiary', icon: Remove },
228
    { label: labels.accept, url: link_accept, color: 'secondary', icon: Done },
229
    {
230
      label: labels.reject,
231
      url: link_reject,
232
      color: 'tertiary',
233
      icon: CancelOutlined
234
    },
235
    {
5 stevensc 236
      label: btnCancelTitle || labels.cancel,
237
      url: link_delete,
720 stevensc 238
      color: 'tertiary',
239
      icon: DeleteOutline
5 stevensc 240
    },
241
    {
720 stevensc 242
      label: labels.message || 'Mensaje',
5 stevensc 243
      url: link_inmail,
720 stevensc 244
      color: 'secondary',
245
      icon: ChatOutlined
5 stevensc 246
    },
720 stevensc 247
    {
248
      label: labels.administrate,
249
      url: link_admin,
250
      color: 'secondary',
251
      icon: SupervisorAccountOutlined
252
    },
253
    {
254
      label: labels.unfollow,
255
      url: link_unfollow,
256
      color: 'tertiary',
257
      icon: PersonRemoveOutlined
258
    },
259
    {
260
      label: labels.block,
261
      url: link_block,
262
      color: 'tertiary',
263
      icon: LockOutlined
264
    },
265
    {
266
      label: labels.unblock,
267
      url: link_unblock,
268
      color: 'tertiary',
269
      icon: LockOpenOutlined
270
    },
271
    {
272
      label: labels.connect,
273
      url: link_request,
274
      color: 'tertiary',
275
      icon: PersonAddOutlined
276
    },
277
    {
278
      label: labels.cancel,
279
      url: link_cancel,
280
      color: 'tertiary',
281
      icon: CancelOutlined
282
    },
283
    {
284
      label: btnLeaveTitle,
285
      url: link_leave,
286
      color: 'tertiary',
287
      icon: LogoutOutlined
288
    },
289
    {
290
      label: 'Personificar',
291
      url: link_impersonate,
292
      color: 'tertiary',
293
      icon: AccountCircleOutlined
294
    }
295
  ]
5 stevensc 296
 
297
  return (
597 stevensc 298
    <>
613 stevensc 299
      <StyledItemContainer>
607 stevensc 300
        <StyledHeader>
301
          {image && <StyledAvatar src={image} alt={`${name} image`} />}
611 stevensc 302
          <StyledContent>
303
            <h2>{name}</h2>
597 stevensc 304
            {isTopData && email && <h4>{email}</h4>}
611 stevensc 305
            {network && <span>{network}</span>}
306
            {status && <span>{status}</span>}
597 stevensc 307
            {isTopData && (
308
              <ul>
309
                {link_view && (
310
                  <li>
721 stevensc 311
                    <Link to={link_view}>
312
                      <button>
313
                        <OpenInNew />
314
                        {btnAcceptTitle}
315
                      </button>
597 stevensc 316
                    </Link>
317
                  </li>
318
                )}
319
                {link_inmail && (
320
                  <li>
721 stevensc 321
                    <Link to={link_inmail}>
322
                      <button>
323
                        <ChatOutlined />
324
                        {labels.message}
325
                      </button>
597 stevensc 326
                    </Link>
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