Proyectos de Subversion LeadersLinked - SPA

Rev

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

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