1
0
mirror of https://github.com/mgerb/mywebsite synced 2026-01-11 02:12:53 +00:00

handling sensors with redux

This commit is contained in:
2016-09-05 18:27:52 +00:00
parent be5e95b6cf
commit 0e8d2e5b2b
15 changed files with 200 additions and 69 deletions

View File

@@ -9,7 +9,8 @@ import {connect, Provider} from 'react-redux';
import store, {history} from './redux/store'; import store, {history} from './redux/store';
//import actions //import actions
import * as actions from './redux/actions'; import * as appActions from './redux/actions/app';
import * as sensorActions from './redux/actions/sensor';
import Index from './pages/Index'; import Index from './pages/Index';
import Preview from './components/Preview'; import Preview from './components/Preview';
@@ -18,13 +19,15 @@ import SensorInfo from './components/sensors/SensorInfo';
function mapStateToProps(state) { function mapStateToProps(state) {
return { return {
redux: state.reducer app: state.app,
sensor: state.sensor
} }
} }
function mapDispatchToProps(dispatch) { function mapDispatchToProps(dispatch) {
return { return {
actions: bindActionCreators(actions, dispatch) appActions: bindActionCreators(appActions, dispatch),
sensorActions: bindActionCreators(sensorActions, dispatch)
} }
} }

View File

