diff --git a/libs/ngrx-toolkit/src/lib/with-reset.spec.ts b/libs/ngrx-toolkit/src/lib/with-reset.spec.ts index fa31fd5..f1c25dd 100644 --- a/libs/ngrx-toolkit/src/lib/with-reset.spec.ts +++ b/libs/ngrx-toolkit/src/lib/with-reset.spec.ts @@ -109,4 +109,33 @@ describe('withReset', () => { 'Cannot set reset state, since store is not configured with withReset()' ); }); + + it('should reset one slice of state to initial', () => { + const { store } = setup(); + + store.changeUser(2, 'John'); + store.changeAddress('Vilnus', 'LT-00104'); + expect(getState(store)).toEqual({ + user: { id: 2, name: 'John' }, + address: { city: 'Vilnus', zip: 'LT-00104' }, + }); + store.resetSlice('address'); + expect(getState(store)).toEqual({ + user: { id: 2, name: 'John' }, + address: { city: 'Vienna', zip: '1010' }, + }); + }); + + it('should reset both slice of state to initial', () => { + const { store, initialState } = setup(); + + store.changeUser(2, 'John'); + store.changeAddress('Vilnus', 'LT-00104'); + expect(getState(store)).toEqual({ + user: { id: 2, name: 'John' }, + address: { city: 'Vilnus', zip: 'LT-00104' }, + }); + store.resetSlice(['address', 'user']); + expect(getState(store)).toStrictEqual(initialState); + }); }); diff --git a/libs/ngrx-toolkit/src/lib/with-reset.ts b/libs/ngrx-toolkit/src/lib/with-reset.ts index 1bb0594..e033188 100644 --- a/libs/ngrx-toolkit/src/lib/with-reset.ts +++ b/libs/ngrx-toolkit/src/lib/with-reset.ts @@ -10,6 +10,7 @@ import { export type PublicMethods = { resetState(): void; + resetSlice(slice: string | string[]): void; }; /** @@ -20,13 +21,24 @@ export type PublicMethods = { */ export function withReset() { return signalStoreFeature( - withProps(() => ({ _resetState: { value: {} } })), + withProps(() => ({ _resetState: { value: {} as Record } })), withMethods((store): PublicMethods => { // workaround to TS excessive property check const methods = { resetState() { patchState(store, store._resetState.value); }, + resetSlice(slice: string | string[]) { + patchState(store, (state) => ({ + ...state, + ...(typeof slice === 'string' + ? { [slice]: store._resetState.value[slice] } + : slice.reduce((acc, key) => { + acc[key] = store._resetState.value[key]; + return acc; + }, {} as Record)), + })); + }, __setResetState__(state: object) { store._resetState.value = state; },