11import React , {
2- createContext , useContext , useReducer , useMemo ,
3- useCallback ,
2+ createContext , useContext , useState , useMemo , useCallback ,
43} from 'react' ;
54
65type SortOption = 'enrolled' | 'title' ;
@@ -19,96 +18,36 @@ interface FiltersContextType {
1918
2019const FiltersContext = createContext < FiltersContextType | null > ( null ) ;
2120
22- interface FiltersState {
23- filters : string [ ] ,
24- sortBy : SortOption ,
25- pageNumber : number ,
26- }
27-
28- const initialState : FiltersState = {
29- filters : [ ] ,
30- sortBy : 'enrolled' ,
31- pageNumber : 1 ,
32- } ;
33-
34- type FiltersAction =
35- | { type : 'SET_FILTERS' , payload : string [ ] }
36- | { type : 'ADD_FILTER' , payload : string }
37- | { type : 'REMOVE_FILTER' , payload : string }
38- | { type : 'CLEAR_FILTERS' }
39- | { type : 'SET_SORT_BY' , payload : SortOption }
40- | { type : 'SET_PAGE_NUMBER' , payload : number } ;
41-
42- const filtersReducer = ( state : FiltersState , action : FiltersAction ) : FiltersState => {
43- switch ( action . type ) {
44- case 'SET_FILTERS' :
45- return { ...state , filters : action . payload } ;
46- case 'ADD_FILTER' :
47- return { ...state , filters : [ ...state . filters , action . payload ] } ;
48- case 'REMOVE_FILTER' :
49- return { ...state , filters : state . filters . filter ( item => item !== action . payload ) } ;
50- case 'CLEAR_FILTERS' :
51- return { ...state , filters : [ ] } ;
52- case 'SET_SORT_BY' :
53- return { ...state , sortBy : action . payload } ;
54- case 'SET_PAGE_NUMBER' :
55- return { ...state , pageNumber : action . payload } ;
56- /* istanbul ignore next */
57- default :
58- return state ;
59- }
60- } ;
61-
6221export const FiltersProvider = ( { children } : { children : React . ReactNode } ) => {
63- const [ state , dispatch ] = useReducer ( filtersReducer , initialState ) ;
64-
65- const setFilters = useCallback ( ( newFilters : string [ ] ) => {
66- dispatch ( { type : 'SET_FILTERS' , payload : newFilters } ) ;
67- } , [ ] ) ;
22+ const [ filters , setFilters ] = useState < string [ ] > ( [ ] ) ;
23+ const [ sortBy , setSortBy ] = useState < SortOption > ( 'enrolled' ) ;
24+ const [ pageNumber , setPageNumber ] = useState ( 1 ) ;
6825
6926 const addFilter = useCallback ( ( filter : string ) => {
70- dispatch ( { type : 'ADD_FILTER' , payload : filter } ) ;
27+ setFilters ( prev => [ ... prev , filter ] ) ;
7128 } , [ ] ) ;
7229
7330 const removeFilter = useCallback ( ( filter : string ) => {
74- dispatch ( { type : 'REMOVE_FILTER' , payload : filter } ) ;
31+ setFilters ( prev => prev . filter ( item => item !== filter ) ) ;
7532 } , [ ] ) ;
7633
7734 const clearFilters = useCallback ( ( ) => {
78- dispatch ( { type : 'CLEAR_FILTERS' } ) ;
79- } , [ ] ) ;
80-
81- const setSortBy = useCallback ( ( sortOption : SortOption ) => {
82- dispatch ( { type : 'SET_SORT_BY' , payload : sortOption } ) ;
83- } , [ ] ) ;
84-
85- const setPageNumber = useCallback ( ( pageNumber : number ) => {
86- dispatch ( { type : 'SET_PAGE_NUMBER' , payload : pageNumber } ) ;
35+ setFilters ( [ ] ) ;
8736 } , [ ] ) ;
8837
8938 const contextValue = useMemo (
9039 ( ) => ( {
91- filters : state . filters ,
92- sortBy : state . sortBy ,
93- pageNumber : state . pageNumber ,
40+ filters,
41+ sortBy,
42+ pageNumber,
9443 setFilters,
9544 addFilter,
9645 removeFilter,
9746 clearFilters,
9847 setSortBy,
9948 setPageNumber,
10049 } ) ,
101- [
102- state . filters ,
103- state . sortBy ,
104- state . pageNumber ,
105- setFilters ,
106- addFilter ,
107- removeFilter ,
108- clearFilters ,
109- setSortBy ,
110- setPageNumber ,
111- ] ,
50+ [ filters , sortBy , pageNumber , addFilter , removeFilter , clearFilters ] ,
11251 ) ;
11352
11453 return (
0 commit comments