Skip to content

Commit 95dbbfa

Browse files
fix(signals): add current state as second argument of case reducer (#4800)
1 parent 6c85001 commit 95dbbfa

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

modules/signals/events/spec/with-reducer.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,27 @@ describe('withReducer', () => {
7878
expect(getState(store)).toEqual({ count: 2, count2: 11 });
7979
});
8080

81+
it('has access to the current state', () => {
82+
const incrementBy = event('incrementBy', type<number>());
83+
84+
const CounterStore = signalStore(
85+
{ providedIn: 'root' },
86+
withState({ count: 10, count2: 0 }),
87+
withReducer(
88+
on(incrementBy, ({ payload }, state) => ({
89+
count: state.count + payload,
90+
}))
91+
)
92+
);
93+
94+
const store = TestBed.inject(CounterStore);
95+
const dispatcher = TestBed.inject(Dispatcher);
96+
97+
dispatcher.dispatch(incrementBy(20));
98+
99+
expect(getState(store)).toEqual({ count: 30, count2: 0 });
100+
});
101+
81102
it('allows listening to multiple events', () => {
82103
const set = event('set', type<number>());
83104
const set_ = event('set_', type<number>());

modules/signals/events/src/case-reducer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ type CaseReducer<
1313
State extends object,
1414
EventCreators extends EventCreator<string, any>[]
1515
> = (
16-
event: { [K in keyof EventCreators]: ReturnType<EventCreators[K]> }[number]
16+
event: { [K in keyof EventCreators]: ReturnType<EventCreators[K]> }[number],
17+
state: State
1718
) =>
1819
| Partial<State>
1920
| PartialStateUpdater<State>

modules/signals/events/src/with-reducer.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { inject } from '@angular/core';
1+
import { inject, untracked } from '@angular/core';
22
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
33
import { merge, tap } from 'rxjs';
44
import {
55
EmptyFeatureResult,
6+
getState,
67
patchState,
78
SignalStoreFeature,
89
signalStoreFeature,
@@ -48,7 +49,8 @@ export function withReducer<State extends object>(
4849
const updates = caseReducers.map((caseReducer) =>
4950
events.on(...caseReducer.events).pipe(
5051
tap((event) => {
51-
const result = caseReducer.reducer(event);
52+
const state = untracked(() => getState(store));
53+
const result = caseReducer.reducer(event, state);
5254
const updaters = Array.isArray(result) ? result : [result];
5355

5456
patchState(store, ...updaters);

0 commit comments

Comments
 (0)