Если делать все правильно, то во-первых вам нужно нормализовать все это дело. Чтобы получился список папок (я рекомендую хранить в хэшмапе id => entity):
folders: {
'123': {
id: 123,
name: 'Inbox',
isSelected: false,
parentId: 123,
visible: false,
},
}
Собственно после этого создание reducer'a превратиться в довольно простую задачу:
function folder(action, state = initialState) {
switch(action.type) {
case OPEN_FOLDER_ACTION:
const nextFolders = _.mapValues(state.folders, folder => {
// Устанавливаем флаг "выбрана" для выбранной папки
if (folder.id === action.targetId) {
return { ...folder, isSelected: true };
}
// Для дочерних папок устанавливаем флаг видимости
if (folder.parentId === action.targetId) {
return { ...folder, visible: true };
}
return folder;
});
return {
...state,
folders: { ...nextFolders },
};
// ...
}
}