Skip to content

Commit b1dd066

Browse files
committed
create util to cut down on repetitive code
1 parent 9d9c568 commit b1dd066

File tree

1 file changed

+33
-50
lines changed

1 file changed

+33
-50
lines changed

packages/toolkit/src/entities/slice_creator.ts

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import type {
2+
CaseReducerDefinition,
23
CreatorCaseReducers,
4+
PayloadAction,
35
ReducerCreator,
46
ReducerCreatorEntry,
57
} from '@reduxjs/toolkit'
68
import { reducerCreator } from '../createSlice'
79
import type { WithRequiredProp } from '../tsHelpers'
810
import type {
9-
Update,
1011
EntityAdapter,
1112
EntityId,
1213
EntityState,
@@ -79,6 +80,20 @@ declare module '@reduxjs/toolkit' {
7980
}
8081
}
8182

83+
const makeWrappedReducerCreator =
84+
<T, Id extends EntityId, State>(
85+
selectEntityState: (state: State) => EntityState<T, Id>,
86+
) =>
87+
<Payload>(
88+
reducer: (
89+
state: EntityState<T, Id>,
90+
action: PayloadAction<Payload>,
91+
) => void,
92+
): CaseReducerDefinition<State, PayloadAction<Payload>> =>
93+
reducerCreator.create<Payload>((state: State, action) =>
94+
reducer(selectEntityState(state), action),
95+
)
96+
8297
export function createEntityMethods<
8398
T,
8499
Id extends EntityId,
@@ -98,58 +113,26 @@ export function createEntityMethods<
98113

99114
const name = nameParam as 's'
100115
const pluralName = pluralParam as 'p'
101-
const reducer = reducerCreator.create
116+
const reducer = makeWrappedReducerCreator(selectEntityState)
102117
const reducers: EntityReducers<T, Id, State, 's', 'p'> = {
103-
[`addOne${capitalize(name)}` as const]: reducer<T>((state, action) => {
104-
adapter.addOne(selectEntityState(state), action)
105-
}),
106-
[`addMany${capitalize(pluralName)}` as const]: reducer<
107-
readonly T[] | Record<Id, T>
108-
>((state, action) => {
109-
adapter.addMany(selectEntityState(state), action)
110-
}),
111-
[`setOne${capitalize(name)}` as const]: reducer<T>((state, action) => {
112-
adapter.setOne(selectEntityState(state), action)
113-
}),
114-
[`setMany${capitalize(pluralName)}` as const]: reducer<
115-
readonly T[] | Record<Id, T>
116-
>((state, action) => {
117-
adapter.setMany(selectEntityState(state), action)
118-
}),
119-
[`setAll${capitalize(pluralName)}` as const]: reducer<
120-
readonly T[] | Record<Id, T>
121-
>((state, action) => {
122-
adapter.setAll(selectEntityState(state), action)
123-
}),
124-
[`removeOne${capitalize(name)}` as const]: reducer<Id>((state, action) => {
125-
adapter.removeOne(selectEntityState(state), action)
126-
}),
127-
[`removeMany${capitalize(pluralName)}` as const]: reducer<readonly Id[]>(
128-
(state, action) => {
129-
adapter.removeMany(selectEntityState(state), action)
130-
},
118+
[`addOne${capitalize(name)}` as const]: reducer(adapter.addOne),
119+
[`addMany${capitalize(pluralName)}` as const]: reducer(adapter.addMany),
120+
[`setOne${capitalize(name)}` as const]: reducer(adapter.setOne),
121+
[`setMany${capitalize(pluralName)}` as const]: reducer(adapter.setMany),
122+
[`setAll${capitalize(pluralName)}` as const]: reducer(adapter.setAll),
123+
[`removeOne${capitalize(name)}` as const]: reducer(adapter.removeOne),
124+
[`removeMany${capitalize(pluralName)}` as const]: reducer(
125+
adapter.removeMany,
126+
),
127+
[`removeAll${capitalize(pluralName)}` as const]: reducer(adapter.removeAll),
128+
[`upsertOne${capitalize(name)}` as const]: reducer(adapter.upsertOne),
129+
[`upsertMany${capitalize(pluralName)}` as const]: reducer(
130+
adapter.upsertMany,
131131
),
132-
[`removeAll${capitalize(pluralName)}` as const]: reducer((state) => {
133-
adapter.removeAll(selectEntityState(state))
134-
}),
135-
[`upsertOne${capitalize(name)}` as const]: reducer<T>((state, action) => {
136-
adapter.upsertOne(selectEntityState(state), action)
137-
}),
138-
[`upsertMany${capitalize(pluralName)}` as const]: reducer<
139-
readonly T[] | Record<Id, T>
140-
>((state, action) => {
141-
adapter.upsertMany(selectEntityState(state), action)
142-
}),
143-
[`updateOne${capitalize(name)}` as const]: reducer<Update<T, Id>>(
144-
(state, action) => {
145-
adapter.updateOne(selectEntityState(state), action)
146-
},
132+
[`updateOne${capitalize(name)}` as const]: reducer(adapter.updateOne),
133+
[`updateMany${capitalize(pluralName)}` as const]: reducer(
134+
adapter.updateMany,
147135
),
148-
[`updateMany${capitalize(pluralName)}` as const]: reducer<
149-
readonly Update<T, Id>[]
150-
>((state, action) => {
151-
adapter.updateMany(selectEntityState(state), action)
152-
}),
153136
}
154137
return reducers as any
155138
}

0 commit comments

Comments
 (0)