1
- import React , { useEffect , useState } from "react" ;
1
+ import React , { useState , useEffect } from "react" ;
2
2
import { axiosClient } from "../../axiosClient" ;
3
3
import "./QuestionsList.css" ;
4
4
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" ;
5
5
import { useContext } from "react" ;
6
6
import { AuthContext } from "../../context/AuthProvider.jsx" ;
7
- import {
8
- faCircleUp ,
9
- faCircleDown ,
10
- faCogs ,
11
- faLightbulb ,
12
- } from "@fortawesome/free-solid-svg-icons" ;
13
- import { faCheckCircle as mediumChecked } from "@fortawesome/free-regular-svg-icons" ;
14
- import {
15
- Container ,
16
- Col ,
17
- Row ,
18
- Image ,
19
- Button ,
20
- ButtonGroup ,
21
- } from "react-bootstrap" ;
22
- import { OverlayTrigger , Tooltip } from "react-bootstrap" ;
23
- import AnswerList from "./AnswerList" ;
7
+ import { faCircleUp , faCircleDown } from "@fortawesome/free-solid-svg-icons" ;
8
+ import { Container , Col , Row , Image , Button } from "react-bootstrap" ;
24
9
import QuestionModal from "./AnswerModal" ;
25
10
import DateFormatter from "./DateFormatter" ;
26
- import Dropdown from "react-bootstrap/Dropdown" ;
27
- import { cols } from "../../colorSchema" ;
28
11
import TurnedInIcon from "@mui/icons-material/TurnedIn" ;
29
12
import TurnedInNotIcon from "@mui/icons-material/TurnedInNot" ;
13
+ import QuestionsFilter from "../interviewQuestions/QuestionsFilter" ;
14
+ import { json } from "react-router-dom" ;
30
15
31
- function QuestionsList ( { data, loading, setData } ) {
16
+ function QuestionsList ( { data, loading, setData, isFavoritesSection , savedQuest } ) {
32
17
const { user } = useContext ( AuthContext ) ;
33
-
34
18
const [ showModal , setShowModal ] = useState ( false ) ;
35
19
const [ selectedQuestion , setSelectedQuestion ] = useState ( null ) ;
36
20
const [ isTechnical , setIsTechnical ] = useState ( null ) ;
37
21
const [ selectedTechnology , setSelectedTechnology ] = useState ( null ) ;
38
- const [ savedQuestion , setSavedQuestion ] = useState ( false ) ;
39
22
const [ selectedQuestionId , setSelectedQuestionId ] = useState ( null ) ;
23
+ const [ filteredData , setFilteredData ] = useState ( data ) ;
24
+ const [ showFilter , setshowFilter ] = useState ( "filterShowed" ) ;
25
+ const [ savedQuestions , setSavedQuestions ] = useState ( [ ] )
26
+
27
+ useEffect ( ( ) => {
28
+ let filteredQuestions = [ ...data ] ;
29
+
30
+ if ( selectedTechnology ) {
31
+ filteredQuestions = filteredQuestions . filter (
32
+ ( question ) =>
33
+ question . technology === selectedTechnology &&
34
+ ( isTechnical === null || question . isTechnical === isTechnical )
35
+ ) ;
36
+ } else if ( isTechnical !== null ) {
37
+ filteredQuestions = filteredQuestions . filter (
38
+ ( question ) => question . isTechnical === isTechnical
39
+ ) ;
40
+ }
41
+
42
+ setFilteredData ( filteredQuestions ) ;
43
+ } , [ data , selectedTechnology , isTechnical ] ) ;
40
44
41
45
const handleVote = async ( questionId , voteType ) => {
42
46
try {
43
47
const userId = user . _id ;
44
48
45
-
46
49
await axiosClient . patch ( `/interviewQuestions/${ questionId } /vote` , {
47
50
voteType,
48
51
userId,
@@ -73,6 +76,8 @@ function QuestionsList({ data, loading, setData }) {
73
76
return < div > No questions found.</ div > ;
74
77
}
75
78
79
+
80
+
76
81
const handleOpenModal = ( question ) => {
77
82
setSelectedQuestionId ( question . _id ) ;
78
83
setSelectedQuestion ( question ) ;
@@ -84,18 +89,37 @@ function QuestionsList({ data, loading, setData }) {
84
89
setShowModal ( false ) ;
85
90
} ;
86
91
87
- const handleSaveQuestion = ( questionId ) => {
88
- setSelectedQuestionId ( questionId ) ;
92
+
93
+
94
+ const handleSaveQuestion = async ( questionId ) => {
95
+ try {
96
+ const response = await axiosClient . get ( `/interviewQuestions/${ questionId } ` ) ;
97
+ const currentSavers = response . data . saves ;
98
+
99
+ if ( Array . isArray ( currentSavers ) ) {
100
+ const flattenedSavers = currentSavers . flat ( ) ;
101
+ if ( flattenedSavers . includes ( user . _id ) ) {
102
+ // User already saved the question, so unsave it
103
+ await axiosClient . put ( `/interviewQuestions/${ questionId } ` , {
104
+ $pull : { saves : user . _id } ,
105
+ } ) ;
106
+
107
+ } else {
108
+ // User hasn't saved the question, so save it
109
+ await axiosClient . put ( `/interviewQuestions/${ questionId } ` , {
110
+ $push : { saves : user . _id } ,
111
+ } ) ;
112
+ }
113
+
114
+ // Update the savedQuestions state after making the API call
115
+ }
116
+ } catch ( error ) {
117
+ console . error ( "Error while saving Question:" , error ) ;
118
+ }
89
119
} ;
120
+
90
121
91
- const questionWithHighestVotes = data . reduce (
92
- ( prevQuestion , currentQuestion ) => {
93
- return currentQuestion . votes > prevQuestion . votes
94
- ? currentQuestion
95
- : prevQuestion ;
96
- } ,
97
- data [ 0 ]
98
- ) ;
122
+
99
123
100
124
const handleFilterQuestions = ( option ) => {
101
125
switch ( option ) {
@@ -118,96 +142,31 @@ function QuestionsList({ data, loading, setData }) {
118
142
}
119
143
} ;
120
144
121
- let filteredData = data ;
122
- if ( selectedTechnology ) {
123
- filteredData = data . filter ( ( question ) => {
124
- return (
125
- question . technology === selectedTechnology &&
126
- ( isTechnical === null || question . isTechnical === isTechnical )
127
- ) ;
128
- } ) ;
129
- } else if ( isTechnical !== null ) {
130
- filteredData = data . filter (
131
- ( question ) => question . isTechnical === isTechnical
132
- ) ;
133
- }
145
+ const questionWithHighestVotes = data . reduce (
146
+ ( prevQuestion , currentQuestion ) => {
147
+ return currentQuestion . votes > prevQuestion . votes
148
+ ? currentQuestion
149
+ : prevQuestion ;
150
+ } ,
151
+ data [ 0 ]
152
+ ) ;
134
153
135
154
return (
136
155
< div
137
156
className = "questionListSection"
138
157
style = { { display : "flex" , flexDirection : "column" } }
139
158
>
140
- < Dropdown className = "filterDropDown" required >
141
- < Dropdown . Toggle variant = "dark" id = "dropDownType" >
142
- Filter by
143
- </ Dropdown . Toggle >
144
- < Dropdown . Menu >
145
- < Dropdown . Item onClick = { ( ) => handleFilterQuestions ( "all" ) } >
146
- all
147
- </ Dropdown . Item >
148
- < Dropdown as = { ButtonGroup } >
149
- < Button
150
- className = "filterQuestionsBtn"
151
- variant = "dark"
152
- onClick = { ( ) => handleFilterQuestions ( "technical" ) }
153
- >
154
- Technical
155
- </ Button >
156
-
157
- < Dropdown . Toggle
158
- split
159
- variant = "success"
160
- id = "dropdown-split-basic"
161
- />
162
-
163
- < Dropdown . Menu >
164
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( null ) } >
165
- All
166
- </ Dropdown . Item >
167
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "node" ) } >
168
- node
169
- </ Dropdown . Item >
170
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "express" ) } >
171
- express
172
- </ Dropdown . Item >
173
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "react" ) } >
174
- react
175
- </ Dropdown . Item >
176
- < Dropdown . Item
177
- onClick = { ( ) => setSelectedTechnology ( "javascript" ) }
178
- >
179
- javascript
180
- </ Dropdown . Item >
181
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "html" ) } >
182
- html
183
- </ Dropdown . Item >
184
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "css" ) } >
185
- css
186
- </ Dropdown . Item >
187
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "sql" ) } >
188
- sql
189
- </ Dropdown . Item >
190
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "mysql" ) } >
191
- mysql
192
- </ Dropdown . Item >
193
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "mongodb" ) } >
194
- mongodb
195
- </ Dropdown . Item >
196
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "bootstrap" ) } >
197
- bootstrap
198
- </ Dropdown . Item >
199
- < Dropdown . Item onClick = { ( ) => setSelectedTechnology ( "other" ) } >
200
- other
201
- </ Dropdown . Item >
202
- </ Dropdown . Menu >
203
- </ Dropdown >
204
-
205
- < Dropdown . Item onClick = { ( ) => handleFilterQuestions ( "non-technical" ) } >
206
- Non-Technical
207
- </ Dropdown . Item >
208
- </ Dropdown . Menu >
209
- </ Dropdown >
210
-
159
+ { ! isFavoritesSection && (
160
+ < div className = { showFilter ? "filterShowed" : "filterHidden" } >
161
+ < QuestionsFilter
162
+
163
+ data = { data }
164
+ setFilteredData = { setFilteredData }
165
+ handleFilterQuestions = { handleFilterQuestions }
166
+ setSelectedTechnology = { setSelectedTechnology }
167
+ />
168
+ </ div >
169
+ ) }
211
170
< Container className = "interviewQuestionSection" >
212
171
< Row >
213
172
{ filteredData . map ( ( question ) => (
@@ -234,21 +193,21 @@ function QuestionsList({ data, loading, setData }) {
234
193
: "Type: Non-Technical" }
235
194
</ Row >
236
195
< Row className = "cardHeaderRight" >
237
- { question . technology !== "" && (
238
- < > Technology: { question . technology } </ >
239
- ) }
196
+ { question . technology !== "" && (
197
+ < > Technology: { question . technology } </ >
198
+ ) }
240
199
</ Row >
241
200
</ Col >
242
201
< Col xs = { 1 } >
243
202
< div
244
203
onClick = { ( ) => handleSaveQuestion ( question . _id ) }
245
204
className = "saveQuetionIcon"
246
205
>
247
- { selectedQuestionId === question . _id ? (
206
+ { JSON . stringify ( question . saves ) . includes ( JSON . stringify ( user . _id ) ) ?
248
207
< TurnedInIcon />
249
- ) : (
208
+ :
250
209
< TurnedInNotIcon />
251
- ) }
210
+ }
252
211
</ div >
253
212
</ Col >
254
213
</ Row >
0 commit comments