awv3
Version:
⚡ AWV3 embedded CAD
106 lines (100 loc) • 4.11 kB
JavaScript
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
}
}