Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7157 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
7156 stevensc 1
import React, { useEffect, useRef, useState } from 'react'
2
import { useDispatch, useSelector } from 'react-redux'
3
import { Col, Container, Row } from 'react-bootstrap'
4
import { axios, debounce, jsonToParams } from '../../utils'
5
import { addNotification } from '../../redux/notification/notification.actions'
6
import styled from 'styled-components'
7
 
8
import SearchInput from '../../components/UI/SearchInput'
9
import EmptySection from '../../components/UI/EmptySection'
10
import WidgetLayout from '../../components/widgets/WidgetLayout'
11
import PaginationComponent from '../../components/UI/PaginationComponent'
12
 
13
import ConfirmModal from '../../components/modals/ConfirmModal'
14
import KnowledgeItem from '../knowledge-area/KnowledgeItem'
15
 
16
const CoachCategories = styled(WidgetLayout)`
17
  padding: 1rem;
18
  ul {
19
    display: flex;
20
    flex-direction: column;
21
    gap: 1rem;
22
    li,
23
    label {
24
      cursor: pointer;
25
    }
26
    .selected label {
27
      font-weight: 600;
28
    }
29
  }
30
`
31
 
32
const KnowledgeGrid = styled.div`
33
  display: grid;
34
  grid-template-columns: repeat(auto-fit, 250px);
35
  gap: 1rem;
36
`
37
 
38
const KnowledgeSearch = styled(SearchInput)`
39
  background-color: var(--bg-color);
40
`
41
 
42
const MyCoachPage = () => {
43
  const [knowledges, setKnowledges] = useState([])
44
  const [knowledgesCategories, setKnowledgesCategories] = useState([])
45
  const [search, setSearch] = useState('')
46
  const [category, setCategory] = useState('')
47
  const [currentPage, setCurrentPage] = useState(1)
48
  const [totalPages, setTotalPages] = useState(1)
49
  const [allowAdd, setAllowAdd] = useState(false)
50
  const [modalShow, setModalShow] = useState(null)
51
  const addUrl = useRef('')
52
  const actionUrl = useRef('')
53
  const labels = useSelector(({ intl }) => intl.labels)
54
  const dispatch = useDispatch()
55
 
56
  const getCoachInfo = (search = '', page = 1, category_id = '') => {
57
    const urlParams = { search, page, category_id }
58
    axios
59
      .get(`/my-coach?${jsonToParams(urlParams)}`, {
60
        headers: {
61
          'Content-Type': 'application/json',
62
        },
63
      })
64
      .then((response) => {
65
        const { data, success } = response.data
66
 
67
        if (!success) {
68
          const errorMessage =
69
            typeof data === 'string' ? data : labels.error_there_was_an_error
70
 
71
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
72
          return
73
        }
74
 
75
        console.log(data)
76
      })
77
      .catch((error) => {
78
        dispatch(
79
          addNotification({
80
            style: 'danger',
81
            msg: labels.error_there_was_an_error,
82
          })
83
        )
84
        throw new Error(error)
85
      })
86
  }
87
 
88
  const confirmDelete = () => {
89
    axios
90
      .post(actionUrl.current)
91
      .then((response) => {
92
        const { data, success } = response.data
93
 
94
        if (!success) {
95
          const errorMessage =
96
            typeof data === 'string'
97
              ? data
98
              : 'Ha ocurrido un error, por favor intente más tarde.'
99
 
100
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
101
          return
102
        }
103
 
104
        dispatch(addNotification({ style: 'success', msg: data }))
105
        getCoachInfo()
106
        closeModal()
107
      })
108
      .catch((error) => {
109
        dispatch(
110
          addNotification({
111
            style: 'danger',
112
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
113
          })
114
        )
115
        throw new Error(error)
116
      })
117
  }
118
 
119
  const addKnowledge = (url) => {
120
    actionUrl.current = url
121
    setModalShow('add')
122
  }
123
 
124
  const editKnowledge = (url) => {
125
    actionUrl.current = url
126
    setModalShow('edit')
127
  }
128
 
129
  const deleteKnowledge = (url) => {
130
    actionUrl.current = url
131
    setModalShow('delete')
132
  }
133
 
134
  const closeModal = () => {
135
    actionUrl.current = ''
136
    setModalShow(null)
137
  }
138
 
139
  const handleInputChange = debounce((e) => setSearch(e.target.value), 500)
140
 
141
  useEffect(() => {
142
    getCoachInfo(search, currentPage, category)
143
  }, [search, currentPage, category])
144
 
145
  return (
146
    <>
147
      <Container as="section" className="companies-info">
148
        <div className="company-title">
149
          <h1 className="title mx-auto">{labels.knowledge_area_title}</h1>
150
          {allowAdd && (
151
            <h2
152
              className="title cursor-pointer"
153
              onClick={() => addKnowledge(addUrl.current)}
154
            >
155
              {labels.knowledge_area_add}
156
            </h2>
157
          )}
158
        </div>
159
 
160
        <Row className="gap-3">
161
          <Col md="3">
162
            <CoachCategories>
163
              <ul>
164
                <li className={!category && 'selected'}>
165
                  <input
166
                    type="radio"
167
                    id="category-all"
168
                    value=""
169
                    name="category"
170
                    onChange={(e) => setCategory(e.target.value)}
171
                    hidden
172
                  />
173
                  <label htmlFor="category-all">
174
                    {labels.knowledge_area_category_all}
175
                  </label>
176
                </li>
177
                {knowledgesCategories.map(({ uuid, name }) => (
178
                  <li className={category === uuid && 'selected'} key={uuid}>
179
                    <input
180
                      type="radio"
181
                      id={`category-${name}`}
182
                      name="category"
183
                      value={uuid}
184
                      onChange={(e) => setCategory(e.target.value)}
185
                      hidden
186
                    />
187
                    <label htmlFor={`category-${name}`}>{name}</label>
188
                  </li>
189
                ))}
190
              </ul>
191
            </CoachCategories>
192
          </Col>
193
 
194
          <Col className="px-0">
195
            <KnowledgeSearch
196
              onChange={handleInputChange}
197
              placeholder={labels.search}
198
            />
199
 
200
            <KnowledgeGrid className="mt-3">
201
              {knowledges.length ? (
202
                knowledges.map((knowledge, index) => (
203
                  <KnowledgeItem
204
                    key={index}
205
                    {...knowledge}
206
                    onEdit={editKnowledge}
207
                    onDelete={deleteKnowledge}
208
                  />
209
                ))
210
              ) : (
211
                <EmptySection
212
                  message={labels.error_no_record_matched_your_query}
213
                />
214
              )}
215
            </KnowledgeGrid>
216
            <PaginationComponent
217
              onChangePage={(newPage) => setCurrentPage(newPage)}
218
              currentActivePage={currentPage}
219
              pages={totalPages}
220
              isRow
221
            />
222
          </Col>
223
        </Row>
224
      </Container>
225
      <ConfirmModal
226
        show={modalShow === 'delete'}
227
        onClose={closeModal}
228
        onAccept={confirmDelete}
229
      />
230
    </>
231
  )
232
}
233
 
234
export default MyCoachPage