Merge pull request #203 from sensebox/development-featSensorWiki
sensorwiki with tabs and only one request
This commit is contained in:
commit
77b338ffb6
@ -14,6 +14,7 @@
|
||||
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
||||
"@fortawesome/react-fontawesome": "^0.1.19",
|
||||
"@material-ui/core": "^4.12.4",
|
||||
"@material-ui/lab": "^4.0.0-alpha.61",
|
||||
"@monaco-editor/react": "^4.3.1",
|
||||
"@testing-library/jest-dom": "^5.16.1",
|
||||
"@testing-library/react": "^12.1.2",
|
||||
@ -41,6 +42,7 @@
|
||||
"reactour": "^1.18.7",
|
||||
"redux": "^4.2.0",
|
||||
"redux-thunk": "^2.4.1",
|
||||
"rehype-raw": "^6.1.1",
|
||||
"remark-gemoji": "^7.0.1",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"styled-components": "^4.4.1",
|
||||
|
18
src/actions/sensorwikiActions.js
Normal file
18
src/actions/sensorwikiActions.js
Normal file
@ -0,0 +1,18 @@
|
||||
import axios from 'axios'
|
||||
|
||||
const fetchSensorWikiSuccess = sensors => ({
|
||||
type: 'FETCH_SENSORWIKI_SUCCESS',
|
||||
payload: { sensors }
|
||||
})
|
||||
|
||||
export const fetchSensors = () => {
|
||||
return async dispatch => {
|
||||
try {
|
||||
let sensors = await axios.get('https://api.sensors.wiki/sensors/all')
|
||||
dispatch(fetchSensorWikiSuccess(sensors.data))
|
||||
}
|
||||
catch(e){
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
}
|
@ -20,9 +20,15 @@ export const onChangeCode = () => (dispatch, getState) => {
|
||||
if (selectedBlock !== null) {
|
||||
code.helpurl = selectedBlock.helpUrl
|
||||
code.tooltip = selectedBlock.tooltip
|
||||
if (selectedBlock.data) {
|
||||
code.data = selectedBlock.data
|
||||
} else {
|
||||
code.data = null
|
||||
}
|
||||
} else if (selectedBlock === null) {
|
||||
code.tooltip = Blockly.Msg.tooltip_hint
|
||||
code.helpurl = ''
|
||||
code.data = null
|
||||
}
|
||||
|
||||
|
||||
|
@ -26,6 +26,7 @@ Blockly.Blocks["sensebox_sensor_temp_hum"] = {
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_temp_hum_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_temp_hum_helpurl);
|
||||
this.data = {name: "hdc1080", connection: "I2C"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -51,6 +52,7 @@ Blockly.Blocks["sensebox_sensor_uv_light"] = {
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_uv_light_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_uv_light_helpurl);
|
||||
this.data = {name: "veml6070"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -91,6 +93,7 @@ Blockly.Blocks["sensebox_sensor_bmx055_accelerometer"] = {
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_bmx055_accelerometer_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_bmx055_helpurl);
|
||||
this.data = {name: "bmx055"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -122,6 +125,7 @@ Blockly.Blocks["sensebox_sensor_sds011"] = {
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_sds011_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_sds011_helpurl);
|
||||
this.data = {name: "sds011"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -155,6 +159,7 @@ Blockly.Blocks["sensebox_sensor_pressure"] = {
|
||||
this.setOutput(true, Types.DECIMAL.typeName);
|
||||
this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl);
|
||||
this.data = {name: "bmp280"};
|
||||
this.getField("NAME").setValidator(
|
||||
function (val) {
|
||||
this.updateShape_(val === "Altitude");
|
||||
@ -201,6 +206,7 @@ Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_bme_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_bme680_helpurl);
|
||||
this.data = {name: "bme680"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -245,6 +251,7 @@ Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = {
|
||||
this.setOutput(true, Types.NUMBER.typeName);
|
||||
this.setTooltip(Blockly.Msg.senseBox_ultrasonic_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_ultrasonic_helpurl);
|
||||
this.data = {name: "hc-sr04"};
|
||||
},
|
||||
/**
|
||||
* Parse XML to restore the number of pins available.
|
||||
@ -382,6 +389,7 @@ Blockly.Blocks["sensebox_scd30"] = {
|
||||
this.setColour(getColour().sensebox);
|
||||
this.setTooltip(Blockly.Msg.senseBox_scd_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_scd_helpurl);
|
||||
this.data = {name: "scd30"};
|
||||
},
|
||||
onchange: function (e) {
|
||||
var dropdown = this.getFieldValue("dropdown");
|
||||
@ -448,6 +456,7 @@ Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
|
||||
this.setOutput(true, Types.NUMBER.typeName);
|
||||
this.setTooltip(Blockly.Msg.senseBox_smt50_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_smt50_helpurl);
|
||||
this.data = {name: "smt50"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -470,6 +479,7 @@ Blockly.Blocks["sensebox_sensor_watertemperature"] = {
|
||||
.appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
|
||||
this.setOutput(true, Types.NUMBER.typeName);
|
||||
this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip);
|
||||
this.data = {name: "ds18b20"};
|
||||
},
|
||||
};
|
||||
|
||||
@ -542,6 +552,7 @@ Blockly.Blocks["sensebox_sensor_dps310"] = {
|
||||
this.setOutput(true, Types.DECIMAL.typeName);
|
||||
this.setTooltip(Blockly.Msg.senseBox_sensor_dps310_tooltip);
|
||||
this.setHelpUrl(Blockly.Msg.senseBox_sensor_dps310_helpurl);
|
||||
this.data = {name: "dps310"};
|
||||
this.getField("NAME").setValidator(
|
||||
function (val) {
|
||||
this.updateShape_(val === "Altitude");
|
||||
|
@ -9,10 +9,10 @@ Blockly.Blocks["variables_set_dynamic"] = {
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.appendValueInput("VALUE")
|
||||
.appendField("set", "set")
|
||||
.appendField("", "type")
|
||||
.appendField(Blockly.Msg.variables_set, Blockly.Msg.variables_set)
|
||||
// .appendField("", "type")
|
||||
.appendField(new Blockly.FieldVariable("VAR"), "VAR")
|
||||
.appendField("to");
|
||||
.appendField(Blockly.Msg.variables_to);
|
||||
},
|
||||
onchange: function (e) {
|
||||
let variableID = this.getFieldValue("VAR");
|
||||
|
@ -19,10 +19,12 @@ export const UI = {
|
||||
variable_DECIMAL: "Kommazahl (float)",
|
||||
variables_TEXT: "Text (string)",
|
||||
variables_ARRAY: "Array (array)",
|
||||
variables_CHARACTER: "char (char)",
|
||||
variables_CHARACTER: "Buchstabe (char)",
|
||||
variables_BOOLEAN: "Boolean (boolean)",
|
||||
variables_NULL: "void (void)",
|
||||
variables_UNDEF: "undefined",
|
||||
variables_set: "Schreibe",
|
||||
variables_to: "",
|
||||
|
||||
/**
|
||||
* Tooltips
|
||||
@ -150,6 +152,7 @@ export const UI = {
|
||||
button_next: "nächster Schritt",
|
||||
button_tutorial_overview: "Tutorial Übersicht",
|
||||
button_login: "Anmelden",
|
||||
button_createVariable: "Typisierte Variable erstellen",
|
||||
|
||||
/**
|
||||
*
|
||||
@ -311,5 +314,15 @@ export const UI = {
|
||||
deviceselection_head: "Welches Board benutzt du?",
|
||||
deviceselection_keep_selection: "Speichere meine Auswahl fürs nächste Mal (Du kannst das Board später in den Einstellungen wechseln)",
|
||||
deviceselection_footnote: "Hier kommst du zur alten Blockly Version für den ",
|
||||
deviceselection_footnote_02: "oder die"
|
||||
deviceselection_footnote_02: "oder die",
|
||||
|
||||
/**
|
||||
* Sensor Markdown Information
|
||||
*/
|
||||
sensorinfo_info: "Informationen zum Sensor",
|
||||
sensorinfo_description: "Beschreibung",
|
||||
sensorinfo_measurable_phenos: "Messbare Phänomene",
|
||||
sensorinfo_manufacturer: "Hersteller",
|
||||
sensorinfo_lifetime: "Lebensdauer",
|
||||
sensorinfo_explanation: "Diese Informationen wurden aus [sensors.wiki](https://sensors.wiki) entnommen. Für weitere Informationen besuchen Sie den Abschnitt über diesen Sensor "
|
||||
};
|
||||
|
@ -15,14 +15,16 @@ export const UI = {
|
||||
toolbox_motors: "Motors",
|
||||
variable_NUMBER: "Number (int)",
|
||||
variable_SHORT_NUMBER: "char",
|
||||
variable_LONG: " Zahl (long)",
|
||||
variable_LONG: "Big number (long)",
|
||||
variable_DECIMAL: "Decimal (float)",
|
||||
variables_TEXT: "Text (string)",
|
||||
variables_ARRAY: "Array (array)",
|
||||
variables_CHARACTER: "char (char)",
|
||||
variables_CHARACTER: "Character (char)",
|
||||
variables_BOOLEAN: "Boolean (boolean)",
|
||||
variables_NULL: "void (void)",
|
||||
variables_UNDEF: "undefined",
|
||||
variables_set: "set",
|
||||
variables_to: "to",
|
||||
|
||||
/**
|
||||
* Tooltips
|
||||
@ -145,6 +147,7 @@ export const UI = {
|
||||
button_next: "Next step",
|
||||
button_tutorial_overview: "Tutorial overview",
|
||||
button_login: "Login",
|
||||
button_createVariable: "Create Typed Variable",
|
||||
|
||||
/**
|
||||
*
|
||||
@ -300,13 +303,21 @@ export const UI = {
|
||||
codeeditor_compile_progress:
|
||||
"Your code will now be compiled and then downloaded to your computer",
|
||||
|
||||
/**
|
||||
* Device Selction
|
||||
* */
|
||||
/**
|
||||
* Device Selction
|
||||
* */
|
||||
deviceselection_head: "Which board are you using?",
|
||||
deviceselection_keep_selection: "Save my choice (You can change the board later in the settings)",
|
||||
deviceselection_footnote: "Here you can access the old blockly Version for the",
|
||||
deviceselection_footnote_02: "or the",
|
||||
|
||||
|
||||
/**
|
||||
* Sensor Markdown Information
|
||||
* */
|
||||
sensorinfo_info: "Informationen regarding the Sensor",
|
||||
sensorinfo_description: "Description",
|
||||
sensorinfo_measurable_phenos: "Measurable Phenomena",
|
||||
sensorinfo_manufacturer: "Manufacturer",
|
||||
sensorinfo_lifetime: "Lifetime",
|
||||
sensorinfo_explanation: "This information was fetched from [sensors.wiki](https://sensors.wiki). For more information visit the section on this sensor ",
|
||||
};
|
||||
|
@ -16,7 +16,6 @@ class Toolbox extends React.Component {
|
||||
this.props.workspace,
|
||||
"callbackName",
|
||||
[
|
||||
[`${Blockly.Msg.variable_SHORT_NUMBER}`, "char"],
|
||||
[`${Blockly.Msg.variable_NUMBER}`, "int"],
|
||||
[`${Blockly.Msg.variable_LONG}`, "long"],
|
||||
[`${Blockly.Msg.variable_DECIMAL}`, "float"],
|
||||
@ -33,7 +32,7 @@ class Toolbox extends React.Component {
|
||||
|
||||
// Add your button and give it a callback name.
|
||||
const button = document.createElement("button");
|
||||
button.setAttribute("text", "Create Typed Variable");
|
||||
button.setAttribute("text", Blockly.Msg.button_createVariable);
|
||||
button.setAttribute("callbackKey", "callbackName");
|
||||
|
||||
xmlList.push(button);
|
||||
@ -41,6 +40,7 @@ class Toolbox extends React.Component {
|
||||
// This gets all the variables that the user creates and adds them to the
|
||||
// flyout.
|
||||
const blockList = Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace);
|
||||
console.log(blockList);
|
||||
xmlList = xmlList.concat(blockList);
|
||||
return xmlList;
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import Button from "@material-ui/core/Button";
|
||||
import Typography from "@material-ui/core/Typography";
|
||||
import * as Blockly from "blockly";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
import rehypeRaw from "rehype-raw";
|
||||
import Container from "@material-ui/core/Container";
|
||||
import ExpansionPanel from "@material-ui/core/ExpansionPanel";
|
||||
import ExpansionPanelSummary from "@material-ui/core/ExpansionPanelSummary";
|
||||
@ -61,6 +62,7 @@ class Faq extends Component {
|
||||
className="news"
|
||||
allowDangerousHtml="true"
|
||||
children={object.answer}
|
||||
rehypePlugins={[rehypeRaw]}
|
||||
></ReactMarkdown>
|
||||
</Typography>
|
||||
</ExpansionPanelDetails>
|
||||
|
77
src/components/SensorInfo.js
Normal file
77
src/components/SensorInfo.js
Normal file
@ -0,0 +1,77 @@
|
||||
import React from "react";
|
||||
import Box from "@material-ui/core/Box";
|
||||
import Tab from "@material-ui/core/Tab";
|
||||
import TabContext from "@material-ui/lab/TabContext";
|
||||
import TabList from "@material-ui/lab/TabList";
|
||||
import TabPanel from "@material-ui/lab/TabPanel";
|
||||
import store from "../store";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
import * as Blockly from "blockly";
|
||||
|
||||
|
||||
export default function LabTabs() {
|
||||
const [value, setValue] = React.useState('1');
|
||||
|
||||
const handleChange = (event, newValue) => {
|
||||
setValue(newValue);
|
||||
};
|
||||
|
||||
// get the description in the current language if no lang is give return english or the first one
|
||||
function filterLanguage(options) {
|
||||
var lang;
|
||||
if (window.localStorage.getItem("locale")) {
|
||||
lang = window.localStorage.getItem("locale").split("_")[0];
|
||||
}
|
||||
else {
|
||||
lang = "en";
|
||||
}
|
||||
for (var i = 0; i < options.length; i++) {
|
||||
if (options[i].languageCode === lang) {
|
||||
return options[i].text;
|
||||
}
|
||||
}
|
||||
return options[0].text;
|
||||
}
|
||||
var currentStore = store.getState();
|
||||
// ALL SENSOR DATA FROM WIKI
|
||||
var sensorData = currentStore.sensorwiki;
|
||||
// NAME OF SELECTED BLOCK
|
||||
var sensorName = currentStore.workspace.code.data.name;
|
||||
// SEARCH ALL DATA FOR SELECTED BLOCK NAME
|
||||
var sensorInfo = sensorData.find(function (element) {
|
||||
return element.slug === sensorName;
|
||||
});
|
||||
if (sensorInfo) {
|
||||
sensorInfo.markdown = "Coming soon...";
|
||||
|
||||
// GET DESCRIPTION OF SELECTED BLOCK
|
||||
sensorInfo.details = `# ${sensorName.toUpperCase()}
|
||||
${Blockly.Msg.sensorinfo_explanation} [${sensorName.toUpperCase()}](https://sensors.wiki/sensor/detail/${sensorName})
|
||||
## ${Blockly.Msg.sensorinfo_description}
|
||||
${filterLanguage(sensorInfo.description.item)}
|
||||
## ${Blockly.Msg.sensorinfo_measurable_phenos}
|
||||
## ${Blockly.Msg.sensorinfo_manufacturer}
|
||||
${sensorInfo.manufacturer}
|
||||
## ${Blockly.Msg.sensorinfo_lifetime}
|
||||
${sensorInfo.lifePeriod}`
|
||||
}
|
||||
|
||||
return (
|
||||
<Box sx={{ width: '100%', typography: 'body1' }}>
|
||||
<TabContext value={value}>
|
||||
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
|
||||
<TabList onChange={handleChange}>
|
||||
<Tab label="Basic Information" value="1" />
|
||||
<Tab label="Details" value="2" />
|
||||
</TabList>
|
||||
</Box>
|
||||
<TabPanel value="1">
|
||||
{sensorInfo ? <ReactMarkdown>{sensorInfo.markdown}</ReactMarkdown> : "No data available"}
|
||||
</TabPanel>
|
||||
<TabPanel value="2">
|
||||
{sensorInfo ? <ReactMarkdown>{sensorInfo.details}</ReactMarkdown> : "No data available"}
|
||||
</TabPanel>
|
||||
</TabContext>
|
||||
</Box>
|
||||
);
|
||||
}
|
@ -1,17 +1,41 @@
|
||||
import React, { Component } from "react";
|
||||
import PropTypes from "prop-types";
|
||||
import { connect } from "react-redux";
|
||||
|
||||
import withWidth from "@material-ui/core/withWidth";
|
||||
|
||||
import { Card } from "@material-ui/core";
|
||||
import { Button, Card } from "@material-ui/core";
|
||||
import * as Blockly from "blockly";
|
||||
import CardContent from "@material-ui/core/CardContent";
|
||||
|
||||
import Typography from "@material-ui/core/Typography";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
import Dialog from "@material-ui/core/Dialog";
|
||||
import DialogActions from "@material-ui/core/DialogActions";
|
||||
import DialogContent from "@material-ui/core/DialogContent";
|
||||
import Slide from "@material-ui/core/Slide";
|
||||
import SensorInfo from "./SensorInfo";
|
||||
import store from "../store";
|
||||
|
||||
const Transition = React.forwardRef(function Transition(props, ref) {
|
||||
return <Slide direction="up" ref={ref} {...props} />;
|
||||
});
|
||||
|
||||
class TooltipViewer extends Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.inputRef = React.createRef();
|
||||
this.state = {
|
||||
open: false,
|
||||
};
|
||||
}
|
||||
|
||||
toggleDialog = () => {
|
||||
this.setState({ open: !this.state });
|
||||
};
|
||||
|
||||
openDialog = () => {
|
||||
this.setState({ open: true });
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<Card
|
||||
@ -29,14 +53,46 @@ class TooltipViewer extends Component {
|
||||
{Blockly.Msg.tooltip_viewer}
|
||||
</Typography>
|
||||
|
||||
<ReactMarkdown linkTarget="_blank">
|
||||
{this.props.tooltip}
|
||||
</ReactMarkdown>
|
||||
|
||||
{this.props.helpurl !== "" ? (
|
||||
<ReactMarkdown>{`${Blockly.Msg.tooltip_moreInformation} [${Blockly.Msg.labels_here}](${this.props.helpurl})`}</ReactMarkdown>
|
||||
) : null}
|
||||
<Typography variant="body2" component="p">
|
||||
<ReactMarkdown linkTarget="_blank">
|
||||
{this.props.tooltip}
|
||||
</ReactMarkdown>
|
||||
{store.getState().workspace.code.data ? (
|
||||
<Button
|
||||
label="Mehr"
|
||||
variant="contained"
|
||||
color="primary"
|
||||
onClick={() => {
|
||||
this.openDialog();
|
||||
}}
|
||||
>
|
||||
Sensor Informationen
|
||||
</Button>
|
||||
) : (
|
||||
<ReactMarkdown>{`${Blockly.Msg.tooltip_moreInformation} [${Blockly.Msg.labels_here}](${this.props.helpurl})`}</ReactMarkdown>
|
||||
)}
|
||||
</Typography>
|
||||
</CardContent>
|
||||
{store.getState().workspace.code.data ? (<Dialog
|
||||
open={this.state.open}
|
||||
TransitionComponent={Transition}
|
||||
keepMounted
|
||||
aria-describedby="alert-dialog-slide-description"
|
||||
onClose={() => {
|
||||
this.toggleDialog();
|
||||
}}
|
||||
maxWidth={"md"}
|
||||
fullWidth={true}
|
||||
>
|
||||
<DialogContent>
|
||||
<SensorInfo></SensorInfo>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<Button onClick={() => {
|
||||
this.toggleDialog();
|
||||
}}>Close</Button>
|
||||
</DialogActions>
|
||||
</Dialog>) : (null)}
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
|
@ -38,6 +38,19 @@ export class Login extends Component {
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
if (this.props.message.id === "LOGIN_FAIL") {
|
||||
this.setState({
|
||||
email: "",
|
||||
password: "",
|
||||
snackbar: true,
|
||||
key: Date.now(),
|
||||
message: Blockly.Msg.messages_LOGIN_FAIL,
|
||||
type: "error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate(props) {
|
||||
const { message } = this.props;
|
||||
if (message !== props.message) {
|
||||
|
@ -3,7 +3,12 @@ import ReactDOM from "react-dom";
|
||||
import "./index.css";
|
||||
import App from "./App";
|
||||
import * as serviceWorker from "./serviceWorker";
|
||||
import store from "./store";
|
||||
import { fetchSensors } from "./actions/sensorwikiActions";
|
||||
|
||||
store.dispatch(fetchSensors());
|
||||
|
||||
fetchSensors();
|
||||
|
||||
ReactDOM.render(
|
||||
<React.StrictMode>
|
||||
|
@ -6,7 +6,8 @@ import generalReducer from './generalReducer';
|
||||
import projectReducer from './projectReducer';
|
||||
import messageReducer from './messageReducer';
|
||||
import authReducer from './authReducer';
|
||||
import boardReducer from './boardReducer'
|
||||
import boardReducer from './boardReducer';
|
||||
import sensorwikiReducer from './sensorwikiReducer';
|
||||
|
||||
export default combineReducers({
|
||||
auth: authReducer,
|
||||
@ -16,5 +17,6 @@ export default combineReducers({
|
||||
builder: tutorialBuilderReducer,
|
||||
project: projectReducer,
|
||||
general: generalReducer,
|
||||
message: messageReducer
|
||||
message: messageReducer,
|
||||
sensorwiki: sensorwikiReducer
|
||||
});
|
||||
|
10
src/reducers/sensorwikiReducer.js
Normal file
10
src/reducers/sensorwikiReducer.js
Normal file
@ -0,0 +1,10 @@
|
||||
const sensors = (state = [] , action) => {
|
||||
switch(action.type) {
|
||||
case 'FETCH_SENSORWIKI_SUCCESS':
|
||||
return action.payload.sensors
|
||||
default:
|
||||
return state
|
||||
}
|
||||
}
|
||||
|
||||
export default sensors
|
Loading…
x
Reference in New Issue
Block a user