Refactoring store

This commit is contained in:
2015-09-16 17:26:56 +02:00
parent 1136b693fd
commit a2f0a03671
11 changed files with 208 additions and 22 deletions

View File

@ -7,6 +7,9 @@ var LOAD_DESKTOP_APPS_SUCCESS = exports.LOAD_DESKTOP_APPS_SUCCESS = 'LOAD_DESKTO
var LOAD_DESKTOP_APPS_FAILED = exports.LOAD_DESKTOP_APPS_FAILED = 'LOAD_DESKTOP_APPS_FAILED';
var MOVE_PROFILE_ITEM = exports.MOVE_PROFILE_ITEM = 'MOVE_PROFILE_ITEM';
var ADD_PROFILE_ITEM = exports.ADD_PROFILE_ITEM = 'ADD_PROFILE_ITEM';
var USE_ICON_THEME = exports.USE_ICON_THEME = 'USE_ICON_THEME';
var SELECT_PROFILE_ITEM = exports.SELECT_PROFILE_ITEM = 'SELECT_PROFILE_ITEM';
var UPDATE_PROFILE_ITEM = exports.UPDATE_PROFILE_ITEM = 'UPDATE_PROFILE_ITEM';
// Actions creators
@ -31,10 +34,16 @@ exports.loadDesktopApps = function() {
};
};
exports.useIconTheme = function(theme) {
return {
type: USE_ICON_THEME,
theme: theme
};
};
exports.moveProfileItem = function(movedItem, targetItem) {
return {
type: 'MOVE_PROFILE_ITEM',
type: MOVE_PROFILE_ITEM,
movedItem: movedItem,
targetItem: targetItem
};
@ -42,8 +51,24 @@ exports.moveProfileItem = function(movedItem, targetItem) {
exports.addProfileItem = function(newItem, targetItem) {
return {
type: 'ADD_PROFILE_ITEM',
type: ADD_PROFILE_ITEM,
newItem: newItem,
targetItem: targetItem
};
};
exports.selectProfileItem = function(item) {
return {
type: SELECT_PROFILE_ITEM,
item: item
};
};
exports.updateProfileItem = function(item, key, value) {
return {
type: UPDATE_PROFILE_ITEM,
item: item,
key: key,
value: value
};
};

View File

@ -12,7 +12,8 @@ var createStore = redux.applyMiddleware(
var appReducer = redux.combineReducers({
profile: reducers.profile,
processOpts: reducers.processOpts,
desktopApps: reducers.desktopApps
desktopApps: reducers.desktopApps,
theme: reducers.theme
});
module.exports = createStore(appReducer);

View File

@ -1,3 +1,4 @@
exports.desktopApps = require('./desktop-apps');
exports.profile = require('./profile');
exports.processOpts = require('./process-opts');
exports.theme = require('./theme');

View File

@ -14,6 +14,12 @@ module.exports = function(oldProfile, action) {
case actions.edit.ADD_PROFILE_ITEM:
return addProfileItem(oldProfile, action.newItem, action.targetItem);
case actions.edit.UPDATE_PROFILE_ITEM:
return updateProfileItem(oldProfile, action.item, action.key, action.value);
case actions.edit.SELECT_PROFILE_ITEM:
return selectProfileItem(oldProfile, action.item);
default:
return oldProfile || null;
@ -21,6 +27,19 @@ module.exports = function(oldProfile, action) {
};
function selectProfileItem(oldProfile, item) {
var newProfile = _.cloneDeep(oldProfile);
return newProfile;
}
function updateProfileItem(oldProfile, targetItem, key, value) {
var newProfile = _.cloneDeep(oldProfile);
var result = treeFind(newProfile, targetItem);
result.item[key] = value;
return newProfile;
}
function moveProfileItem(oldProfile, movedItem, targetItem) {
@ -50,6 +69,29 @@ function addProfileItem(oldProfile, newItem, targetItem) {
return newProfile;
}
// Tree manipulation helpers
function treeWalk(branch, func) {
var items = branch.items;
if(!items) return;
for( var i = 0, item = items[i]; (item = items[i]); i++ ) {
var breakHere = func(item, parent);
if(breakHere) return breakHere;
if(item.items) {
breakHere = treeWalk(item, func);
if(breakHere) return breakHere;
}
}
}
function treeFind(branch, obj) {
var items = branch.items;

View File

@ -0,0 +1,14 @@
var actions = require('../actions');
module.exports = function(currentTheme, action) {
switch(action.type) {
case actions.edit.USE_ICON_THEME:
return action.theme;
default:
return currentTheme || null;
}
};