Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 958 | Rev 960 | 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'
955 stevensc 5
import { 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
  padding-bottom: 0;
13
  align-items: baseline;
14
  span {
15
    cursor: pointer;
16
  }
17
`
18
 
5 stevensc 19
const SuggestWidget = ({
20
  title = 'Mis Grupos:',
21
  url = '/helpers/my-groups',
949 stevensc 22
  btnLabelAccept = 'Ver'
5 stevensc 23
}) => {
958 stevensc 24
  const [data, setData] = useState([])
5 stevensc 25
  const [lookMore, setLookMore] = useState(false)
26
  const labels = useSelector(({ intl }) => intl.labels)
27
 
958 stevensc 28
  const items = useMemo(
29
    () => (lookMore ? data : [...data].slice(0, 3)),
959 stevensc 30
    [lookMore, data]
958 stevensc 31
  )
32
 
5 stevensc 33
  useEffect(() => {
959 stevensc 34
    const getData = (url) => {
35
      axios.get(url).then(({ data: response }) => {
36
        const { success, data } = response
37
        if (success) {
38
          setData(data.sort((a, b) => a.priority - b.priority).reverse())
39
        }
40
      })
41
    }
42
 
5 stevensc 43
    getData(url)
44
  }, [url])
45
 
46
  return (
949 stevensc 47
    <StyledContainer>
958 stevensc 48
      <WidgetHeader title={title}>
49
        {items.length >= 3 ? (
50
          <span onClick={() => setLookMore(!lookMore)}>
5 stevensc 51
            {lookMore ? labels.view_less : labels.view_more}
52
          </span>
958 stevensc 53
        ) : null}
54
      </WidgetHeader>
949 stevensc 55
 
56
      <StyledContainer.Body>
956 stevensc 57
        <Box
58
          display='flex'
59
          flexDirection='column'
60
          maxHeight='350'
61
          overflow='auto'
62
        >
958 stevensc 63
          {data.length ? (
64
            items.map((suggest) => (
949 stevensc 65
              <SuggestWidget.Item
66
                key={suggest.id}
67
                suggest={suggest}
68
                btnLabelAccept={btnLabelAccept}
69
              />
70
            ))
71
          ) : (
72
            <EmptySection align='left' message={labels?.datatable_empty} />
73
          )}
955 stevensc 74
        </Box>
949 stevensc 75
      </StyledContainer.Body>
76
    </StyledContainer>
5 stevensc 77
  )
78
}
79
 
80
const Item = ({ suggest, btnLabelAccept }) => {
81
  const labels = useSelector(({ intl }) => intl.labels)
950 stevensc 82
 
5 stevensc 83
  return (
949 stevensc 84
    <div className='user'>
85
      <div className='d-inline-flex align-items-center'>
5 stevensc 86
        <Link to={suggest.profile}>
87
          <img src={suggest.image} alt={`${suggest.name} profile image`} />
88
        </Link>
949 stevensc 89
        <h4 className='break-ellipsis'>{suggest.name}</h4>
5 stevensc 90
      </div>
949 stevensc 91
      <Link to={suggest.profile} className='btn btn-primary ml-auto'>
5 stevensc 92
        {btnLabelAccept || labels.view_profile}
93
      </Link>
94
    </div>
95
  )
96
}
97
 
98
SuggestWidget.Item = Item
99
 
100
export default SuggestWidget