diff --git a/src/renderer/store/localStorage.ts b/src/renderer/store/localStorage.ts index 877768f3..39c7b1a4 100644 --- a/src/renderer/store/localStorage.ts +++ b/src/renderer/store/localStorage.ts @@ -6,6 +6,7 @@ import { initialState as inputState } from '@/renderer/store/modules/input'; import { initialState as debugTabState } from '@/renderer/store/modules/debugTab'; import { initialState as launchFilesState } from '@/renderer/store/modules/launchFiles'; import { initialState as armPresetsState } from '@/renderer/store/modules/armPresets'; +import { initialState as gpioPinsState } from '@/renderer/store/modules/gpioPins'; import { log } from '@/renderer/logger'; export const defaultState: GlobalState = { @@ -15,6 +16,7 @@ export const defaultState: GlobalState = { debugTab: debugTabState, launchFiles: launchFilesState, armPresets: armPresetsState, + gpioPins: gpioPinsState, }; // WARN diff --git a/src/renderer/store/modules/gpioPins.ts b/src/renderer/store/modules/gpioPins.ts new file mode 100644 index 00000000..1312c340 --- /dev/null +++ b/src/renderer/store/modules/gpioPins.ts @@ -0,0 +1,52 @@ +import { GlobalState } from '@/renderer/store/store'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { nanoid } from 'nanoid'; + +export interface GpioPinsState { + id: string; + name: string; + topicName: string; + isOn: boolean; +} + +export const initialState: GpioPinsState[] = [ + { + id: nanoid(), + name: 'LED 1', + topicName: '', + isOn: false, + }, + { + id: nanoid(), + name: 'LED 2', + topicName: '', + isOn: false, + }, + { + id: nanoid(), + name: 'LED 3', + topicName: '', + isOn: false, + }, +]; + +export const gpioPinsSlice = createSlice({ + name: 'gpioPins', + initialState, + reducers: { + togglePin: (state, { payload }: PayloadAction) => { + const element = state.find((element) => element.id === payload); + if (element) { + element.isOn = !element.isOn; + } + }, + addPin: (state, { payload }: PayloadAction) => { + state.push(payload); + }, + removePin: (state, { payload }: PayloadAction) => { + state = state.filter((pin) => pin.id !== payload.id); + }, + }, +}); + +export const selectAllPins = (state: GlobalState) => state.gpioPins; diff --git a/src/renderer/store/store.ts b/src/renderer/store/store.ts index a9146456..1702c582 100644 --- a/src/renderer/store/store.ts +++ b/src/renderer/store/store.ts @@ -11,6 +11,7 @@ import { configureStore, AnyAction, combineReducers } from '@reduxjs/toolkit'; import { throttle } from 'lodash'; import { launchFilesSlice } from './modules/launchFiles'; import { armPresetsSlice } from './modules/armPresets'; +import { gpioPinsSlice } from './modules/gpioPins'; const appReducer = combineReducers({ feed: feedSlice.reducer, @@ -19,6 +20,7 @@ const appReducer = combineReducers({ debugTab: debugTabSlice.reducer, launchFiles: launchFilesSlice.reducer, armPresets: armPresetsSlice.reducer, + gpioPins: gpioPinsSlice.reducer, }); export type GlobalState = ReturnType;