Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7156 | Rev 7158 | Ir a la última revisión | | Comparar con el anterior | 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
 
7157 stevensc 32
const QuestionsGrid = styled.div`
7156 stevensc 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 = () => {
7157 stevensc 43
  const [questions, setQuestions] = useState([])
44
  const [questionsCategories, setQuestionsCategories] = useState([])
7156 stevensc 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
 
7157 stevensc 56
  const getCategories = () => {
57
    axios
58
      .get('/my-coach', {
59
        headers: {
60
          'Content-Type': 'application/json',
61
        },
62
      })
63
      .then((response) => {
64
        const { data, success } = response.data
65
 
66
        if (!success) {
67
          const errorMessage =
68
            typeof data === 'string' ? data : labels.error_there_was_an_error
69
 
70
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
71
          return
72
        }
73
 
74
        setQuestionsCategories(data.categories)
75
      })
76
      .catch((error) => {
77
        dispatch(
78
          addNotification({
79
            style: 'danger',
80
            msg: labels.error_there_was_an_error,
81
          })
82
        )
83
        throw new Error(error)
84
      })
85
  }
86
 
87
  const getQuestions = (search = '', page = 1, category_id = '') => {
7156 stevensc 88
    const urlParams = { search, page, category_id }
89
    axios
7157 stevensc 90
      .get(`my-coach/questions?${jsonToParams(urlParams)}`, {
7156 stevensc 91
        headers: {
92
          'Content-Type': 'application/json',
93
        },
94
      })
95
      .then((response) => {
96
        const { data, success } = response.data
97
 
98
        if (!success) {
99
          const errorMessage =
100
            typeof data === 'string' ? data : labels.error_there_was_an_error
101
 
102
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
103
          return
104
        }
105
 
106
        console.log(data)
107
      })
108
      .catch((error) => {
109
        dispatch(
110
          addNotification({
111
            style: 'danger',
112
            msg: labels.error_there_was_an_error,
113
          })
114
        )
115
        throw new Error(error)
116
      })
117
  }
118
 
119
  const confirmDelete = () => {
120
    axios
121
      .post(actionUrl.current)
122
      .then((response) => {
123
        const { data, success } = response.data
124
 
125
        if (!success) {
126
          const errorMessage =
127
            typeof data === 'string'
128
              ? data
129
              : 'Ha ocurrido un error, por favor intente más tarde.'
130
 
131
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
132
          return
133
        }
134
 
135
        dispatch(addNotification({ style: 'success', msg: data }))
7157 stevensc 136
        getQuestions(search, currentPage, category)
7156 stevensc 137
        closeModal()
138
      })
139
      .catch((error) => {
140
        dispatch(
141
          addNotification({
142
            style: 'danger',
143
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
144
          })
145
        )
146
        throw new Error(error)
147
      })
148
  }
149
 
7157 stevensc 150
  const addQuestion = (url) => {
7156 stevensc 151
    actionUrl.current = url
152
    setModalShow('add')
153
  }
154
 
7157 stevensc 155
  const editQuestion = (url) => {
7156 stevensc 156
    actionUrl.current = url
157
    setModalShow('edit')
158
  }
159
 
7157 stevensc 160
  const deleteQuestion = (url) => {
7156 stevensc 161
    actionUrl.current = url
162
    setModalShow('delete')
163
  }
164
 
165
  const closeModal = () => {
166
    actionUrl.current = ''
167
    setModalShow(null)
168
  }
169
 
170
  const handleInputChange = debounce((e) => setSearch(e.target.value), 500)
171
 
172
  useEffect(() => {
7157 stevensc 173
    getCategories()
174
  }, [])
175
 
176
  useEffect(() => {
177
    getQuestions(search, currentPage, category)
7156 stevensc 178
  }, [search, currentPage, category])
179
 
180
  return (
181
    <>
182
      <Container as="section" className="companies-info">
183
        <div className="company-title">
184
          <h1 className="title mx-auto">{labels.knowledge_area_title}</h1>
185
          {allowAdd && (
186
            <h2
187
              className="title cursor-pointer"
7157 stevensc 188
              onClick={() => addQuestion(addUrl.current)}
7156 stevensc 189
            >
190
              {labels.knowledge_area_add}
191
            </h2>
192
          )}
193
        </div>
194
 
195
        <Row className="gap-3">
196
          <Col md="3">
197
            <CoachCategories>
198
              <ul>
199
                <li className={!category && 'selected'}>
200
                  <input
201
                    type="radio"
202
                    id="category-all"
203
                    value=""
204
                    name="category"
205
                    onChange={(e) => setCategory(e.target.value)}
206
                    hidden
207
                  />
208
                  <label htmlFor="category-all">
209
                    {labels.knowledge_area_category_all}
210
                  </label>
211
                </li>
7157 stevensc 212
                {questionsCategories.map(({ uuid, name }) => (
7156 stevensc 213
                  <li className={category === uuid && 'selected'} key={uuid}>
214
                    <input
215
                      type="radio"
216
                      id={`category-${name}`}
217
                      name="category"
218
                      value={uuid}
219
                      onChange={(e) => setCategory(e.target.value)}
220
                      hidden
221
                    />
222
                    <label htmlFor={`category-${name}`}>{name}</label>
223
                  </li>
224
                ))}
225
              </ul>
226
            </CoachCategories>
227
          </Col>
228
 
229
          <Col className="px-0">
230
            <KnowledgeSearch
231
              onChange={handleInputChange}
232
              placeholder={labels.search}
233
            />
7157 stevensc 234
            <QuestionsGrid className="mt-3">
235
              {questions.length ? (
236
                questions.map((knowledge, index) => (
7156 stevensc 237
                  <KnowledgeItem
238
                    key={index}
239
                    {...knowledge}
7157 stevensc 240
                    onEdit={editQuestion}
241
                    onDelete={deleteQuestion}
7156 stevensc 242
                  />
243
                ))
244
              ) : (
245
                <EmptySection
246
                  message={labels.error_no_record_matched_your_query}
247
                />
248
              )}
7157 stevensc 249
            </QuestionsGrid>
7156 stevensc 250
            <PaginationComponent
251
              onChangePage={(newPage) => setCurrentPage(newPage)}
252
              currentActivePage={currentPage}
253
              pages={totalPages}
254
              isRow
255
            />
256
          </Col>
257
        </Row>
258
      </Container>
259
      <ConfirmModal
260
        show={modalShow === 'delete'}
261
        onClose={closeModal}
262
        onAccept={confirmDelete}
263
      />
264
    </>
265
  )
266
}
267
 
268
export default MyCoachPage