Proyectos de Subversion LeadersLinked - SPA

Rev

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