Skip to content
This repository was archived by the owner on Feb 11, 2021. It is now read-only.

Commit c50d37f

Browse files
committed
First implementation of redux-trigger middleware.
This is the first trial of an implementation for the redux-trigger concept. It relies on adding triggers that stay resident until you explicitly remove them. Things I've learned from this approach: * It's really risky to leave a trigger after it fires. - Because it's likely to trigger again on the same state unless you do something. - It leaves the responsibility to the trigger to remove itself. - Triggers can be a performance hit because they run every time the state changes. To this end, the next update will move triggers to be temporary and one-time use only.
1 parent 7be3e88 commit c50d37f

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

src/index.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
2+
const REDUX_TRIGGER_ADD = 'REDUX_TRIGGER_ADD';
3+
const REDUX_TRIGGER_REMOVE = 'REDUX_TRIGGER_REMOVE';
4+
5+
/**
6+
* Middleware creator.
7+
*/
8+
function createTriggerMiddleware() {
9+
let triggers = [];
10+
11+
return ( store ) => ( next ) => ( action ) => {
12+
switch ( action.type ) {
13+
case REDUX_TRIGGER_ADD:
14+
triggers.unshift( action.payload );
15+
16+
console.log("** redux-trigger add! **");
17+
console.log( triggers );
18+
return true;
19+
case REDUX_TRIGGER_REMOVE:
20+
triggers.splice( triggers.indexOf( action.payload ), 1 );
21+
22+
console.log("** redux-trigger remove! **");
23+
console.log( triggers );
24+
return true;
25+
default:
26+
let res = next( action );
27+
checkTriggers( store, triggers );
28+
return res;
29+
}
30+
}
31+
}
32+
33+
function checkTriggers( store, triggers ) {
34+
for ( let index = triggers.length - 1; index >= 0; index-- ) {
35+
let trigger = triggers[ index ];
36+
let match = trigger.matcher( store.getState() );
37+
38+
if ( match ) {
39+
// Remove the trigger first, so it doesn't get run again.
40+
triggers.splice( index, 1 );
41+
42+
// Then dispatch the trigger's action.
43+
let action = trigger.actionCreator( match );
44+
store.dispatch( action );
45+
}
46+
}
47+
}
48+
49+
50+
/**
51+
* Convenience function to create a trigger object.
52+
*
53+
* @param Function matcher ( state )
54+
* return match object when trigger should fire, or null if no match.
55+
* @param Function actionCreator ( match )
56+
* create action using match object.
57+
* @return Object The trigger object.
58+
*/
59+
export function createTrigger( matcher, actionCreator ) {
60+
return {
61+
matcher,
62+
actionCreator
63+
};
64+
}
65+
66+
/**
67+
* Trigger add action creator.
68+
*
69+
* @param Object trigger
70+
* The trigger object to be added. Must be in the format:
71+
* { matcher, actionCreator }
72+
* @return Object The trigger action to be dispatched.
73+
*/
74+
export function addTrigger( trigger ) {
75+
return {
76+
type: REDUX_TRIGGER_ADD,
77+
payload: trigger
78+
};
79+
}
80+
81+
/**
82+
* Trigger remove action creator.
83+
*
84+
* @param Object trigger The trigger object to be removed.
85+
* @return Object The trigger action to be dispatched.
86+
*/
87+
export function removeTrigger( trigger ) {
88+
return {
89+
type: REDUX_TRIGGER_REMOVE,
90+
payload: trigger
91+
};
92+
}
93+
94+
export default createTriggerMiddleware;
95+

0 commit comments

Comments
 (0)