awv3
Version:
⚡ AWV3 embedded CAD
56 lines (50 loc) • 2.24 kB
JavaScript
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;