Proyectos de Subversion LeadersLinked - SPA

Rev

| 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 { useDispatch } from 'react-redux'
4
import { addNotification } from '../../redux/notification/notification.actions'
5
import styled from 'styled-components'
6
import Avatar from '@mui/material/Avatar'
7
import IconButton from '@mui/material/IconButton'
8
import AddRounded from '@mui/icons-material/AddRounded'
9
import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'
10
 
11
import Spinner from '../UI/Spinner'
12
import LoaderContainer from '../UI/LoaderContainer'
13
import WidgetLayout from '../widgets/WidgetLayout'
14
 
15
const ContactContainer = styled(WidgetLayout)`
16
  padding: 1rem;
17
  position: relative;
18
  flex-grow: 1;
19
  ul {
20
    display: flex;
21
    flex-direction: column;
22
    gap: 0.5rem;
23
    max-height: 300px;
24
    overflow: auto;
25
    margin-top: 1rem;
26
  }
27
`
28
 
29
const ContactTemplate = styled.div`
30
  display: flex;
31
  align-items: center;
32
  justify-content: space-between;
33
  gap: 0.5rem;
34
  .info {
35
    display: flex;
36
    align-items: center;
37
    gap: 0.5rem;
38
  }
39
  h3 {
40
    font-size: 1rem;
41
    color: var(--subtitle-color);
42
    font-weight: 600;
43
  }
44
`
45
 
46
const AddMember = ({ group, changeTab }) => {
47
  const { url_add_user_to_group, url_get_contacts_availables_for_group } = group
48
  const [contacts, setContacts] = useState([])
49
  const [loading, setLoading] = useState(false)
50
  const dispatch = useDispatch()
51
 
653 stevensc 52
  const getContacts = () => {
5 stevensc 53
    setLoading(true)
653 stevensc 54
 
5 stevensc 55
    axios
56
      .get(url_get_contacts_availables_for_group)
653 stevensc 57
      .then(({ data: responseData }) => {
58
        const { data, success } = responseData
59
 
5 stevensc 60
        if (!success) {
653 stevensc 61
          dispatch(addNotification({ style: 'danger', msg: data }))
5 stevensc 62
          return
63
        }
64
 
65
        setContacts(data)
66
      })
67
      .catch((err) => {
655 stevensc 68
        dispatch(addNotification({ style: 'danger', msg: err.message }))
5 stevensc 69
      })
70
      .finally(() => setLoading(false))
71
  }
72
 
653 stevensc 73
  const handleAddMember = (id) => {
5 stevensc 74
    setLoading(true)
75
    const formData = new FormData()
76
    formData.append('uid', id)
77
 
78
    axios
79
      .post(url_add_user_to_group, formData)
652 stevensc 80
      .then(({ data: responseData }) => {
81
        const { data, success } = responseData
82
 
5 stevensc 83
        if (!success) {
652 stevensc 84
          throw new Error(data)
5 stevensc 85
        }
86
 
652 stevensc 87
        dispatch(addNotification({ style: 'success', msg: data }))
88
        getContacts()
5 stevensc 89
      })
90
      .catch((err) => {
655 stevensc 91
        dispatch(addNotification({ style: 'danger', msg: err.message }))
5 stevensc 92
      })
93
      .finally(() => setLoading(false))
94
  }
95
 
96
  useEffect(() => {
97
    getContacts()
98
  }, [])
99
 
100
  return (
101
    <ContactContainer>
102
      <IconButton onClick={() => changeTab('DEFAULT')}>
103
        <ArrowBackIosIcon />
104
      </IconButton>
105
 
106
      <ul>
107
        {contacts.map((member) => (
108
          <li key={member.id}>
109
            <AddMember.Item
110
              {...member}
111
              onClick={() => handleAddMember(member.id)}
112
            />
113
          </li>
114
        ))}
115
      </ul>
116
      {loading && (
117
        <LoaderContainer>
118
          <Spinner />
119
        </LoaderContainer>
120
      )}
121
    </ContactContainer>
122
  )
123
}
124
 
125
const Item = ({ image, name, onClick }) => {
126
  return (
127
    <ContactTemplate>
652 stevensc 128
      <div className='info'>
5 stevensc 129
        <Avatar src={image} alt={`user_${name}-image`} />
130
        <h3>{name}</h3>
131
      </div>
132
      <IconButton onClick={onClick}>
133
        <AddRounded />
134
      </IconButton>
135
    </ContactTemplate>
136
  )
137
}
138
 
139
AddMember.Item = Item
140
 
141
export default AddMember