Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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