Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
958 stevensc 1
import React, { useEffect, useMemo, useState } from 'react'
949 stevensc 2
import { Link } from 'react-router-dom'
5 stevensc 3
import { axios } from '../../../utils'
4
import { useSelector } from 'react-redux'
960 stevensc 5
import { Avatar, Box } from '@mui/material'
958 stevensc 6
import styled from 'styled-components'
5 stevensc 7
 
949 stevensc 8
import StyledContainer from '../WidgetLayout'
5 stevensc 9
import EmptySection from '../../UI/EmptySection'
10
 
958 stevensc 11
const WidgetHeader = styled(StyledContainer.Header)`
12
  align-items: baseline;
960 stevensc 13
  border: 1px solid var(--border-primary);
958 stevensc 14
  span {
15
    cursor: pointer;
16
  }
17
`
18
 
960 stevensc 19
const WidgetItem = styled.div`
20
  align-items: center;
21
  border-bottom: 1px solid var(--border-primary);
22
  display: flex;
23
  padding: 0.5rem 1rem;
24
  gap: 0.5rem;
25
  width: 100%;
26
  justify-content: space-between;
27
`
28
 
5 stevensc 29
const SuggestWidget = ({
30
  title = 'Mis Grupos:',
31
  url = '/helpers/my-groups',
949 stevensc 32
  btnLabelAccept = 'Ver'
5 stevensc 33
}) => {
958 stevensc 34
  const [data, setData] = useState([])
5 stevensc 35
  const [lookMore, setLookMore] = useState(false)
36
  const labels = useSelector(({ intl }) => intl.labels)
37
 
958 stevensc 38
  const items = useMemo(
39
    () => (lookMore ? data : [...data].slice(0, 3)),
959 stevensc 40
    [lookMore, data]
958 stevensc 41
  )
42
 
5 stevensc 43
  useEffect(() => {
959 stevensc 44
    const getData = (url) => {
45
      axios.get(url).then(({ data: response }) => {
46
        const { success, data } = response
47
        if (success) {
48
          setData(data.sort((a, b) => a.priority - b.priority).reverse())
49
        }
50
      })
51
    }
52
 
5 stevensc 53
    getData(url)
54
  }, [url])
55
 
56
  return (
949 stevensc 57
    <StyledContainer>
958 stevensc 58
      <WidgetHeader title={title}>
960 stevensc 59
        {items.length > 3 ? (
958 stevensc 60
          <span onClick={() => setLookMore(!lookMore)}>
5 stevensc 61
            {lookMore ? labels.view_less : labels.view_more}
62
          </span>
958 stevensc 63
        ) : null}
64
      </WidgetHeader>
949 stevensc 65
 
960 stevensc 66
      <Box
67
        display='flex'
68
        flexDirection='column'
69
        maxHeight='210'
70
        overflow='auto'
71
      >
72
        {data.length ? (
73
          items.map((suggest) => (
74
            <SuggestWidget.Item
75
              key={suggest.id}
76
              suggest={suggest}
77
              btnLabelAccept={btnLabelAccept}
78
            />
79
          ))
80
        ) : (
81
          <EmptySection align='left' message={labels?.datatable_empty} />
82
        )}
83
      </Box>
949 stevensc 84
    </StyledContainer>
5 stevensc 85
  )
86
}
87
 
88
const Item = ({ suggest, btnLabelAccept }) => {
960 stevensc 89
  const { name, profile, image } = suggest
5 stevensc 90
  const labels = useSelector(({ intl }) => intl.labels)
950 stevensc 91
 
5 stevensc 92
  return (
960 stevensc 93
    <WidgetItem>
949 stevensc 94
      <div className='d-inline-flex align-items-center'>
960 stevensc 95
        <Avatar
96
          sx={{ width: 60, height: 60 }}
97
          src={image}
98
          alt={`${name} profile image`}
99
        />
100
 
101
        <h4 className='break-ellipsis' title={name}>
102
          {name}
103
        </h4>
5 stevensc 104
      </div>
960 stevensc 105
 
106
      <Link to={profile} className='btn btn-primary ml-auto'>
5 stevensc 107
        {btnLabelAccept || labels.view_profile}
108
      </Link>
960 stevensc 109
    </WidgetItem>
5 stevensc 110
  )
111
}
112
 
113
SuggestWidget.Item = Item
114
 
115
export default SuggestWidget