UNPKG

awv3

Version:
56 lines (50 loc) 2.24 kB
import { mixin } from '../lifecycle'; const scope = 'plugins'; export const base = mixin(scope, plugin); export const types = { ...base.types, enable: `${scope}/enable`, toggle: `${scope}/toggle`, collapse: `${scope}/collapse`, toggleCollapse: `${scope}/toggleCollapse`, addElement: `${scope}/addElement`, removeElement: `${scope}/removeElement`, removeAllElements: `${scope}/removeAllElements`, closeAllFeatures: `${scope}/closeAllFeatures` }; export const actions = { ...base.actions, enable: (id, enabled) => ({ type: types.enable, id, enabled }), toggle: id => ({ type: types.toggle, id }), collapse: (id, collapsed) => dispatch => requestAnimationFrame(() => dispatch({ type: types.collapse, id })), toggleCollapse: id => dispatch => requestAnimationFrame(() => dispatch({ type: types.toggleCollapse, id })), addElement: (id, element) => ({ type: types.addElement, id, element }), removeElement: (id, element) => ({ type: types.removeElement, id, element }), removeAllElements: id => ({ type: types.removeAllElements, id }), closeAllFeatures: () => dispatch => Object.values(base.references).forEach(plugin => plugin.feature && dispatch(actions.unregister(plugin.id))) }; function plugin(state, { type, ...payload }) { switch (type) { case types.enable: return { ...state, enabled: payload.enabled, collapsed: !payload.enabled ? true : state.collapsed }; case types.toggle: return { ...state, enabled: !state.enabled, collapsed: state.enabled ? true : state.collapsed }; case types.collapse: return { ...state, collapsed: payload.collapsed }; case types.toggleCollapse: return { ...state, collapsed: !state.collapsed }; case types.addElement: return { ...state, elements: [...state.elements, payload.element] }; case types.removeElement: return { ...state, elements: state.elements.filter(item => item !== payload.element) }; case types.removeAllElements: return { ...state, elements: [] }; default: return state; } } export const reducer = base.reducer;