-
Notifications
You must be signed in to change notification settings - Fork 0
/
redux-local.js
67 lines (55 loc) · 1.46 KB
/
redux-local.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { curry } from 'ramda';
import { generate } from 'shortid';
import WeakMap from 'es6-weak-map';
/**
* @constant map
* @type {WeakMap}
*/
const map = new WeakMap();
/**
* @constant DEFAULT_STATE
* @type {Symbol}
*/
export const DEFAULT_STATE = Symbol('redux-local/default-state');
/**
* @method localFor
* @param {*} instance
* @param {String} [property = "id"]
* @return {Object}
*/
export const localFor = (instance, property = 'id') => {
return {
/**
* @constant id
* @type {String|Symbol}
*/
id: (() => {
const record = map.get(instance);
return record ? record.id : DEFAULT_STATE;
})(),
/**
* @method dispatch
* @param {Object} action
* @return {void}
*/
dispatch(action) {
// Utilise the existing record or create a new.
const { id } = map.get(instance) || (() => {
const record = { id: generate(), instance };
map.set(instance, record);
return record;
})();
// Dispatch the original event, including the `id` parameter.
instance.props.dispatch({ ...action, [property]: id });
}
};
};
/**
* @method bindLocalState
* @param {Object} state
* @param {Object} identifier
* @return {*}
*/
export const bindLocalState = curry((state, identifier) => {
return state[identifier] || state[DEFAULT_STATE];
});