-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathredux-css.js
83 lines (77 loc) · 2.19 KB
/
redux-css.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { isObjLiteral } from './utils/helpers';
// import { objectMapReducer } from './utils/reducerGenerators'
import {
setVariable,
setAllVariables,
getVariable,
getAllVariables,
removeVariable,
removeAllVaraibles,
} from './utils/css';
const buildReducer = reducer => {
let formattedReducer;
formattedReducer = reducer;
return formattedReducer;
};
const middleware = (reducer, currentVars, action, state) => {
const nextVars = reducer(currentVars, action, state);
if (nextVars !== currentVars) {
new Set([...Object.keys(currentVars), ...Object.keys(nextVars)]).forEach(varName => {
if (currentVars[varName] !== nextVars[varName]) {
const value = nextVars[varName];
if (value !== undefined) {
setVariable(varName, value);
currentVars[varName] = value;
} else {
removeVariable(varName);
delete currentVars[varName];
}
}
});
}
};
export default (initialReducer, initialVars) => {
let reducer = buildReducer(initialReducer);
const currentVars = Object.assign(
{},
initialVars,
reducer(initialVars, {
type: '@@CSS-REDUX/init',
}),
);
setAllVariables(currentVars);
return {
middleware: store => next => action => {
middleware(reducer, currentVars, action, store.getState());
return next(action);
},
replaceReducer: nextReducer => {
reducer = buildReducer(nextReducer);
},
setVariable: (varName, value) => {
const prevValue = currentVars[varName];
if (prevValue !== value) {
setVariable(varName, value);
currentVars[varName] = value;
}
return prevValue;
},
setAllVariables: (vars = {}) => {
for (const varName in vars) {
const prevValue = currentVars[varName];
if (prevValue !== vars[varName]) {
setVariable(varName, vars[varName]);
currentVars[varName] = vars[varName];
}
}
},
getVariable: varName => currentVars[varName],
getAllVariables: () => Object.assign({}, currentVars),
removeVariable: varName => {
if (currentVars[varName]) {
removeVariable(varName);
delete currentVars[varName];
}
},
};
};