Proyectos de Subversion LeadersLinked - SPA

Rev

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