pitaya-launcher/src/store/reducers/profile.js

104 lines
2.5 KiB
JavaScript
Raw Normal View History

2015-09-11 16:25:45 +02:00
var _ = require('lodash');
var actions = require('../actions');
2015-11-03 17:45:37 +01:00
var Tree = require('../../util/tree');
module.exports = function(oldProfile, action) {
var newProfile = oldProfile || { items: [] };
switch(action.type) {
2015-09-17 17:29:59 +02:00
case actions.common.LOAD_PROFILE_SUCCESS:
newProfile = _.cloneDeep(action.profile);
break;
2015-09-11 16:25:45 +02:00
case actions.edit.MOVE_PROFILE_ITEM:
newProfile = moveProfileItem(oldProfile, action.movedItem, action.targetItem);
break;
2015-09-11 16:25:45 +02:00
2015-10-10 18:44:31 +02:00
case actions.edit.REMOVE_PROFILE_ITEM:
newProfile = removeProfileItem(oldProfile, action.removedItem);
break;
2015-10-10 18:44:31 +02:00
2015-09-11 16:25:45 +02:00
case actions.edit.ADD_PROFILE_ITEM:
newProfile = addProfileItem(oldProfile, action.newItem, action.targetItem);
break;
2015-09-11 16:25:45 +02:00
2015-09-16 17:26:56 +02:00
case actions.edit.UPDATE_PROFILE_ITEM:
newProfile = updateProfileItem(oldProfile, action.item, action.key, action.value);
break;
2015-09-16 17:26:56 +02:00
}
return newProfile;
2015-09-11 16:25:45 +02:00
};
2015-11-03 17:45:37 +01:00
function updateProfileItem(profile, targetItem, key, value) {
var tree = new Tree(profile);
var result = tree.find(targetItem);
var itemPath = result.path;
tree.update(itemPath.concat(key), {$set: value});
return tree.getState();
2015-09-16 17:26:56 +02:00
}
2015-11-03 17:45:37 +01:00
function removeProfileItem(profile, removedItem) {
var tree = new Tree(profile);
var result = tree.find(removedItem);
tree.del(result.path);
return tree.getState();
2015-09-16 17:26:56 +02:00
}
2015-11-03 17:45:37 +01:00
function moveProfileItem(profile, movedItem, targetItem) {
2015-10-10 18:44:31 +02:00
2015-11-03 17:45:37 +01:00
var tree = new Tree(profile);
2015-10-10 18:44:31 +02:00
2015-11-03 17:45:37 +01:00
var movedResult = tree.find(movedItem);
var targetResult = tree.find(targetItem);
2015-10-10 18:44:31 +02:00
2015-11-03 17:45:37 +01:00
// Remove item from current location
tree.del(movedResult.path);
2015-09-11 16:25:45 +02:00
2015-11-03 17:45:37 +01:00
var targetPath = targetResult ? targetResult.path : [];
var targetItemsPath = targetPath.concat('items');
2015-09-11 16:25:45 +02:00
2015-11-03 17:45:37 +01:00
// Create "items" collection if not defined on target item
if( !('items' in targetItem) ) {
tree.update(targetItemsPath, {
"$set": []
});
}
2015-09-11 16:25:45 +02:00
2015-11-03 17:45:37 +01:00
// Add moved item to target
tree.update(targetItemsPath, {
"$push": [movedItem]
2015-09-11 16:25:45 +02:00
});
2015-11-03 17:45:37 +01:00
return tree.getState();
2015-09-11 16:25:45 +02:00
}
2015-11-03 17:45:37 +01:00
function addProfileItem(profile, newItem, targetItem) {
2015-09-11 16:25:45 +02:00
2015-11-03 17:45:37 +01:00
var tree = new Tree(profile);
2015-09-11 16:25:45 +02:00
2015-11-03 17:45:37 +01:00
var targetResult = tree.find(targetItem);
var targetPath = targetResult ? targetResult.path : [];
var targetItemsPath = targetPath.concat('items');
2015-09-16 17:26:56 +02:00
2015-11-03 17:45:37 +01:00
// Create "items" collection if not defined on target item
if( !('items' in targetItem) ) {
tree.update(targetItemsPath, {
"$set": []
});
}
2015-09-16 17:26:56 +02:00
2015-11-03 17:45:37 +01:00
// Add moved item to target
tree.update(targetItemsPath, {
"$push": [newItem]
});
2015-09-16 17:26:56 +02:00
2015-11-03 17:45:37 +01:00
return tree.getState();
2015-09-16 17:26:56 +02:00
2015-09-11 16:25:45 +02:00
}