From 06b4bf62c4e35ea99a6f219cc9d8e5663f3f2802 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Fri, 21 Apr 2023 15:24:49 -0400 Subject: [PATCH] effects with function --- src/Updux.ts | 8 +++++++- src/effects.test.ts | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Updux.ts b/src/Updux.ts index 062eb31..5a1d534 100644 --- a/src/Updux.ts +++ b/src/Updux.ts @@ -314,6 +314,9 @@ export default class Updux< addEffect(actionCreator: AggregateActions, T_Subduxes>, effect: EffectMiddleware): EffectMiddleware; + addEffect(guardFunc: (action: + AggregateActions, T_Subduxes>[keyof AggregateActions, T_Subduxes>]) => boolean, + effect: EffectMiddleware): EffectMiddleware; addEffect(effect: EffectMiddleware): EffectMiddleware; addEffect(...args) { let effect; @@ -323,10 +326,13 @@ export default class Updux< else { const [actionCreator, originalEffect] = args; + const test = actionCreator.hasOwnProperty('match') ? + actionCreator.match : actionCreator; + effect = (api) => next => { const e = originalEffect(api)(next); return action => { - const func = actionCreator.match(action) ? e : next; + const func = test(action) ? e : next; return func(action); } } diff --git a/src/effects.test.ts b/src/effects.test.ts index 0d93fa9..41e63ae 100644 --- a/src/effects.test.ts +++ b/src/effects.test.ts @@ -39,7 +39,7 @@ test('buildEffectsMiddleware', () => { expect(seen).toEqual(0); const dispatch = vi.fn(); - mw({ getState: () => 'the state', dispatch })(() => { })({ + mw({ getState: () => 'the state', dispatch })(() => {})({ type: 'noop', }); expect(seen).toEqual(1); @@ -117,8 +117,35 @@ test('addEffect with actionCreator', () => { const next = vi.fn(); const spy = vi.fn(); - const mw = dux.addEffect(dux.actions.foo, (api) => (next) => (action) => - next(spy(action)) + const mw = dux.addEffect( + dux.actions.foo, + (api) => (next) => (action) => next(spy(action)), + ); + + mw({})(next)(dux.actions.bar()); + expect(next).toHaveBeenCalled(); + expect(spy).not.toHaveBeenCalled(); + + next.mockReset(); + mw({})(next)(dux.actions.foo()); + expect(next).toHaveBeenCalled(); + expect(spy).toHaveBeenCalled(); +}); + +test('addEffect with function', () => { + const dux = new Updux({ + actions: { + foo: () => {}, + bar: () => {}, + }, + }); + + const next = vi.fn(); + const spy = vi.fn(); + + const mw = dux.addEffect( + (action) => action.type[0] === 'f', + (api) => (next) => (action) => next(spy(action)), ); mw({})(next)(dux.actions.bar());