1+ import React , { useState } from 'react' ;
2+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" ;
3+ import { faAngleDown , faAngleUp } from "@fortawesome/free-solid-svg-icons" ;
4+ import { useDispatch , useSelector } from "react-redux" ;
5+ import { setFilterValue } from "../store/slices/filterSlice" ;
6+ import { RootState } from "../store/store" ;
7+
8+ interface FilterProps {
9+ label : string ;
10+ }
11+
12+ const Filter : React . FC < FilterProps > = ( { label } ) => {
13+ const [ isOpen , setIsOpen ] = useState ( false ) ;
14+
15+ const dispatch = useDispatch ( ) ;
16+ const filter = useSelector ( ( state : RootState ) => state . filter [ "filters" ] ) [ label ] ;
17+ const { values, options} = filter ;
18+
19+ const toggleDropdown = ( ) => {
20+ setIsOpen ( ! isOpen ) ;
21+ } ;
22+
23+ const handleCheckboxChange = ( option : string ) => {
24+ const values = filter . values
25+ const newValues = values . includes ( option )
26+ ? values . filter ( v => v !== option )
27+ : [ ...values , option ] ;
28+ dispatch ( setFilterValue ( { label, values : newValues } ) ) ;
29+ } ;
30+
31+ return (
32+ < div className = "relative" >
33+ < button
34+ onClick = { toggleDropdown }
35+ className = "flex items-center space-x-2 p-2 bg-white rounded border border-gray-300 focus:outline-none focus:border-blue-500"
36+ >
37+ < span className = "font-semibold" > { label } :</ span >
38+ < span > { values . length } </ span >
39+ { isOpen ? (
40+ < FontAwesomeIcon icon = { faAngleUp } />
41+ ) : (
42+ < FontAwesomeIcon icon = { faAngleDown } />
43+ ) }
44+ </ button >
45+ { isOpen && (
46+ < div className = "absolute z-10 mt-2 w-64 border rounded-md shadow-lg bg-white" >
47+ { options . map ( ( option , index ) => (
48+ < label key = { index } className = "block text-left p-2 hover:bg-gray-100 cursor-pointer" >
49+ < input
50+ type = "checkbox"
51+ className = "mr-2"
52+ value = { option }
53+ checked = { values . includes ( option ) }
54+ onChange = { ( ) => handleCheckboxChange ( option ) }
55+ />
56+ { option }
57+ </ label >
58+ ) ) }
59+ </ div >
60+ ) }
61+ </ div >
62+ ) ;
63+ }
64+
65+ export default Filter ;
0 commit comments