Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
5 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { axios } from '../../../utils'
3
import { Link } from 'react-router-dom'
853 stevensc 4
import { Avatar, IconButton } from '@mui/material'
5 stevensc 5
import { useSelector } from 'react-redux'
6
import ExpandLessIcon from '@mui/icons-material/ExpandLess'
7
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
854 stevensc 8
import styled, { css } from 'styled-components'
5 stevensc 9
 
10
import EmptySection from '../../UI/EmptySection'
1507 stevensc 11
import WidgetWrapper from '../../widgets/WidgetLayout'
5 stevensc 12
 
1507 stevensc 13
const HelperContainer = styled(WidgetWrapper)`
853 stevensc 14
  padding: 10px;
15
`
16
 
854 stevensc 17
const HelperItem = styled.div`
853 stevensc 18
  cursor: pointer;
19
  display: flex;
20
  align-items: center;
21
  justify-content: space-between;
22
  width: 100%;
23
`
24
 
854 stevensc 25
const HelperList = styled.ul`
26
  display: flex;
27
  flex-direction: column;
28
  gap: 0.5rem;
29
  overflow-y: auto;
30
  height: 0;
856 stevensc 31
  max-height: 210px;
854 stevensc 32
  transition: all 0.2s ease-in-out;
33
  ${(props) =>
34
    props.show &&
35
    css`
36
      height: auto;
37
    `}
38
`
39
 
856 stevensc 40
const HelperListItem = styled.div`
41
  padding: 5px 10px;
42
  display: flex;
43
  align-items: center;
44
  gap: 0.5rem;
45
  border-radius: ${(props) => props.theme.border.radius};
46
  &:hover {
47
    background-color: rgba(0, 0, 0, 0.08);
48
  }
49
`
50
 
1774 stevensc 51
const GroupsWidget = () => {
5 stevensc 52
  const labels = useSelector(({ intl }) => intl.labels)
53
 
54
  return (
854 stevensc 55
    <HelperContainer>
1774 stevensc 56
      <GroupsWidget.Item
851 stevensc 57
        url='/helpers/my-groups'
5 stevensc 58
        title={labels.my_groups}
59
        display={true}
60
      />
1774 stevensc 61
      <GroupsWidget.Item
851 stevensc 62
        url='/helpers/groups-suggestion'
5 stevensc 63
        title={labels.suggest_groups}
64
      />
854 stevensc 65
    </HelperContainer>
5 stevensc 66
  )
67
}
68
 
69
const Item = ({
70
  url = '/helpers/my-groups',
71
  title = 'Mis grupos',
851 stevensc 72
  display = false
5 stevensc 73
}) => {
74
  const [widgetData, setWidgetData] = useState([])
75
  const [displayMenu, setDisplayMenu] = useState(display)
854 stevensc 76
  const [lookMore, setLookMore] = useState(false)
5 stevensc 77
  const labels = useSelector(({ intl }) => intl.labels)
78
 
79
  const getData = () => {
80
    axios.get(url).then((response) => {
81
      const { success, data } = response.data
82
 
83
      if (success) {
84
        setWidgetData(data.sort((a, b) => a.priority - b.priority).reverse())
85
      }
86
    })
87
  }
88
 
89
  const toggleMenu = () => {
90
    setDisplayMenu(!displayMenu)
91
  }
92
 
93
  const dataSlice = () => {
94
    let infoFollows = [...widgetData]
95
    if (!lookMore) {
96
      infoFollows = infoFollows.slice(0, 3)
97
    }
98
    return infoFollows
99
  }
100
 
101
  useEffect(() => {
102
    getData()
103
  }, [])
104
 
105
  return (
853 stevensc 106
    <>
854 stevensc 107
      <HelperItem>
853 stevensc 108
        <span>{title}</span>
109
        <IconButton onClick={toggleMenu}>
5 stevensc 110
          {displayMenu ? <ExpandLessIcon /> : <ExpandMoreIcon />}
853 stevensc 111
        </IconButton>
854 stevensc 112
      </HelperItem>
5 stevensc 113
 
855 stevensc 114
      <HelperList show={displayMenu}>
5 stevensc 115
        {widgetData.length ? (
116
          dataSlice().map(({ id, name, profile, image }) => (
117
            <li key={id}>
856 stevensc 118
              <Link to={profile} target='secondary'>
119
                <HelperListItem>
120
                  <Avatar
121
                    src={image}
122
                    alt={`${name} group image`}
123
                    sx={{ width: '40px', height: '40px' }}
124
                  />
125
                  <span>{name}</span>
126
                </HelperListItem>
5 stevensc 127
              </Link>
128
            </li>
129
          ))
130
        ) : (
131
          <EmptySection message={labels.datatable_empty} />
132
        )}
133
 
856 stevensc 134
        {widgetData.length > 3 && (
135
          <li>
136
            <HelperListItem
137
              className='justify-content-center cursor-pointer'
138
              onClick={() => setLookMore(!lookMore)}
139
            >
140
              <span>{lookMore ? labels.view_less : labels.view_more}</span>
141
            </HelperListItem>
5 stevensc 142
          </li>
143
        )}
854 stevensc 144
      </HelperList>
853 stevensc 145
    </>
5 stevensc 146
  )
147
}
148
 
1774 stevensc 149
GroupsWidget.Item = Item
5 stevensc 150
 
1774 stevensc 151
export default GroupsWidget