Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2194 | Rev 2806 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1547 stevensc 1
import React, { useMemo, useRef, useState } from 'react'
2
import { useLocation } from 'react-router-dom'
403 stevensc 3
import { useDispatch, useSelector } from 'react-redux'
1547 stevensc 4
import { Box, Container, Grid, MenuItem, Select, styled } from '@mui/material'
1469 stevensc 5
import { Search } from '@mui/icons-material'
6
 
1547 stevensc 7
import { axios, debounce } from '../../utils'
2780 stevensc 8
import { useFetch, useSearchParams } from '@hooks'
403 stevensc 9
import { addNotification } from '../../redux/notification/notification.actions'
5 stevensc 10
 
1469 stevensc 11
import Input from 'components/UI/Input'
12
import EmptySection from 'components/UI/EmptySection'
13
import PaginationComponent from 'components/UI/PaginationComponent'
5 stevensc 14
 
1547 stevensc 15
import SideMenu from 'components/UI/sidemenu/SideMenu'
16
import TitleSection from 'components/UI/TitleSection'
17
import QuestionCard from 'components/my-coach/QuestionCard'
1469 stevensc 18
import ConfirmModal from 'components/modals/ConfirmModal'
19
import QuestionModal from 'components/my-coach/QuestionModal'
5 stevensc 20
 
1547 stevensc 21
const QuestionsGrid = styled(Box)`
5 stevensc 22
  display: grid;
23
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
24
  gap: 1rem;
403 stevensc 25
`
5 stevensc 26
 
