You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.5 KiB
59 lines
1.5 KiB
// @flow
|
|
|
|
import { handleActions } from 'redux-actions'
|
|
|
|
import type { Device, Devices } from 'types/common'
|
|
|
|
export type DevicesState = {
|
|
currentDevice: Device | null,
|
|
devices: Devices,
|
|
}
|
|
|
|
const state: DevicesState = {
|
|
currentDevice: null,
|
|
devices: [],
|
|
}
|
|
|
|
function setCurrentDevice(state) {
|
|
return {
|
|
...state,
|
|
currentDevice: state.devices.length === 1 ? state.devices[0] : state.currentDevice,
|
|
}
|
|
}
|
|
|
|
const handlers: Object = {
|
|
UPDATE_DEVICES: (state: DevicesState, { payload: devices }: { payload: Devices }) =>
|
|
setCurrentDevice({
|
|
...state,
|
|
devices,
|
|
}),
|
|
ADD_DEVICE: (state: DevicesState, { payload: device }: { payload: Device }) =>
|
|
setCurrentDevice({
|
|
...state,
|
|
devices: [...state.devices, device].filter(
|
|
(v, i, s) => s.findIndex(t => t.path === v.path) === i,
|
|
),
|
|
}),
|
|
REMOVE_DEVICE: (state: DevicesState, { payload: device }: { payload: Device }) => ({
|
|
...state,
|
|
currentDevice:
|
|
state.currentDevice !== null && state.currentDevice.path === device.path
|
|
? null
|
|
: state.currentDevice,
|
|
devices: state.devices.filter(d => d.path !== device.path),
|
|
}),
|
|
SET_CURRENT_DEVICE: (state: DevicesState, { payload: currentDevice }: { payload: Device }) => ({
|
|
...state,
|
|
currentDevice,
|
|
}),
|
|
}
|
|
|
|
export function getCurrentDevice(state: { devices: DevicesState }) {
|
|
return state.devices.currentDevice
|
|
}
|
|
|
|
export function getDevices(state: { devices: DevicesState }) {
|
|
return state.devices.devices
|
|
}
|
|
|
|
export default handleActions(handlers, state)
|
|
|