UNPKG

awv3

Version:
106 lines (100 loc) 4.11 kB
import * as THREE from 'three' import omit from 'lodash/omit' import without from 'lodash/without' import { actions as pluginActions } from './plugins' import { actions as connectionActions } from './connections' const scope = 'globals' export const types = { setLocale: `${scope}/setLocale`, setActiveSelection: `${scope}/setActiveSelection`, setActiveConnection: `${scope}/setActiveConnection`, linkPlugins: `${scope}/linkPlugins`, unlinkPlugins: `${scope}/unlinkPlugins`, addResources: `${scope}/addResources`, addMessage: `${scope}/addMessage`, beginTask: `${scope}/beginTask`, finishTask: `${scope}/finishTask`, setCamera: `${scope}/setCamera`, setColors: `${scope}/setColors`, setColorMode: `${scope}/setColorMode`, } export const actions = { setLocale: (locale = 'en_US') => ({ type: types.setLocale, locale }), setActiveSelection: (activeSelection = undefined) => ({ type: types.setActiveSelection, activeSelection }), addResources: resources => ({ type: types.addResources, resources }), linkPlugins: plugins => ({ type: types.linkPlugins, plugins }), unlinkPlugins: plugins => ({ type: types.unlinkPlugins, plugins }), addMessage: (type, message, reset) => ({ type: types.addMessage, type, message, reset }), beginTask: (id, command) => ({ type: types.beginTask, id, command }), finishTask: id => ({ type: types.finishTask, id }), setActiveConnection: (activeConnection = undefined) => dispatch => { dispatch(pluginActions.closeAllFeatures()) activeConnection && dispatch(connectionActions.setActiveFeature(activeConnection, undefined)) dispatch(actions.setActiveSelection()) dispatch({ type: types.setActiveConnection, activeConnection }) }, setCamera: camera => ({ type: types.setCamera, camera }), setColors: values => ({ type: types.setColors, values }), setColorMode: day => ({ type: types.setColorMode, day }), } const originalState = { locale: 'en_US', url: '', activeConnection: undefined, activeSelection: undefined, tasks: {}, resources: {}, plugins: [], day: false, colors: { primary: '#c23369', accent: '#28d79f', text: '#373737', }, camera: 'perspective', } export const reducer = (state = originalState, { type, ...payload }) => { switch (type) { case types.setLocale: case types.setActiveSelection: case types.setActiveConnection: case types.setCamera: return { ...state, ...payload } case types.setColorMode: if (payload !== state.day) { const white = new THREE.Color('#FFFFFF') const inverted = Object.keys(state.colors).reduce( (acc, key) => ({ ...acc, [key]: '#' + white.clone().sub(new THREE.Color(state.colors[key])).offsetHSL(0.5,0,0).getHexString(), }), {}, ) return { ...state, ...payload, colors: inverted } } break case types.setColors: return { ...state, colors: { ...state.colors, ...payload.values } } case types.addResources: return { ...state, resources: { ...state.resources, ...payload.resources } } case types.linkPlugins: return { ...state, plugins: [...state.plugins, ...(Array.isArray(payload.plugins) ? payload.plugins : [payload.plugins])], } case types.unlinkPlugins: return { ...state, plugins: without( state.plugins, ...(Array.isArray(payload.plugins) ? payload.plugins : [payload.plugins]), ), } case types.beginTask: return { ...state, tasks: { ...state.tasks, [payload.id]: payload.command } } case types.finishTask: return { ...state, tasks: omit(state.tasks, payload.id) } default: return state } }