1- import React , { useEffect } from "react" ;
1+ import React , { useEffect , useState , useCallback } from "react" ;
22import { MultiSelect , DropDownList } from "@progress/kendo-react-dropdowns" ;
33import { SvgIcon } from "@progress/kendo-react-common" ;
44import { filterIcon , sortAscIcon } from "@progress/kendo-svg-icons" ;
5- import { FilterDescriptor , SortDescriptor , State } from "@progress/kendo-data-query" ;
6- import { useCategoriesContext } from "../helpers/CategoriesContext" ;
5+ import { FilterDescriptor , State } from "@progress/kendo-data-query" ;
6+ import { useStore } from "@nanostores/react" ;
7+ import { selectedLanguage } from "../helpers/languageStore" ;
8+ import enMessages from "../data/messages/en" ;
9+ import frMessages from "../data/messages/fr" ;
10+ import esMessages from "../data/messages/es" ;
11+
12+ const translations = {
13+ en : enMessages ,
14+ fr : frMessages ,
15+ es : esMessages ,
16+ } ;
717
8- const chips = [ "Bracelets" , "Rings" , "Earrings" , "Watches" , "Necklaces" ] ;
9- const statuses = [ "Sale" , "Recommended" , "Must Have "] ;
10- const materials = [ "Gold" , "Silver" ] ;
18+ const getTranslations = ( language : string ) => {
19+ return translations [ language ] || translations [ "en "] ;
20+ } ;
1121
1222interface FilterComponentProps {
1323 updateUI : ( state : State ) => void ;
1424}
1525
1626export const FilterComponent : React . FC < FilterComponentProps > = ( { updateUI } ) => {
17- const { selectedCategory, setSelectedCategory } = useCategoriesContext ( ) ;
18- const [ categoryValue , setCategoryValue ] = React . useState < string [ ] > ( [ ] ) ;
19- const [ statusValue , setStatusValue ] = React . useState < string > ( "Recommended" ) ;
20- const [ materialValue , setMaterialValue ] = React . useState < string > ( "Material" ) ;
21-
22- useEffect ( ( ) => {
23- if ( selectedCategory ) {
24- setCategoryValue ( [ selectedCategory ] ) ;
25- applyCategoryFilter ( [ selectedCategory ] ) ;
26- } else {
27- setCategoryValue ( [ ] ) ;
28- applyCategoryFilter ( [ ] ) ;
29- }
30- } , [ selectedCategory ] ) ;
27+ const language = useStore ( selectedLanguage ) ;
28+ const t = getTranslations ( language ) ;
3129
32- const applyCategoryFilter = ( categories : string [ ] ) => {
33- const filters = categories . map ( ( category ) => ( {
34- field : "category" ,
35- operator : "eq" ,
36- value : category ,
37- } ) ) ;
30+ const [ categoryValue , setCategoryValue ] = useState < string [ ] > ( [ ] ) ;
31+ const [ statusValue , setStatusValue ] = useState < string > ( t . statusesData [ 0 ] ) ;
32+ const [ materialValue , setMaterialValue ] = useState < string > ( t . materialPlaceholder ) ;
3833
39- const customCompositeFilters : State = {
40- filter : {
41- logic : "or" ,
42- filters,
43- } ,
44- sort : undefined ,
45- } ;
34+ const chips = t . categoriesData || [ ] ;
35+ const statuses = t . statusesData || [ ] ;
36+ const materials = t . materialsData || [ ] ;
4637
47- updateUI ( customCompositeFilters ) ;
48- } ;
38+ useEffect ( ( ) => {
39+ setCategoryValue ( [ ] ) ;
40+ setStatusValue ( t . statusesData [ 0 ] ) ;
41+ setMaterialValue ( t . materialPlaceholder ) ;
42+ updateUI ( { filter : undefined , sort : undefined } ) ;
43+ } , [ language , t , updateUI ] ) ;
4944
50- const onCategoryChange = ( e : any ) => {
51- setCategoryValue ( e . value ) ;
52- applyCategoryFilter ( e . value ) ;
53- setSelectedCategory ( e . value . length > 0 ? e . value [ 0 ] : null ) ;
54- } ;
45+ const applyFilters = useCallback ( ( ) => {
46+ const filters : FilterDescriptor [ ] = [ ] ;
5547
56- const onStatusChange = ( e : any ) => {
57- setStatusValue ( e . value ) ;
48+ if ( categoryValue . length > 0 ) {
49+ filters . push ( {
50+ field : "category" ,
51+ operator : "eq" ,
52+ value : categoryValue [ 0 ] ,
53+ } ) ;
54+ }
5855
59- const newSorts : SortDescriptor [ ] = [
60- {
56+ if ( statusValue !== t . statusesData [ 0 ] ) {
57+ filters . push ( {
6158 field : "status" ,
62- dir : "desc" ,
63- } ,
64- ] ;
65-
66- const customCompositeFilters : State = {
67- filter : undefined ,
68- sort : newSorts ,
69- } ;
70-
71- updateUI ( customCompositeFilters ) ;
72- } ;
73-
74- const onMaterialChange = ( e : any ) => {
75- setMaterialValue ( e . value ) ;
59+ operator : "eq" ,
60+ value : statusValue ,
61+ } ) ;
62+ }
7663
77- const newFilter : FilterDescriptor [ ] = [
78- {
64+ if ( materialValue !== t . materialPlaceholder ) {
65+ filters . push ( {
7966 field : "material" ,
8067 operator : "eq" ,
81- value : e . value ,
82- } ,
83- ] ;
68+ value : materialValue ,
69+ } ) ;
70+ }
8471
8572 const customCompositeFilters : State = {
86- filter : {
87- logic : "or" ,
88- filters : newFilter ,
89- } ,
73+ filter : filters . length > 0 ? { logic : "and" , filters } : undefined ,
9074 sort : undefined ,
9175 } ;
9276
9377 updateUI ( customCompositeFilters ) ;
94- setCategoryValue ( [ ] ) ;
95- } ;
78+ } , [ categoryValue , statusValue , materialValue , t , updateUI ] ) ;
79+
80+ useEffect ( ( ) => {
81+ applyFilters ( ) ;
82+ } , [ categoryValue , statusValue , materialValue , applyFilters ] ) ;
83+
84+ const onCategoryChange = ( e : any ) => setCategoryValue ( e . value ) ;
85+ const onStatusChange = ( e : any ) => setStatusValue ( e . value ) ;
86+ const onMaterialChange = ( e : any ) => setMaterialValue ( e . value ) ;
9687
9788 const clearFilters = ( ) => {
9889 setCategoryValue ( [ ] ) ;
99- setStatusValue ( "Recommended" ) ;
100- setMaterialValue ( "Material" ) ;
101- setSelectedCategory ( null ) ;
90+ setStatusValue ( t . statusesData [ 0 ] ) ;
91+ setMaterialValue ( t . materialPlaceholder ) ;
10292 updateUI ( { filter : undefined , sort : undefined } ) ;
10393 } ;
10494
10595 return (
10696 < section className = "k-d-flex k-justify-content-between k-align-items-center" >
10797 < span className = "k-d-flex k-align-items-center" >
10898 < span className = "k-d-flex k-align-items-center k-pr-2" >
109- < SvgIcon icon = { filterIcon } > </ SvgIcon > Filter:
99+ < SvgIcon icon = { filterIcon } > </ SvgIcon > { t . filterLabel }
110100 </ span >
111101 < span className = "k-pr-2" >
112102 < MultiSelect
113103 data = { chips }
114104 value = { categoryValue }
115- placeholder = "Category"
105+ placeholder = { t . categoryPlaceholder }
116106 onChange = { onCategoryChange }
117107 style = { { minWidth : "119px" } }
118108 />
@@ -123,13 +113,15 @@ export const FilterComponent: React.FC<FilterComponentProps> = ({ updateUI }) =>
123113 </ span >
124114 < span className = "k-d-flex k-align-items-center" >
125115 < span className = "k-d-flex k-align-items-center k-pr-2" >
126- < SvgIcon icon = { sortAscIcon } > </ SvgIcon > Sort by:
116+ < SvgIcon icon = { sortAscIcon } > </ SvgIcon > { t . sortByLabel }
127117 </ span >
128118 < span >
129119 < DropDownList data = { statuses } value = { statusValue } onChange = { onStatusChange } />
130120 </ span >
131121 </ span >
132- < button className = "k-button k-button-flat" onClick = { clearFilters } > Clear Filters</ button >
122+ < button className = "k-button k-button-flat" onClick = { clearFilters } >
123+ { t . clearFiltersButton }
124+ </ button >
133125 </ section >
134126 ) ;
135127} ;
0 commit comments