add actions
This commit is contained in:
parent
3f6c31a998
commit
31c6060041
7
Changes
Normal file
7
Changes
Normal file
@ -0,0 +1,7 @@
|
||||
# Revision history for Updux
|
||||
|
||||
0.0.2 2019-10-22
|
||||
- Add 'actions' in the config.
|
||||
|
||||
0.0.1 2019-10-22
|
||||
- Initial release.
|
32
README.md
32
README.md
@ -45,6 +45,9 @@ const {
|
||||
next(action);
|
||||
};
|
||||
},
|
||||
actions: {
|
||||
customAction: ( someArg ) => ({ someProp: someArg }),
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
@ -104,7 +107,6 @@ const rootUpdux = updux({
|
||||
todos, statistics
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### mutations
|
||||
|
||||
@ -187,7 +189,25 @@ updux({
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
### actions
|
||||
|
||||
Generic action creations are automatically created from the mutations and effects, but you can
|
||||
also define custom action creator here. The object's values are function that
|
||||
transform the arguments of the creator to the action's payload.
|
||||
|
||||
```
|
||||
const { actions } = updox({
|
||||
mutations: {
|
||||
foo: () => state => state,
|
||||
}
|
||||
actions: {
|
||||
bar: (x,y) => ({x,y})
|
||||
}
|
||||
});
|
||||
|
||||
actions.foo({ x: 1, y: 2 }); // => { type: foo, payload: { x:1, y:2 } }
|
||||
actions.bar(1,2); // => { type: bar, payload: { x:1, y:2 } }
|
||||
|
||||
|
||||
## return value
|
||||
@ -215,13 +235,19 @@ mutations will be performed first.
|
||||
|
||||
### actions
|
||||
|
||||
Action creators for all actions used in the mutations, effects and subdox
|
||||
Action creators for all actions defined or used in the actions, mutations, effects and subduxes
|
||||
of the updox config.
|
||||
|
||||
The action creators have the signature `(payload={},meta={}) => ({type,
|
||||
Non-custom action creators defined in `actions` have the signature `(payload={},meta={}) => ({type,
|
||||
payload,meta})` (with the extra sugar that if `meta` or `payload` are not
|
||||
specified, the key is not present in the produced action).
|
||||
|
||||
If the same action appears in multiple locations, the precedence order
|
||||
determining which one will prevail is
|
||||
|
||||
actions generated from mutations/effects < non-custom subduxes actions <
|
||||
custom subduxes actions < custom actions
|
||||
|
||||
### middleware
|
||||
|
||||
A middleware aggregating all the effects defined in the
|
||||
|
@ -19,7 +19,7 @@
|
||||
"build": "babel src --out-dir dist",
|
||||
"test": "jest"
|
||||
},
|
||||
"version": "0.0.1",
|
||||
"version": "0.1.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/yanick/updux.git"
|
||||
|
@ -9,10 +9,18 @@ test( 'actions defined in effects and mutations, multi-level', () => {
|
||||
},
|
||||
mutations: { bar: () => () => null },
|
||||
subduxes: {
|
||||
mysub: updux({
|
||||
mysub: {
|
||||
effects: { baz: api => next => action => { }, },
|
||||
mutations: { quux: () => () => null },
|
||||
})
|
||||
actions: {
|
||||
foo: (limit) => ({limit}),
|
||||
},
|
||||
},
|
||||
myothersub: {
|
||||
effects: {
|
||||
foo: () => () => () => {},
|
||||
},
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@ -21,4 +29,10 @@ test( 'actions defined in effects and mutations, multi-level', () => {
|
||||
|
||||
expect( types).toEqual([ 'bar', 'baz', 'foo', 'quux', ]);
|
||||
|
||||
expect( actions.bar() ).toEqual({ type: 'bar' });
|
||||
expect( actions.bar('xxx') ).toEqual({ type: 'bar', payload: 'xxx' });
|
||||
expect( actions.bar(undefined,'yyy') ).toEqual({ type: 'bar',meta: 'yyy' });
|
||||
|
||||
expect(actions.foo(12)).toEqual({type: 'foo', payload: { limit: 12 }});
|
||||
|
||||
});
|
||||
|
@ -1,20 +1,40 @@
|
||||
import fp from 'lodash/fp';
|
||||
|
||||
function actionFor(type) {
|
||||
return ( (payload = undefined, meta = undefined) =>
|
||||
fp.pickBy(v => v !== null)({type, payload, meta})
|
||||
const creator = ( (payload = undefined, meta = undefined) =>
|
||||
fp.pickBy(v => v !== undefined)({type, payload, meta})
|
||||
);
|
||||
|
||||
creator._genericAction = true;
|
||||
|
||||
return creator;
|
||||
}
|
||||
|
||||
export default function buildActions(
|
||||
creators = {},
|
||||
mutations = {},
|
||||
effects = {},
|
||||
subActions = {},
|
||||
subActions = [],
|
||||
) {
|
||||
|
||||
return { ...subActions,
|
||||
...fp.fromPairs([ ...Object.keys(mutations), ...Object.keys(effects) ]
|
||||
.map( type => [ type, actionFor(type) ]))
|
||||
};
|
||||
// priority => generics => generic subs => craft subs => creators
|
||||
|
||||
const [ crafted, generic ] = fp.partition(
|
||||
([type,f]) => !f._genericAction
|
||||
)( fp.flatten( subActions.map( x => Object.entries(x) ) ).filter(
|
||||
([_,f]) => f
|
||||
) )
|
||||
|
||||
const actions = [
|
||||
...([ ...Object.keys(mutations), ...Object.keys(effects) ]
|
||||
.map( type => [ type, actionFor(type) ] )),
|
||||
...generic,
|
||||
...crafted,
|
||||
...Object.entries(creators).map(
|
||||
([type, payload]) => [type, (...args) => ({ type, payload: payload(...args) })]
|
||||
),
|
||||
];
|
||||
|
||||
return fp.fromPairs(actions);
|
||||
|
||||
}
|
||||
|
@ -17,10 +17,10 @@ export class Updux {
|
||||
|
||||
|
||||
this.actions = buildActions(
|
||||
config.actions,
|
||||
config.mutations,
|
||||
config.effects,
|
||||
fp.mergeAll( Object.values( this.subduxes ).map( ({ actions }) =>
|
||||
actions ) )
|
||||
Object.values( this.subduxes ).map( ({actions}) => actions ),
|
||||
)
|
||||
|
||||
this.initial = buildInitial(
|
||||
|
Loading…
Reference in New Issue
Block a user