add selected Board to settings and solve component rerender

This commit is contained in:
Mario Pesch 2022-09-23 11:31:44 +02:00
parent b212316b0b
commit 4565b4e482
27 changed files with 123 additions and 52 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

View File

@ -43,8 +43,16 @@ class BlocklyWindow extends Component {
componentDidUpdate(props) { componentDidUpdate(props) {
const workspace = Blockly.getMainWorkspace(); const workspace = Blockly.getMainWorkspace();
var xml = this.props.initialXml; var xml = this.props.initialXml;
if (props.selectedBoard !== this.props.selectedBoard) {
// change board
if(!xml) xml = initialXml;
var xmlDom = Blockly.Xml.textToDom(xml);
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);
// var toolbox = workspace.getToolbox();
// workspace.updateToolbox(toolbox.toolboxDef_);
}
// if svg is true, then the update process is done in the BlocklySvg component // if svg is true, then the update process is done in the BlocklySvg component
if (props.initialXml !== xml && !this.props.svg) { if (props.initialXml !== xml && !this.props.svg) {
// guarantees that the current xml-code (this.props.initialXml) is rendered // guarantees that the current xml-code (this.props.initialXml) is rendered
@ -55,7 +63,7 @@ class BlocklyWindow extends Component {
if (props.language !== this.props.language) { if (props.language !== this.props.language) {
// change language // change language
if (!xml) xml = initialXml; if (!xml) xml = initialXml;
var xmlDom = Blockly.Xml.textToDom(xml); xmlDom = Blockly.Xml.textToDom(xml);
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace); Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);
// var toolbox = workspace.getToolbox(); // var toolbox = workspace.getToolbox();
// workspace.updateToolbox(toolbox.toolboxDef_); // workspace.updateToolbox(toolbox.toolboxDef_);
@ -130,12 +138,14 @@ BlocklyWindow.propTypes = {
renderer: PropTypes.string.isRequired, renderer: PropTypes.string.isRequired,
sounds: PropTypes.bool.isRequired, sounds: PropTypes.bool.isRequired,
language: PropTypes.string.isRequired, language: PropTypes.string.isRequired,
selectedBoard: PropTypes.string.isRequired,
}; };
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
renderer: state.general.renderer, renderer: state.general.renderer,
sounds: state.general.sounds, sounds: state.general.sounds,
language: state.general.language, language: state.general.language,
selectedBoard: state.board.board,
}); });
export default connect(mapStateToProps, { onChangeWorkspace, clearStats })( export default connect(mapStateToProps, { onChangeWorkspace, clearStats })(

View File

@ -45,15 +45,11 @@ Blockly.Blocks['sensebox_rgb_led'] = {
Blockly.Blocks['sensebox_ws2818_led_init'] = { Blockly.Blocks['sensebox_ws2818_led_init'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, '1'],
[Blockly.Msg.senseBox_ultrasonic_port_B, '3'], [Blockly.Msg.senseBox_ultrasonic_port_C, '5']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led_init) .appendField(Blockly.Msg.senseBox_ws2818_rgb_led_init)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsRGB), "Port")
this.appendValueInput("BRIGHTNESS", "brightness") this.appendValueInput("BRIGHTNESS", "brightness")
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_brightness)); .appendField((Blockly.Msg.senseBox_ws2818_rgb_led_brightness));
this.appendValueInput("NUMBER", "number") this.appendValueInput("NUMBER", "number")
@ -66,15 +62,11 @@ Blockly.Blocks['sensebox_ws2818_led_init'] = {
Blockly.Blocks['sensebox_ws2818_led'] = { Blockly.Blocks['sensebox_ws2818_led'] = {
init: function () { init: function () {
var dropdownOptions = [[Blockly.Msg.senseBox_ultrasonic_port_A, '1'],
[Blockly.Msg.senseBox_ultrasonic_port_B, '3'], [Blockly.Msg.senseBox_ultrasonic_port_C, '5']];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_ws2818_rgb_led) .appendField(Blockly.Msg.senseBox_ws2818_rgb_led)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port") .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPinsRGB), "Port")
this.appendValueInput("POSITION", "position") this.appendValueInput("POSITION", "position")
.appendField((Blockly.Msg.senseBox_ws2818_rgb_led_position)); .appendField((Blockly.Msg.senseBox_ws2818_rgb_led_position));
this.appendValueInput("COLOR", 'Number') this.appendValueInput("COLOR", 'Number')

View File

@ -101,7 +101,6 @@ Blockly.Arduino.sensebox_phyphox_graph = function () {
Blockly.Arduino.sensebox_phyphox_experiment_send = function () { Blockly.Arduino.sensebox_phyphox_experiment_send = function () {
var branch = Blockly.Arduino.statementToCode(this, "sendValues"); var branch = Blockly.Arduino.statementToCode(this, "sendValues");
var blocks = this.getDescendants(); var blocks = this.getDescendants();
console.log(blocks);
var count = 0; var count = 0;
if (blocks !== undefined) { if (blocks !== undefined) {
for (var i = 0; i < blocks.length; i++) { for (var i = 0; i < blocks.length; i++) {
@ -115,7 +114,6 @@ Blockly.Arduino.sensebox_phyphox_experiment_send = function () {
var string = ""; var string = "";
for (var j = 1; j <= count; j++) { for (var j = 1; j <= count; j++) {
console.log("append");
if (string === "") { if (string === "") {
string += `channel${j}`; string += `channel${j}`;
} else if (string !== "") { } else if (string !== "") {

View File

@ -203,6 +203,5 @@ Blockly.Arduino.sensebox_sd_save_for_osem = function (block) {
Blockly.Arduino.definitions_["SENSOR_ID" + id + ""] = Blockly.Arduino.definitions_["SENSOR_ID" + id + ""] =
"const char SENSOR_ID" + id + '[] PROGMEM = "' + sensor_id + '";'; "const char SENSOR_ID" + id + '[] PROGMEM = "' + sensor_id + '";';
code += "addMeasurement(SENSOR_ID" + id + "," + sensor_value + ");\n"; code += "addMeasurement(SENSOR_ID" + id + "," + sensor_value + ");\n";
console.log(code);
return code; return code;
}; };

View File

@ -1,4 +1,12 @@
import Blockly from "blockly"; import Blockly from "blockly";
//import store from "../../../store";
// preperations for the esp board
// var selectedBoard = store.getState().board.board;
// store.subscribe(() => {
// selectedBoard = store.getState().board.board;
// });
/* Wifi connection and openSenseMap Blocks*/ /* Wifi connection and openSenseMap Blocks*/
Blockly.Arduino.sensebox_wifi = function (block) { Blockly.Arduino.sensebox_wifi = function (block) {
@ -110,3 +118,5 @@ Blockly.Arduino.sensebox_ethernetIp = function () {
var code = "Ethernet.localIP()"; var code = "Ethernet.localIP()";
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };

View File

@ -23,7 +23,6 @@ const setVariableFunction = function (defaultValue) {
.getVariableMap() .getVariableMap()
.getAllVariables(); .getAllVariables();
const myVar = allVars.filter((v) => v.name === variableName)[0]; const myVar = allVars.filter((v) => v.name === variableName)[0];
console.log(myVar);
var code = ""; var code = "";
if (myVar !== undefined) { if (myVar !== undefined) {
Blockly.Arduino.variables_[variableName + myVar.type] = Blockly.Arduino.variables_[variableName + myVar.type] =

View File

@ -23,6 +23,11 @@ const sensebox_mcu = {
["C5", "5"], ["C5", "5"],
["C6", "6"], ["C6", "6"],
], ],
digitalPinsRGB: [
["A", "1"],
["B", "3"],
["C", "5"],
],
digitalPinsButton: [ digitalPinsButton: [
["on Board", "0"], ["on Board", "0"],
["A1", "1"], ["A1", "1"],
@ -131,7 +136,7 @@ const sensebox_mini = {
description: "senseBox Mini", description: "senseBox Mini",
compilerFlag: "arduino:samd", compilerFlag: "arduino:samd",
digitalPins: [ digitalPins: [
["A1", "1"], ["Test", "1"],
["A2", "2"], ["A2", "2"],
["B3", "3"], ["B3", "3"],
["B4", "4"], ["B4", "4"],
@ -148,6 +153,11 @@ const sensebox_mini = {
["C5", "5"], ["C5", "5"],
["C6", "6"], ["C6", "6"],
], ],
digitalPinsRGB: [
["on Board", "7"],
["B", "8"],
["C", "1"],
],
digitalPinsButton: [ digitalPinsButton: [
["on Board", "0"], ["on Board", "0"],
["A1", "1"], ["A1", "1"],
@ -247,7 +257,6 @@ const sensebox_mini = {
var board = sensebox_mcu var board = sensebox_mcu
export const setBoard = (selectedBoard) => { export const setBoard = (selectedBoard) => {
console.log(board)
if (selectedBoard === "mini"){ if (selectedBoard === "mini"){
board = sensebox_mini board = sensebox_mini
} }
@ -258,6 +267,5 @@ export const setBoard = (selectedBoard) => {
export const selectedBoard = () => { export const selectedBoard = () => {
console.log(board)
return board; return board;
}; };

View File

@ -182,7 +182,8 @@ export const UI = {
settings_sounds: "Töne", settings_sounds: "Töne",
settings_sounds_text: settings_sounds_text:
"Aktiviere oder Deaktiviere Töne beim hinzufügen und löschen von Blöcken. Standardmäßig deaktiviert", "Aktiviere oder Deaktiviere Töne beim hinzufügen und löschen von Blöcken. Standardmäßig deaktiviert",
settings_board: "Board",
settings_board_text: "Wähle dein verwendetes Board aus",
/** /**
* 404 * 404
*/ */

View File

@ -176,6 +176,8 @@ export const UI = {
settings_sounds: "Sound", settings_sounds: "Sound",
settings_sounds_text: settings_sounds_text:
"Enable or disable sounds when adding and deleting blocks. Disabled by default", "Enable or disable sounds when adding and deleting blocks. Disabled by default",
settings_board: "Board",
settings_board_text: "Choose your board",
/** /**
* 404 * 404
@ -296,4 +298,11 @@ export const UI = {
codeeditor_blockly_code: "Load blockly code", codeeditor_blockly_code: "Load blockly code",
codeeditor_compile_progress: codeeditor_compile_progress:
"Your code will now be compiled and then downloaded to your computer", "Your code will now be compiled and then downloaded to your computer",
/**
* Device Selction
* */
deviceselection_head: "Which board are you using?",
deviceselection_keep_selection: "Save my choice",
}; };

View File

@ -38,7 +38,6 @@ const CodeEditor = (props) => {
}) })
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
console.log(data);
if (data.code === "Internal Server Error") { if (data.code === "Internal Server Error") {
setProgress(false); setProgress(false);
setOpen(true); setOpen(true);

View File

@ -89,7 +89,6 @@ class Compile extends Component {
}) })
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
console.log(data);
if (data.code === "Internal Server Error") { if (data.code === "Internal Server Error") {
this.setState({ this.setState({
progress: false, progress: false,

View File

@ -27,7 +27,6 @@ const SerialMonitor = () => {
if (value) { if (value) {
// byte array to string: https://stackoverflow.com/a/37542820 // byte array to string: https://stackoverflow.com/a/37542820
const text = String.fromCharCode.apply(null, value); const text = String.fromCharCode.apply(null, value);
console.log(text);
setSerialPortContent((prevContent) => [ setSerialPortContent((prevContent) => [
...prevContent, ...prevContent,
[new Date(), text], [new Date(), text],

View File

@ -7,8 +7,7 @@ import { withStyles } from "@material-ui/core/styles";
import Checkbox from "@material-ui/core/Checkbox"; import Checkbox from "@material-ui/core/Checkbox";
import FormControlLabel from "@material-ui/core/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import ReactMarkdown from "react-markdown"; import { IconButton, Grid, Avatar, Typography } from "@material-ui/core";
import { IconButton, Grid, Avatar } from "@material-ui/core";
import { setBoard } from "../actions/boardAction"; import { setBoard } from "../actions/boardAction";
const styles = (theme) => ({ const styles = (theme) => ({
@ -65,7 +64,6 @@ class DeviceSeclection extends Component {
this.setState({selectedBoard: value}) this.setState({selectedBoard: value})
}; };
render() { render() {
return ( return (
<Dialog <Dialog
@ -76,27 +74,27 @@ class DeviceSeclection extends Component {
title={Blockly.Msg.deviceselection_head} title={Blockly.Msg.deviceselection_head}
content={""} content={""}
onClick={this.toggleDialog} onClick={this.toggleDialog}
button={Blockly.Msg.button_save} button={Blockly.Msg.button_accept}
disabled={this.state.selectedBoard===""} disabled={this.state.selectedBoard===""}
> >
<div> <div>
<Grid container spacing={2} style={{ textAlign : "center" }}> <Grid container spacing={2} style={{ textAlign : "center" }}>
<Grid item xs={4}> <Grid item xs={6}>
<IconButton onClick={(e) => this.onclick(e, "mcu")}> <IconButton onClick={(e) => this.onclick(e, "mcu")}>
<Avatar <Avatar
alt="Sensebox MCU" alt="Sensebox MCU"
src="/media/hardware/senseboxmcu.png" src="/media/hardware/senseboxmcu.png"
style={{ style={{
border: this.state.selectedBoard == "mcu" ? 'medium solid DeepSkyBlue': "0.1px solid lightgray", border: this.state.selectedBoard === "mcu" ? 'medium solid DeepSkyBlue': "0.1px solid lightgray",
width:"20vw", width:"20vw",
height: "20vw" height: "20vw"
}} }}
/> />
</IconButton> </IconButton>
<p>Sensebox MCU</p> <p>senseBox MCU</p>
</Grid> </Grid>
<Grid item xs={4}> {/* <Grid item xs={4}>
<IconButton onClick={(e) => this.onclick(e, "esp")}> <IconButton onClick={(e) => this.onclick(e, "esp")}>
<Avatar <Avatar
alt="Sensebox ESP" alt="Sensebox ESP"
@ -109,20 +107,20 @@ class DeviceSeclection extends Component {
/> />
</IconButton> </IconButton>
<p>Sensebox ESP</p> <p>Sensebox ESP</p>
</Grid> </Grid> */}
<Grid item xs={4}> <Grid item xs={6}>
<IconButton onClick={(e) => this.onclick(e, "mini")}> <IconButton onClick={(e) => this.onclick(e, "mini")}>
<Avatar <Avatar
alt="Sensebox Mini" alt="Sensebox Mini"
src="/media/hardware/senseboxmcu.png" src="/media/hardware/senseboxmcumini.png"
style={{ style={{
border: this.state.selectedBoard == "mini" ? 'medium solid DeepSkyBlue': "0.1px solid lightgray", border: this.state.selectedBoard === "mini" ? 'medium solid DeepSkyBlue': "0.1px solid lightgray",
width:"20vw", width:"20vw",
height: "20vw" height: "20vw"
}} }}
/> />
</IconButton> </IconButton>
<p>Sensebox Mini</p> <p>senseBox MCU:mini</p>
</Grid> </Grid>
</Grid> </Grid>
</div> </div>
@ -141,6 +139,9 @@ class DeviceSeclection extends Component {
} }
label={Blockly.Msg.deviceselection_keep_selection} label={Blockly.Msg.deviceselection_keep_selection}
/> />
<Typography variant="body1" >
Hier kommst du zur alten Blockly Version für den <a href="https://sensebox.github.io/blockly/">Arduino UNO</a> oder die <a href="/">senseBox MCU</a>
</Typography>
</Dialog> </Dialog>
); );
} }

View File

@ -12,7 +12,7 @@ import BlocklyWindow from "./Blockly/BlocklyWindow";
import CodeViewer from "./CodeViewer"; import CodeViewer from "./CodeViewer";
import TrashcanButtons from "./Workspace/TrashcanButtons"; import TrashcanButtons from "./Workspace/TrashcanButtons";
import HintTutorialExists from "./Tutorial/HintTutorialExists"; import HintTutorialExists from "./Tutorial/HintTutorialExists";
import DeviceSelction from "./DeviceSelction"; import DeviceSelection from "./DeviceSelection";
import Grid from "@material-ui/core/Grid"; import Grid from "@material-ui/core/Grid";
import IconButton from "@material-ui/core/IconButton"; import IconButton from "@material-ui/core/IconButton";
@ -187,7 +187,7 @@ class Home extends Component {
</Grid> </Grid>
) : null} ) : null}
</Grid> </Grid>
<DeviceSelction /> <DeviceSelection />
<HintTutorialExists /> <HintTutorialExists />
{this.props.platform ? ( {this.props.platform ? (
<Dialog <Dialog

View File

@ -0,0 +1,55 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { setBoard } from '../../actions/boardAction';
import * as Blockly from 'blockly/core';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';
import Typography from '@material-ui/core/Typography';
import FormHelperText from '@material-ui/core/FormHelperText';
class DeviceSelector extends Component {
componentDidMount(){
// Ensure that Blockly.setLocale is adopted in the component.
// Otherwise, the text will not be displayed until the next update of the component.
this.forceUpdate();
}
render(){
return(
<div>
<Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_board}</Typography>
<FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_board_text}</FormHelperText>
<FormControl>
<InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_board}</InputLabel>
<Select
labelId="demo-simple-select-label"
id="demo-simple-select"
value={this.props.selectedBoard}
onChange={(e) => this.props.setBoard(e.target.value)}
>
<MenuItem value="mcu">senseBox MCU</MenuItem>
<MenuItem value="mini">senseBox MCU mini</MenuItem>
</Select>
</FormControl>
</div>
);
}
}
DeviceSelector.propTypes = {
setBoard: PropTypes.func.isRequired,
selectedBoard: PropTypes.string.isRequired
};
const mapStateToProps = state => ({
selectedBoard: state.board.board
});
export default connect(mapStateToProps, { setBoard })(DeviceSelector);

View File

@ -12,6 +12,7 @@ import RenderSelector from "./RenderSelector";
import StatsSelector from "./StatsSelector"; import StatsSelector from "./StatsSelector";
import OtaSelector from "./OtaSelector"; import OtaSelector from "./OtaSelector";
import SoundsSelector from "./SoundsSelector"; import SoundsSelector from "./SoundsSelector";
import DeviceSelector from "./DeviceSelector";
import Button from "@material-ui/core/Button"; import Button from "@material-ui/core/Button";
import Paper from "@material-ui/core/Paper"; import Paper from "@material-ui/core/Paper";
@ -52,6 +53,9 @@ class Settings extends Component {
<Paper style={{ margin: "10px 0px", padding: "10px" }}> <Paper style={{ margin: "10px 0px", padding: "10px" }}>
<SoundsSelector /> <SoundsSelector />
</Paper> </Paper>
<Paper style={{ margin: "10px 0px", padding: "10px" }}>
<DeviceSelector />
</Paper>
<Button <Button
style={{ marginTop: "10px" }} style={{ marginTop: "10px" }}

View File

@ -304,7 +304,6 @@ class Builder extends Component {
newTutorial.append(`steps[${i}][xml]`, step.xml); newTutorial.append(`steps[${i}][xml]`, step.xml);
} }
}); });
console.log(newTutorial);
return newTutorial; return newTutorial;
} }
}; };

View File

@ -34,13 +34,11 @@ const styles = (theme) => ({
class Difficulty extends Component { class Difficulty extends Component {
ratingChanged = (newRating) => { ratingChanged = (newRating) => {
console.log(newRating);
this.handleChange(newRating); this.handleChange(newRating);
}; };
handleChange = (e) => { handleChange = (e) => {
var value = e; var value = e;
console.log(value);
if (this.props.property === "difficulty") { if (this.props.property === "difficulty") {
this.props.tutorialDifficulty(value); this.props.tutorialDifficulty(value);
} else if (this.props.property === "json") { } else if (this.props.property === "json") {

View File

@ -44,7 +44,6 @@ const MarkdownEditor = (props) => {
headers: { "Content-Type": "multipart/form-data" }, headers: { "Content-Type": "multipart/form-data" },
}) })
.then((res) => { .then((res) => {
console.log(res);
resolve( resolve(
`${process.env.REACT_APP_BLOCKLY_API}/upload/` + res.data.filename `${process.env.REACT_APP_BLOCKLY_API}/upload/` + res.data.filename
); );

View File

@ -36,7 +36,6 @@ const styles = (theme) => ({
class Public extends Component { class Public extends Component {
handleChange = (e) => { handleChange = (e) => {
var value = e.target.checked; var value = e.target.checked;
console.log(value);
if (this.props.property === "public") { if (this.props.property === "public") {
this.props.tutorialPublic(value); this.props.tutorialPublic(value);
} else if (this.props.property === "json") { } else if (this.props.property === "json") {

View File

@ -147,7 +147,6 @@ class TutorialHome extends Component {
if (this.props.message.id === "GET_TUTORIALS_FAIL") { if (this.props.message.id === "GET_TUTORIALS_FAIL") {
alert(this.props.message.msg); alert(this.props.message.msg);
} }
console.log(this.props.user);
} }
componentWillUnmount() { componentWillUnmount() {

View File

@ -50,7 +50,6 @@ export class Login extends Component {
} }
// Check for login error // Check for login error
else if (message.id === "LOGIN_FAIL") { else if (message.id === "LOGIN_FAIL") {
console.log("login fail");
this.setState({ this.setState({
email: "", email: "",
password: "", password: "",

View File

@ -37,7 +37,6 @@ class AutoSave extends Component {
}; };
componentDidMount() { componentDidMount() {
console.log(this.props.xml);
} }
componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {

View File

@ -89,7 +89,6 @@ class Compile extends Component {
}) })
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
console.log(data);
if (data.code === "Internal Server Error") { if (data.code === "Internal Server Error") {
this.setState({ this.setState({
progress: false, progress: false,

View File

@ -15,9 +15,6 @@ import DeleteProject from "./DeleteProject";
import CopyCode from "./CopyCode"; import CopyCode from "./CopyCode";
import AutoSave from "./AutoSave"; import AutoSave from "./AutoSave";
class WorkspaceFunc extends Component { class WorkspaceFunc extends Component {
componentDidUpdate() {
console.log(this.props.autosave);
}
render() { render() {
return ( return (

View File

@ -2,9 +2,9 @@ import { BOARD } from '../actions/types';
const initialValue = () => { const initialValue = () => {
if (window.localStorage.getItem("board")) { if (window.localStorage.getItem("board")) {
return window.localStorage.getItem("locale"); return window.localStorage.getItem("board");
} }
return ""; return "bla";
}; };
const initialState = { const initialState = {