27
const MyCoachPage = () => {
403 stevensc 28
  const [modalShow, setModalShow] = useState(null)
29
  const actionUrl = useRef('')
1547 stevensc 30
  const { search } = useLocation()
403 stevensc 31
  const labels = useSelector(({ intl }) => intl.labels)
32
  const dispatch = useDispatch()
5 stevensc 33
 
1549 stevensc 34
  const { data: categoriesData } = useFetch(`/my-coach`)
35
  const { data, refetch } = useFetch(`/my-coach/questions${search}`)
1547 stevensc 36
  const { setParams, params } = useSearchParams()
5 stevensc 37
 
1547 stevensc 38
  const categories = useMemo(() => {
39
    const defaultCategories = [{ name: 'Todas', value: '' }]
5 stevensc 40
 
1551 stevensc 41
    if (!categoriesData.categories) return defaultCategories
5 stevensc 42
 
1552 stevensc 43
    const results = Object.entries(categoriesData.categories).map(
1549 stevensc 44
      ([uuid, name]) => ({
45
        name,
46
        value: uuid
47
      })
48
    )
5 stevensc 49
 
1547 stevensc 50
    return defaultCategories.concat(results)
1549 stevensc 51
  }, [categoriesData])
5 stevensc 52
 
53
  const confirmDelete = () => {
54
    axios
55
      .post(actionUrl.current)
56
      .then((response) => {
403 stevensc 57
        const { data, success } = response.data
5 stevensc 58
 
59
        if (!success) {
60
          const errorMessage =
403 stevensc 61
            typeof data === 'string'
5 stevensc 62
              ? data
403 stevensc 63
              : 'Ha ocurrido un error, por favor intente más tarde.'
5 stevensc 64
 
403 stevensc 65
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
66
          return
5 stevensc 67
        }
68
 
403 stevensc 69
        dispatch(addNotification({ style: 'success', msg: data }))
1547 stevensc 70
        refetch()
403 stevensc 71
        closeModal()
5 stevensc 72
      })
73
      .catch((error) => {
2194 stevensc 74
        dispatch(addNotification({ style: 'danger', msg: error.message }))
403 stevensc 75
      })
76
  }
5 stevensc 77
 
1549 stevensc 78
  const addQuestion = () => {
79
    actionUrl.current = '/my-coach/questions/add'
403 stevensc 80
    setModalShow('add')
81
  }
5 stevensc 82
 
83
  const editQuestion = (url) => {
403 stevensc 84
    actionUrl.current = url
85
    setModalShow('edit')
86
  }
5 stevensc 87
 
88
  const deleteQuestion = (url) => {
403 stevensc 89
    actionUrl.current = url
90
    setModalShow('delete')
91
  }
5 stevensc 92
 
93
  const closeModal = () => {
403 stevensc 94
    actionUrl.current = ''
95
    setModalShow(null)
96
  }
5 stevensc 97
 
1547 stevensc 98
  const handleInputChange = debounce((value) => setParams('search', value), 500)
5 stevensc 99
 
100
  return (
101
    <>
1469 stevensc 102
      <Container sx={{ px: 0 }}>
405 stevensc 103
        <TitleSection
104
          title={labels.my_coach}
1549 stevensc 105
          onAdd={() => addQuestion()}
405 stevensc 106
          addLabel={labels.my_coach_question_add}
107
        />
5 stevensc 108
 
1487 stevensc 109
        <Grid container spacing={2} sx={{ pt: 1 }}>
1469 stevensc 110
          <Grid
111
            item
112
            xs={12}
113
            md={3}
114
            sx={{
115
              display: { md: 'block', xs: 'none' }
116
            }}
117
          >
118
            <SideMenu
1547 stevensc 119
              title='Categorias'
120
              items={categories}
121
              onChange={(value) => setParams('category_id', value)}
122
              current={params.category_id}
1469 stevensc 123
            />
124
          </Grid>
5 stevensc 125
 
1469 stevensc 126
          <Grid item xs={12} md={9}>
375 stevensc 127
            <Input
1469 stevensc 128
              icon={Search}
1547 stevensc 129
              onChange={(e) => handleInputChange(e.target.value)}
5 stevensc 130
              placeholder={labels.search}
1437 stevensc 131
              className='mx-3 mx-md-0'
5 stevensc 132
            />
1469 stevensc 133
 
1479 stevensc 134
            <Select
1437 stevensc 135
              name='categories'
1547 stevensc 136
              options={categories}
1887 stevensc 137
              onChange={(e) => setParams('category_id', e.target.value)}
1469 stevensc 138
              sx={{
1482 stevensc 139
                mt: 1,
1483 stevensc 140
                mx: 2,
1469 stevensc 141
                display: { md: 'none', xs: 'block' }
142
              }}
1479 stevensc 143
            >
1547 stevensc 144
              {categories.map(({ name, value }) => (
1479 stevensc 145
                <MenuItem key={value} value={value}>
146
                  {name}
147
                </MenuItem>
148
              ))}
149
            </Select>
1469 stevensc 150
 
1437 stevensc 151
            <QuestionsGrid className='mt-3'>
1547 stevensc 152
              {data.items?.length ? (
153
                data.items.map((question) => (
405 stevensc 154
                  <QuestionCard
155
                    key={question.uuid}
156
                    onEdit={editQuestion}
157
                    onDelete={deleteQuestion}
158
                    {...question}
5 stevensc 159
                  />
405 stevensc 160
                ))
161
              ) : (
162
                <EmptySection
163
                  message={labels.error_no_record_matched_your_query}
164
                />
165
              )}
5 stevensc 166
            </QuestionsGrid>
1469 stevensc 167
 
5 stevensc 168
            <PaginationComponent
1547 stevensc 169
              onChangePage={(page) => setParams('page', page)}
170
              currentActivePage={data.page}
171
              pages={data.total_pages}
5 stevensc 172
              isRow
173
            />
1469 stevensc 174
          </Grid>
175
        </Grid>
5 stevensc 176
      </Container>
1469 stevensc 177
 
5 stevensc 178
      <QuestionModal
403 stevensc 179
        show={['add', 'edit'].includes(modalShow)}
5 stevensc 180
        onClose={closeModal}
1547 stevensc 181
        onComplete={refetch}
5 stevensc 182
        url={actionUrl.current}
403 stevensc 183
        isEdit={modalShow === 'edit'}
5 stevensc 184
      />
1469 stevensc 185
 
5 stevensc 186
      <ConfirmModal
403 stevensc 187
        show={modalShow === 'delete'}
5 stevensc 188
        onClose={closeModal}
189
        onAccept={confirmDelete}
190
      />
191
    </>
403 stevensc 192
  )
193
}
5 stevensc 194
 
403 stevensc 195
export default MyCoachPage