blob: 6af5d2cbac5c70bb68065aff2fd4a1c2a3d9e4ce [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import ActionTypes from './actiontypes';
const initialState = {
isMinimized: true,
activeLink: null,
version: null,
navLinks: [],
footerNavLinks: [],
bottomNavLinks: [],
navBarVisible: true,
loginSectionVisible: false,
loginVisibleInsteadOfLogout: true
};
function addLink(state, link) {
const newState = { ...state };
if (link.top && !link.bottomNav) {
newState.navLinks = [].concat(newState.navLinks);
newState.navLinks.unshift(link);
return newState;
}
if (link.top && link.bottomNav) {
newState.bottomNavLinks = [].concat(newState.bottomNavLinks);
newState.bottomNavLinks.unshift(link);
return newState;
}
if (link.bottomNav) {
newState.bottomNavLinks = [].concat(newState.bottomNavLinks);
newState.bottomNavLinks.push(link);
return newState;
}
if (link.footerNav) {
newState.footerNavLinks = [].concat(newState.footerNavLinks);
newState.footerNavLinks.push(link);
return newState;
}
newState.navLinks = [].concat(newState.navLinks);
newState.navLinks.push(link);
return newState;
}
function removeLink (state, removeLink) {
const {links, sectionName} = getLinkSection(state, removeLink);
// create new array without the link to remove
const newLinks = links.filter(link => link.id !== removeLink.id);
if (newLinks.length === links.length) {
return state;
}
const newState = { ...state };
newState[sectionName] = newLinks;
return newState;
}
function updateLink (state, link) {
const {links, sectionName} = getLinkSection(state, link);
// create new array and updates the link when found
let found = false;
const newLinks = links.map(el => {
if (el.id === link.id) {
found = true;
return {
...el,
title: link.title,
href: link.href
};
}
return el;
});
if (!found) {
return state;
}
const newState = { ...state };
newState[sectionName] = newLinks;
return newState;
}
function setLinkBadgeVisible (state, link, visible) {
const {links, sectionName} = getLinkSection(state, link);
let found = false;
const newLinks = links.map(el => {
if (el.title === link.title) {
found = true;
return {
...el,
badge: visible
};
}
return el;
});
if (!found) {
return state;
}
const newState = { ...state };
newState[sectionName] = newLinks;
return newState;
}
function getLinkSection (state, link) {
let links = state.navLinks;
let sectionName = 'navLinks';
if (link.bottomNav) {
links = state.bottomNavLinks;
sectionName = 'bottomNavLinks';
}
if (link.footerNav) {
links = state.footerNavLinks;
sectionName = 'footerNavLinks';
}
return { links, sectionName };
}
export default function navigation(state = initialState, action) {
switch (action.type) {
case ActionTypes.ADD_NAVBAR_LINK:
return addLink(state, action.link);
case ActionTypes.TOGGLE_NAVBAR_MENU:
return {
...state,
isMinimized: !state.isMinimized
};
case ActionTypes.UPDATE_NAVBAR_LINK:
return updateLink(state, action.link);
case ActionTypes.REMOVE_NAVBAR_LINK:
return removeLink(state, action.link);
case ActionTypes.SHOW_NAVBAR_LINK_BADGE:
return setLinkBadgeVisible(state, action.link, true);
case ActionTypes.HIDE_NAVBAR_LINK_BADGE:
return setLinkBadgeVisible(state, action.link, false);
case ActionTypes.NAVBAR_SET_VERSION_INFO:
return {
...state,
version: action.version
};
case ActionTypes.NAVBAR_ACTIVE_LINK:
return {
...state,
activeLink: action.name
};
case ActionTypes.NAVBAR_HIDE:
return {
...state,
navBarVisible: false
};
case ActionTypes.NAVBAR_SHOW:
return {
...state,
navBarVisible: true
};
case ActionTypes.NAVBAR_SHOW_HIDE_LOGIN_LOGOUT_SECTION:
return {
...state,
loginSectionVisible: action.visible
};
case ActionTypes.NAVBAR_SHOW_LOGIN_BUTTON:
return {
...state,
loginSectionVisible: true,
loginVisibleInsteadOfLogout: true
};
case ActionTypes.NAVBAR_SHOW_LOGOUT_BUTTON:
return {
...state,
loginSectionVisible: true,
loginVisibleInsteadOfLogout: false
};
default:
return state;
}
}