Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3697 stevensc 1
import React, { useEffect, useState } from 'react';
2
import { useDispatch, useSelector } from 'react-redux';
3
import { useForm } from 'react-hook-form';
1460 stevensc 4
 
3697 stevensc 5
import { axios } from '@utils';
6
import { addNotification } from '@store/notification/notification.actions';
5 stevensc 7
 
3697 stevensc 8
import Modal from '@components/UI/modal/Modal';
9
import Input from '@components/UI/inputs/Input';
10
import Ckeditor from '@components/common/ckeditor/Ckeditor';
11
import TagsInput from '@components/UI/TagsInput';
12
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback';
5 stevensc 13
 
14
const QuestionModal = ({ show, url, isEdit, onClose, onComplete }) => {
3697 stevensc 15
  const [questionsCategories, setQuestionsCategories] = useState([]);
16
  const [currentCategories, setCurrentCategories] = useState([]);
17
  const labels = useSelector(({ intl }) => intl.labels);
18
  const dispatch = useDispatch();
5 stevensc 19
 
2802 stevensc 20
  const {
21
    register,
2868 stevensc 22
    control,
2802 stevensc 23
    handleSubmit,
24
    setValue,
25
    formState: { errors }
3697 stevensc 26
  } = useForm();
5 stevensc 27
 
1977 stevensc 28
  const onSubmit = handleSubmit(({ category_id, ...data }) => {
3697 stevensc 29
    const formData = new FormData();
1979 stevensc 30
 
3697 stevensc 31
    category_id.map((value) => formData.append('category_id[]', value));
32
    Object.entries(data).map(([key, value]) => formData.append(key, value));
1979 stevensc 33
 
2521 stevensc 34
    axios.post(url, formData).then((response) => {
3697 stevensc 35
      const { data, success } = response.data;
5 stevensc 36
 
2521 stevensc 37
      if (!success) {
38
        const errorMessage =
39
          typeof data === 'string'
40
            ? data
3697 stevensc 41
            : 'Error interno. Por favor, inténtelo de nuevo más tarde.';
5 stevensc 42
 
3697 stevensc 43
        dispatch(addNotification({ style: 'danger', msg: errorMessage }));
44
        return;
2521 stevensc 45
      }
5 stevensc 46
 
3697 stevensc 47
      onComplete();
48
      onClose();
49
    });
50
  });
5 stevensc 51
 
52
  const getCategories = () => {
53
    axios
655 stevensc 54
      .get('/my-coach')
5 stevensc 55
      .then((response) => {
3697 stevensc 56
        const { data, success } = response.data;
5 stevensc 57
 
58
        if (!success) {
59
          const errorMessage =
655 stevensc 60
            typeof data === 'string'
5 stevensc 61
              ? data
3697 stevensc 62
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.';
5 stevensc 63
 
3697 stevensc 64
          dispatch(addNotification({ style: 'danger', msg: errorMessage }));
65
          return;
5 stevensc 66
        }
67
 
68
        const categories = Object.entries(data.categories).map((values) => ({
3697 stevensc 69
          label: values[1],
655 stevensc 70
          value: values[0]
3697 stevensc 71
        }));
5 stevensc 72
 
3697 stevensc 73
        setQuestionsCategories(categories);
5 stevensc 74
      })
655 stevensc 75
      .catch((err) => {
3697 stevensc 76
        dispatch(addNotification({ style: 'danger', msg: err.message }));
77
      });
78
  };
5 stevensc 79
 
80
  const onTagsChange = (tags) => {
3697 stevensc 81
    const categories = tags.map((tag) => tag.value);
82
    setValue('category_id', categories);
83
  };
5 stevensc 84
 
85
  useEffect(() => {
3697 stevensc 86
    getCategories();
5 stevensc 87
 
3697 stevensc 88
    register('description', { required: 'Este campo es requerido.' });
1977 stevensc 89
    register('category_id', {
1897 stevensc 90
      required: 'Este campo es requerido.',
3697 stevensc 91
      validate: (val) => val.length > 0 || 'Por favor, seleccione una categoria.'
92
    });
93
  }, []);
5 stevensc 94
 
95
  useEffect(() => {
3697 stevensc 96
    if (!url || !show || !isEdit || !questionsCategories.length) return;
5 stevensc 97
 
98
    axios.get(url).then((response) => {
3697 stevensc 99
      const { data, success } = response.data;
5 stevensc 100
 
101
      if (!success) {
102
        const errorMessage =
655 stevensc 103
          typeof data === 'string'
5 stevensc 104
            ? data
3697 stevensc 105
            : 'Error interno. Por favor, inténtelo de nuevo más tarde.';
5 stevensc 106
 
107
        dispatch(
108
          addNotification({
655 stevensc 109
            style: 'danger',
110
            msg: errorMessage
5 stevensc 111
          })
3697 stevensc 112
        );
113
        return;
5 stevensc 114
      }
115
 
116
      const categories = data.category_id.map((uuid) =>
117
        questionsCategories.find((c) => c.value === uuid)
3697 stevensc 118
      );
5 stevensc 119
 
3697 stevensc 120
      setCurrentCategories(categories);
5 stevensc 121
 
3697 stevensc 122
      setValue('title', data.title);
123
      setValue('description', data.description);
124
    });
125
  }, [url, show, isEdit, questionsCategories]);
5 stevensc 126
 
127
  useEffect(() => {
128
    if (!show) {
3697 stevensc 129
      setCurrentCategories([]);
130
      setValue('category_id', []);
131
      setValue('description', '');
132
      setValue('title', '');
5 stevensc 133
    }
3697 stevensc 134
  }, [show]);
5 stevensc 135
 
136
  return (
1460 stevensc 137
    <Modal
138
      title={`${isEdit ? labels.edit : labels.add} ${labels.question}`}
139
      show={show}
140
      onClose={onClose}
141
      onAccept={onSubmit}
142
    >
2868 stevensc 143
      <Input
144
        name='title'
145
        control={control}
146
        rules={{ required: labels.error_field_empty }}
147
        error={errors.title?.message}
148
      />
5 stevensc 149
 
2868 stevensc 150
      <TagsInput
151
        label='Categorías'
152
        name='category_id'
153
        onChange={onTagsChange}
154
        suggestions={questionsCategories}
155
        defaultValue={currentCategories}
156
      />
3697 stevensc 157
      {errors.category_id && <FormErrorFeedback>{errors.category_id?.message}</FormErrorFeedback>}
5 stevensc 158
 
2868 stevensc 159
      <Ckeditor
160
        name='description'
161
        control={control}
162
        rules={{ required: labels.error_field_empty }}
163
        error={errors.description?.message}
1460 stevensc 164
      />
5 stevensc 165
    </Modal>
3697 stevensc 166
  );
167
};
5 stevensc 168
 
3697 stevensc 169
export default QuestionModal;