Skip to content

Commit 11755a8

Browse files
arbrandesclaude
andcommitted
refactor: replace useReducer with useState in context providers
MasqueradeProvider and FiltersProvider used useReducer with action type enums for what are simple value states. Replaced with useState for less boilerplate while preserving the same public API. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4fd7435 commit 11755a8

2 files changed

Lines changed: 15 additions & 106 deletions

File tree

src/data/context/FiltersProvider.tsx

Lines changed: 11 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, {
2-
createContext, useContext, useReducer, useMemo,
3-
useCallback,
2+
createContext, useContext, useState, useMemo, useCallback,
43
} from 'react';
54

65
type SortOption = 'enrolled' | 'title';
@@ -19,96 +18,36 @@ interface FiltersContextType {
1918

2019
const 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-
6221
export 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 (

src/data/context/MasqueradeProvider.tsx

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, {
2-
createContext, useContext, useMemo, useReducer, ReactNode,
3-
useCallback,
2+
createContext, useContext, useMemo, useState, ReactNode,
43
} from 'react';
54

65
interface MasqueradeContextType {
@@ -10,46 +9,17 @@ interface MasqueradeContextType {
109

1110
const MasqueradeContext = createContext<MasqueradeContextType | null>(null);
1211

13-
interface MasqueradeState {
14-
masqueradeUser: string | undefined,
15-
}
16-
17-
const initialState: MasqueradeState = {
18-
masqueradeUser: undefined,
19-
};
20-
21-
interface MasqueradeAction {
22-
type: 'SET_MASQUERADE_USER', payload: string | undefined,
23-
}
24-
25-
const masqueradeReducer = (state: MasqueradeState, action: MasqueradeAction): MasqueradeState => {
26-
switch (action.type) {
27-
case 'SET_MASQUERADE_USER':
28-
return {
29-
...state,
30-
masqueradeUser: action.payload,
31-
};
32-
/* istanbul ignore next */
33-
default:
34-
return state;
35-
}
36-
};
37-
3812
interface MasqueradeProviderProps {
3913
children: ReactNode,
4014
}
4115

4216
export const MasqueradeProvider: React.FC<MasqueradeProviderProps> = ({ children }) => {
43-
const [state, dispatch] = useReducer(masqueradeReducer, initialState);
44-
45-
const setMasqueradeUser = useCallback((user: string | undefined) => {
46-
dispatch({ type: 'SET_MASQUERADE_USER', payload: user });
47-
}, []);
17+
const [masqueradeUser, setMasqueradeUser] = useState<string | undefined>(undefined);
4818

4919
const contextValue = useMemo(() => ({
50-
masqueradeUser: state.masqueradeUser,
20+
masqueradeUser,
5121
setMasqueradeUser,
52-
}), [state.masqueradeUser, setMasqueradeUser]);
22+
}), [masqueradeUser]);
5323

5424
return (
5525
<MasqueradeContext.Provider value={contextValue}>

0 commit comments

Comments
 (0)