implement test VCO redux state and actions

This commit is contained in:
[poww10s]
2020-11-17 23:14:32 -05:00
parent 021734f6e1
commit 813b00a79d
5 changed files with 95 additions and 11 deletions
+10 -8
View File
@@ -1,17 +1,19 @@
import React from 'react'; import React from 'react';
import logo from './logo.svg'; import logo from './logo.svg';
import { Counter } from './features/counter/Counter'; import { Counter } from './features/counter/Counter';
import { Timbre } from './features/timbre/Timbre';
import './App.css'; import './App.css';
function App() { function App() {
return ( return (
<div className="App"> <div className="App">
<header className="App-header"> <header className="App-header">
<img src={logo} className="App-logo" alt="logo" /> <img src={logo} className="App-logo" alt="logo" />
<Counter /> <Counter />
</header> <Timbre />
</div> </header>
); </div>
);
} }
export default App; export default App;
+5 -3
View File
@@ -1,8 +1,10 @@
import { configureStore } from '@reduxjs/toolkit'; import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice'; import counterReducer from '../features/counter/counterSlice';
import timbreReducer from '../features/timbre/timbreSlice';
export default configureStore({ export default configureStore({
reducer: { reducer: {
counter: counterReducer, counter: counterReducer,
}, timbre: timbreReducer,
},
}); });
+6
View File
@@ -0,0 +1,6 @@
import React from 'react';
import VCO from './parameters/VCO';
export function Timbre(props) {
return <VCO id="vco1" />;
}
+42
View File
@@ -0,0 +1,42 @@
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { selectById, parameterUpdated } from '../timbreSlice.js';
export default function VCO(props) {
const parameters = useSelector((state) => selectById(state, props.id));
const dispatch = useDispatch();
return (
<div>
<span>Current Waveform {parameters.waveform} </span>
<button
aria-label="Increment value"
onClick={() =>
dispatch(
parameterUpdated({
id: 'vco1',
changes: { waveform: 'Triangle' },
})
)
}>
{' '}
Set Waveform to Triangle{' '}
</button>
<span>Current Mod Value {parameters.mod} </span>
<input
type="range"
min="0"
max="100"
value={parameters.mod}
onChange={(e) =>
dispatch(
parameterUpdated({
id: 'vco1',
changes: { mod: e.target.value },
})
)
}
/>
</div>
);
}
+32
View File
@@ -0,0 +1,32 @@
import { createSlice, createEntityAdapter } from '@reduxjs/toolkit';
const timbreAdapter = createEntityAdapter({});
const timbreSlice = createSlice({
name: 'timbre',
initialState: timbreAdapter.getInitialState({
ids: ['vco1'],
entities: {
vco1: {
id: 'vco1',
waveform: 'Saw',
mod: 0,
},
},
}),
reducers: {
parameterAdded: timbreAdapter.addOne,
parameterUpdated: timbreAdapter.updateOne,
},
});
export const {
selectById,
selectAll,
selectEntities,
selectIds,
} = timbreAdapter.getSelectors((state) => state.timbre);
export const { parameterAdded, parameterUpdated } = timbreSlice.actions;
export default timbreSlice.reducer;