Browse Source

using redux insted of use State

amenpunk 2 years ago
parent
commit
9bafb7b958

+ 1 - 4
src/Components/HomeUser/TestCard.jsx

@@ -5,7 +5,6 @@ import {
5 5
 } from '@mui/material'
6 6
 
7 7
 import QA from '../../Images/puesto.jpg'
8
-import { Link } from 'react-router-dom'
9 8
 
10 9
 export function TestCard(props) {
11 10
 
@@ -30,11 +29,9 @@ export function TestCard(props) {
30 29
                 </CardContent>
31 30
             </CardActionArea>
32 31
             <CardActions>
33
-              <Link to={`/user/prueba/${test.id}`}>
34 32
                 <Button size="small" color="primary">
35 33
                       Realizar
36
-                  </Button>
37
-              </Link>
34
+                </Button>
38 35
             </CardActions>
39 36
         </Card>
40 37
     )

+ 12 - 11
src/Components/Test/Cleaver/Question.jsx

@@ -8,6 +8,8 @@ import {
8 8
 } from '@mui/material'
9 9
 
10 10
 import { deepPurple } from '@mui/material/colors';
11
+import { useDispatch, useSelector } from 'react-redux';
12
+import { setResponse  } from '../../../Slices/cleaverSlice';
11 13
 
12 14
 function LinearProgressWithLabel(props) {
13 15
   return (
@@ -40,10 +42,13 @@ function CheckboxexHeader(prop) {
40 42
 
41 43
 function CheckboxesGroup(props) {
42 44
 
43
-  let { quiz, save, responses : resp, id:index} = props;
45
+  let { quiz, id : index } = props;
46
+
47
+  let resp = useSelector((state) => state.cleaver.responses)
44 48
 
45 49
   const [checkA, setCheckA] = React.useState(resp[index]? resp[index].A : 0);
46 50
   const [checkB, setCheckB] = React.useState(resp[index]? resp[index].B : 0);
51
+  const dispatch = useDispatch()
47 52
 
48 53
   const changeA = (event) => {
49 54
     let { id, checked } = event.target
@@ -55,9 +60,8 @@ function CheckboxesGroup(props) {
55 60
           B: resp[index] ? resp[index].B : 0
56 61
         }
57 62
       }
58
-      let final = Object.assign(resp,temp);
59
-      // console.log('Change A:',final)
60
-      save(final)
63
+      // let final = Object.assign(resp,temp);
64
+      dispatch(setResponse(temp))
61 65
     }
62 66
   };
63 67
   
@@ -71,9 +75,8 @@ function CheckboxesGroup(props) {
71 75
           A: resp[index] ? resp[index].A : 0
72 76
         }
73 77
       }
74
-      let final = Object.assign(resp,temp)
75
-      // console.log('Change B: ', final);
76
-      save(final)
78
+      // let final = Object.assign(resp,temp)
79
+      dispatch(setResponse(temp))
77 80
     }
78 81
   };
79 82
 
@@ -131,7 +134,7 @@ function CheckboxesGroup(props) {
131 134
   );
132 135
 }
133 136
 