@@ -21,13 +21,13 @@ export default class Post extends React.Component {
componentDidMount() { componentDidMount() {
const params = this.props.params; const params = this.props.params;
this.props.actions.fetchPost(params.category, params.post); this.props.appActions.fetchPost(params.category, params.post);
} }
render() { render() {
const post = this.props.redux.post; const post = this.props.app.post;
const fetched = this.props.redux.fetched; const fetched = this.props.app.fetched;
const fetching = this.props.redux.fetching; const fetching = this.props.app.fetching;
return ( return (
<div class="Content"> <div class="Content">

View File

@@ -9,12 +9,12 @@ import '../../assets/scss/Content.scss';
export default class Preview extends React.Component { export default class Preview extends React.Component {
componentDidMount() { componentDidMount() {
this.props.actions.fetchPreview(); this.props.appActions.fetchPreview();
} }
insertPosts(posts) { insertPosts(posts) {
let elements = []; let elements = [];
for (let i = 0; i < this.props.redux.postLimit && i < posts.length; i++) { for (let i = 0; i < this.props.app.postLimit && i < posts.length; i++) {
elements.push( elements.push(
<div class="post" key={i}> <div class="post" key={i}>
<div class="date"> <div class="date">
@@ -34,10 +34,10 @@ export default class Preview extends React.Component {
} }
render() { render() {
const posts = this.props.redux.preview.posts; const posts = this.props.app.preview.posts;
const postLimit = this.props.redux.postLimit; const postLimit = this.props.app.postLimit;
const increasePostLimit = this.props.actions.increasePostLimit; const fetched = this.props.app.fetched;
const fetched = this.props.redux.fetched; const increasePostLimit = this.props.appActions.increasePostLimit;
return ( return (
<div class="Content"> <div class="Content">

View File

@@ -63,7 +63,7 @@ export default class Sidebar extends React.Component {
<h2>Sensors</h2> <h2>Sensors</h2>
<hr/> <hr/>
<SensorList/> {this.props.sensor.fetchedList ? <SensorList list={this.props.sensor.list}/> : null}
</div> </div>
); );
} }

View File

@@ -2,10 +2,13 @@ import React from 'react';
export default class SensorInfo extends React.Component{ export default class SensorInfo extends React.Component{
componentDidMount(){
this.props.sensorActions.fetchSensorInfoYear('Grand Meadow', '2016');
this.props.sensorActions.fetchSensorInfoMonth('Grand Meadow', '2016', 'May');
}
render(){ render(){
return( return(
<div>Test123</div> <div class="Content">Test123</div>
); );
} }
} }

View File

@@ -3,41 +3,6 @@ import 'whatwg-fetch';
export default class SensorList extends React.Component { export default class SensorList extends React.Component {
constructor() {
super();
this.state = {
sensors: {},
fetching: false,
fetched: false
}
}
componentDidMount() {
this.loadSensorData();
}
loadSensorData() {
this.setState({
fetching: true
});
fetch('/api/allsensors')
.then((response) => {
return response.json()
})
.then((json) => {
this.setState({
sensors: json,
fetching: false,
fetched: true
});
})
.catch((e) => {
console.log('Loading sensors failed', e)
});
}
insertSensorData = (sensor, index) => { insertSensorData = (sensor, index) => {
const date = new Date(sensor.updated); const date = new Date(sensor.updated);
@@ -50,9 +15,11 @@ export default class SensorList extends React.Component {
); );
} }
render() { render() {
const list = this.props.list;
return ( return (
<div> <div>
{this.state.fetched ? this.state.sensors.map(this.insertSensorData) : null} {list.map(this.insertSensorData)}
</div> </div>
) )
} }

View File

@@ -12,14 +12,17 @@ import 'font-awesome/css/font-awesome.min.css';
import '../../assets/css/dracula.css'; import '../../assets/css/dracula.css';
export default class Index extends React.Component { export default class Index extends React.Component {
componentDidMount(){
this.props.sensorActions.fetchSensorList();
}
render() { render() {
return ( return (
<div> <div>
<Header/> <Header/>
<div class="Main"> <div class="Main">
{React.cloneElement(this.props.children, this.props)} {React.cloneElement(this.props.children, this.props)}
<Sidebar/> <Sidebar sensor={Object.assign({}, this.props.sensor)}/>
</div> </div>
<Footer/> <Footer/>
</div> </div>

View File

@@ -1,4 +1,4 @@
import * as types from "./constants"; import * as types from "../constants/app";
import marked from 'marked'; import marked from 'marked';
import 'whatwg-fetch'; import 'whatwg-fetch';

View File

@@ -0,0 +1,83 @@
import * as types from "../constants/sensor";
import 'whatwg-fetch';
function loadSensorList(sensor_list){
return {
type: types.LOAD_SENSOR_LIST,
sensor_list
}
}
function loadSensorInfoYear(sensor_info){
return{
type: types.LOAD_SENSOR_INFO_YEAR,
sensor_info
}
}
function loadSensorInfoMonth(sensor_info){
return{
type: types.LOAD_SENSOR_INFO_MONTH,
sensor_info
}
}
function fetchingList(){
return {
type: types.FETCHING_LIST
}
}
function fetchingInfoYear(){
return {
type: types.FETCHING_INFO_YEAR
}
}
function fetchingInfoMonth(){
return {
type: types.FETCHING_INFO_MONTH
}
}
export function fetchSensorList(){
return (dispatch) => {
dispatch(fetchingList());
return fetch('/api/allsensors')
.then(response => response.json())
.then(json => {
dispatch(loadSensorList(json));
})
.catch(error => {
console.log(error);
});
}
}
export function fetchSensorInfoYear(location, year){
return (dispatch) => {
dispatch(fetchingInfoYear());
return fetch(`/api/sensor/${location}/${year}`)
.then(response => response.json())
.then(json => {
dispatch(loadSensorInfoYear(json));
})
.catch(error => {
console.log(error);
});
}
}
export function fetchSensorInfoMonth(location, year, month){
return (dispatch) => {
dispatch(fetchingInfoMonth());
return fetch(`/api/sensor/${location}/${year}/${month}`)
.then(response => response.json())
.then(json => {
dispatch(loadSensorInfoMonth(json));
})
.catch(error => {
console.log(error);
});
}
}

View File

@@ -0,0 +1,10 @@
//constants
export const LOAD_SENSOR_LIST = 'LOAD_SENSOR_LIST';
export const LOAD_SENSOR_INFO_YEAR = 'LOAD_SENSOR_INFO_YEAR';
export const LOAD_SENSOR_INFO_MONTH = 'LOAD_SENSOR_INFO_MONTH';
//fetching
export const FETCHING_LIST = 'FETCHING_LIST';
export const FETCHING_INFO_YEAR = 'FETCHING_INFO_YEAR';
export const FETCHING_INFO_MONTH = 'FETCHING_INFO_MONTH';

View File

@@ -1,9 +1,5 @@
//just using one reducer - use combineReducers from redux to modularize things
import {combineReducers} from 'redux';
import {routerReducer} from 'react-router-redux';
//import typs //import typs
import * as types from './constants'; import * as types from '../constants/app';
//defaults - //defaults -
const defaultState = { const defaultState = {
@@ -17,7 +13,7 @@ const defaultState = {
}; };
//default reducer //default reducer
function reducer(state = defaultState, action) { export default function app(state = defaultState, action) {
//every reducer gets called when an action is called - we check for the type to modify our state accordingly //every reducer gets called when an action is called - we check for the type to modify our state accordingly
switch (action.type) { switch (action.type) {
case types.INIT_PREVIEW: case types.INIT_PREVIEW:
@@ -46,10 +42,3 @@ function reducer(state = defaultState, action) {
//return present state if no actions get called //return present state if no actions get called
return state; return state;
} }
const allReducers = combineReducers({
reducer,
routing: routerReducer
});
export default allReducers;

View File

@@ -0,0 +1,14 @@
//just using one reducer - use combineReducers from redux to modularize things
import {combineReducers} from 'redux';
import {routerReducer} from 'react-router-redux';
import app from './app';
import sensor from './sensor';
const allReducers = combineReducers({
app,
sensor,
routing: routerReducer
});
export default allReducers;

View File

@@ -0,0 +1,59 @@
//import typs
import * as types from '../constants/sensor';
//defaults -
const defaultState = {
list : [],
infoMonth: [],
infoYear: [],
fetchingList: false,
fetchingInfoMonth: false,
fetchingInfoYear: false,
fetchedList: false,
fetchedInfoMonth: false,
fetchedInfoYear: false
};
//default reducer
export default function app(state = defaultState, action) {
switch(action.type){
case types.FETCHING_LIST:
return Object.assign({}, state, {
fetchingList: true,
fetchedList: false
});
case types.FETCHING_INFO_MONTH:
return Object.assign({}, state, {
fetchingInfoMonth: true,
fetchedInfoMonth: false
});
case types.FETCHING_INFO_YEAR:
return Object.assign({}, state, {
fetchingInfoYear: true,
fetchedInfoYear: false
});
case types.LOAD_SENSOR_LIST:
return Object.assign({}, state, {
list: action.sensor_list,
fetchingList: false,
fetchedList: true
});
case types.LOAD_SENSOR_INFO_MONTH:
return Object.assign({}, state, {
infoMonth: action.sensor_info,
fetchingInfoMonth: false,
fetchedInfoMonth: true
});
case types.LOAD_SENSOR_INFO_YEAR:
return Object.assign({}, state, {
infoYear: action.sensor_info,
fetchingInfoYear: false,
fetchedInfoYear: true
});
}
//return present state if no actions get called
return state;
}

View File

@@ -4,7 +4,7 @@ import {applyMiddleware, createStore} from 'redux';
import {browserHistory} from 'react-router'; import {browserHistory} from 'react-router';
import {syncHistoryWithStore} from 'react-router-redux'; import {syncHistoryWithStore} from 'react-router-redux';
import reducers from './reducers'; import reducers from './reducers/reducers';
const middleware = applyMiddleware(thunk, logger()); const middleware = applyMiddleware(thunk, logger());