134
-export function Question({quiz, index, current, save, responses, progress}) {
137
+export function Question({quiz, index, current, progress}) {
135 138
   let { instrucciondepregunta, respuestas,id } = quiz
136 139
   let checked = index === current;
137 140
 
@@ -146,12 +149,10 @@ export function Question({quiz, index, current, save, responses, progress}) {
146 149
             <CheckboxesGroup 
147 150
               id={id}
148 151
               quiz={respuestas} 
149
-              save={save}
150
-              responses={responses}
151 152
               />
152 153
           </div>
153 154
         </CardContent>
154
-        <LinearProgressWithLabel value={progress} />
155
+        <LinearProgressWithLabel value={progress ? parseInt(progress) : 0 } />
155 156
       </Card>
156 157
     </Fade>
157 158
   );

+ 2 - 2
src/Pages/HomeUser.jsx

@@ -49,8 +49,8 @@ export function HomeUser(){
49 49
               {
50 50
               tests.map( test => {
51 51
                 return (
52
-                <Link to={`/user/prueba/${test.id}`}>
53
-                  <TestCard key={test.id} test={test} />
52
+                <Link key={test.id} to={`/user/prueba/${test.id}`}>
53
+                  <TestCard test={test} />
54 54
                 </Link>
55 55
                 )
56 56
               })

+ 1 - 1
src/Pages/Prueba.jsx

@@ -57,7 +57,7 @@ export function Prueba() {
57 57
   }
58 58
 
59 59
   if(profile.role.assingid){
60
-    return <Cleaver/>
60
+    return <Cleaver />
61 61
   }
62 62
 
63 63
   return (

+ 11 - 12
src/Pages/Pruebas/Cleaver.jsx

@@ -2,20 +2,23 @@ import React from 'react'
2 2
 import { Service } from '../../Utils/HTTP'
3 3
 import { Question } from '../../Components/Test/Cleaver/Question.jsx'
4 4
 import { Box,Button } from '@mui/material'
5
-import toast, { Toaster } from 'react-hot-toast';
6 5
 import { useSelector } from 'react-redux';
6
+import { useParams } from 'react-router-dom'
7
+import toast, { Toaster } from 'react-hot-toast';
7 8
 
8 9
 export function Cleaver() {
9 10
 
10
-  let token = useSelector((state) => state.token.token);
11
+  let { id } = useParams();
12
+  const auth = useSelector((state) => state.token.token);
13
+  const cleaver = useSelector((state) => state.cleaver);
11 14
 
12 15
   const [totalRespondidas, setRespondidas] = React.useState([]);
13 16
   const [totalPreguntas, setPreguntas] = React.useState([]);
14 17
   const [current, setCurrent] = React.useState(0);
15
-  const [responses, setRespones] = React.useState({});
16 18
   const [progress, setProgress] = React.useState(0);
17 19
 
18
-  const BadQuestion = () => toast("Escoge una respuesta en cada columna",{ icon : '⚠️' });
20
+  const BadQuestion = () => toast.error("Escoge una respuesta en cada columna") 
21
+  //toast("Escoge una respuesta en cada columna",{ icon : '⚠️' });
19 22
   const CalculateProgress = () => {
20 23
     let total_preguntas = totalPreguntas.length + totalRespondidas.length
21 24
     let x = totalRespondidas.length *100 / (total_preguntas)
@@ -23,21 +26,19 @@ export function Cleaver() {
23 26
   }
24 27
 
25 28
   React.useEffect(() => {
26
-    // TODO:
27
-    // agregar el id correcto apartir del path
28
-    let rest = new Service(`/prueba/findid/1`)
29
-    rest.get(token.token)
29
+    let rest = new Service(`/prueba/findid/${id}`)
30
+    rest.get(auth.token)
30 31
       .then(({ data }) => {
31 32
         console.log(data.questions)
32 33
         setPreguntas(data.questions)
33 34
         setRespondidas(data.questions.slice(0,1))
34 35
         setCurrent(0)
35 36
       }).catch(console.log)
36
-  }, [token]);
37
+  }, [id,auth]);
37 38
 
38 39
   const handleAddQuestion = () => {
39 40
     let currentAnswer  = totalRespondidas[totalRespondidas.length - 1];
40
-    let current_resp = responses[currentAnswer.id];
41
+    let current_resp = cleaver.responses[currentAnswer.id];
41 42
 
42 43
     if(!current_resp){
43 44
       return BadQuestion();
@@ -69,8 +70,6 @@ export function Cleaver() {
69 70
       <Box className="question_body">
70 71
         {totalRespondidas.map((item,i) => (
71 72
           <Question 
72
-            save={setRespones}
73
-            responses={responses}
74 73
             key={item.id} 
75 74
             id={item.id} 
76 75
             quiz={item} 

+ 3 - 1
src/Reducers/index.js

@@ -1,10 +1,12 @@
1 1
 import { combineReducers } from '@reduxjs/toolkit'
2 2
 import tokenReducer from '../Slices/tokenSlice.js';
3 3
 import userReducer from '../Slices/userSlice.js';
4
+import cleaverSlice from '../Slices/cleaverSlice.js';
4 5
 
5 6
 const rootReducer = combineReducers({
6 7
   token : tokenReducer,
7
-  user: userReducer
8
+  user: userReducer,
9
+  cleaver : cleaverSlice
8 10
 });
9 11
 
10 12
 export default rootReducer;

+ 17 - 0
src/Slices/cleaverSlice.js

@@ -0,0 +1,17 @@
1
+import { createSlice } from '@reduxjs/toolkit';
2
+
3
+const initialState = { responses : {} }
4
+
5
+export const cleaverSlice = createSlice({
6
+  name : 'cleaver',
7
+  reducers : {
8
+    setResponse : (state, action) => {
9
+      // console.log(action.payload)
10
+      state.responses = { ...state.responses, ...action.payload  }
11
+    }
12
+  },
13
+  initialState
14
+})
15
+
16
+export const { setResponse } = cleaverSlice.actions;
17
+export default cleaverSlice.reducer;