diff --git a/.gitignore b/.gitignore index 6c96c5cff124271309d717aa6a74c99fa3cdd455..d09ce83155cf7e9ccf70b1a5878f97730480fda2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ build .DS_Store .env npm-debug.log +.idea diff --git a/src/components/BuildingOverviewTop/index.js b/src/components/BuildingOverview/index.js similarity index 100% rename from src/components/BuildingOverviewTop/index.js rename to src/components/BuildingOverview/index.js diff --git a/src/components/BuildingOverviewTop/styles.css b/src/components/BuildingOverview/styles.css similarity index 100% rename from src/components/BuildingOverviewTop/styles.css rename to src/components/BuildingOverview/styles.css diff --git a/src/components/SideBarDetail/index.js b/src/components/SideBarDetail/index.js index 3206e3cbb1bf896b87f33ad8cc5e7b415231de45..b3c1706c959c6d6d09cc9acc4f409a2b3e43a7e9 100644 --- a/src/components/SideBarDetail/index.js +++ b/src/components/SideBarDetail/index.js @@ -1,12 +1,25 @@ import React, { PropTypes } from 'react'; import { Link } from 'react-router'; import './styles.css'; +import buildingDetailPropType from '../../containers/Building/propTypes'; -export default function SideBarDetail({ buildingId }) { - const rootURL = `/buildings/${buildingId}`; +export default function SideBarDetail({ building, children }) { + const rootURL = `/buildings/${building.building_id}`; return (
- Building ID: {buildingId} +
+
+ {building.address} +
+

{building.zipcode}

+ +
+ { children }
Overview
@@ -18,5 +31,6 @@ export default function SideBarDetail({ buildingId }) { } SideBarDetail.propTypes = { - buildingId: PropTypes.string, + children: PropTypes.element, + building: buildingDetailPropType, }; diff --git a/src/components/Utilities/index.js b/src/components/Utilities/index.js index 4969a8e566bf0688c7e468fa9a6c66e1538f44ce..e2e895e446527f8b8ac75952460c2ca499b14a73 100644 --- a/src/components/Utilities/index.js +++ b/src/components/Utilities/index.js @@ -1,12 +1,9 @@ import React, { Component, PropTypes } from 'react'; -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import buildingDetailPropTypes from '../../containers/BuildingOverview/buildingDetailPropType'; +import buildingDetailPropTypes from '../../containers/Building/propTypes'; import request from '../../utils/request'; import { getHeaders, utilityURL } from '../../utils/rest_services'; -import { loadBuildingDetail } from '../../containers/BuildingOverview/actions'; import UtilityAccount from '../UtilityAccount'; class Utilities extends Component { @@ -21,23 +18,8 @@ class Utilities extends Component { } componentDidMount() { - const { address, building_id } = this.props.buildingDetail.overview; - - // TODO remove getting adress, should be done in backend - /* eslint-disable camelcase */ - if (!address || this.props.buildingId !== building_id) { - this.props.loadBuildingDetail(this.props.buildingId); - } else if (address && this.props.buildingId === building_id) { - this.getUtilityAccounts(address); - } - } - - componentDidUpdate(prevProps) { - const { address, building_id } = this.props.buildingDetail.overview; - const prevAddress = prevProps.buildingDetail.overview.address; - if (parseInt(this.props.buildingId, 10) === building_id && prevAddress !== address) { - this.getUtilityAccounts(address); - } + const { address } = this.props.building; + this.getUtilityAccounts(address); } getUtilityAccounts = (address) => { @@ -76,7 +58,7 @@ class Utilities extends Component { body: JSON.stringify({ ...form, building_id: this.props.buildingId, - building_address: this.props.buildingDetail.overview.address, + building_address: this.props.building.address, }), }).then((res) => { if (res.err) { @@ -96,7 +78,7 @@ class Utilities extends Component { body: JSON.stringify({ ...form, building_id: parseInt(this.props.buildingId, 10), - building_address: this.props.buildingDetail.overview.address, + building_address: this.props.building.address, }), }).then((res) => { if (res.err) { @@ -185,16 +167,7 @@ class Utilities extends Component { Utilities.propTypes = { buildingId: PropTypes.string, - buildingDetail: buildingDetailPropTypes, - loadBuildingDetail: PropTypes.func, + building: buildingDetailPropTypes, }; -function mapDispatchToProps(dispatch) { - return bindActionCreators({ loadBuildingDetail }, dispatch); -} - -function mapStateToProps({ buildingDetail }) { - return { buildingDetail }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(Utilities); +export default Utilities; diff --git a/src/containers/BuildingOverview/actions.js b/src/containers/Building/actions.js similarity index 100% rename from src/containers/BuildingOverview/actions.js rename to src/containers/Building/actions.js diff --git a/src/containers/BuildingOverview/constants.js b/src/containers/Building/constants.js similarity index 100% rename from src/containers/BuildingOverview/constants.js rename to src/containers/Building/constants.js diff --git a/src/containers/Building/index.js b/src/containers/Building/index.js new file mode 100644 index 0000000000000000000000000000000000000000..43d300ae15a2263c3b28b4b544853dbcf2d31e10 --- /dev/null +++ b/src/containers/Building/index.js @@ -0,0 +1,63 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import buildingDetailPropTypes from './propTypes'; + +import { loadBuildingDetail } from './actions'; + +import './styles.css'; +import SideBarDetail from '../../components/SideBarDetail'; + + +class BuildingOverview extends Component { + componentDidMount() { + this.props.loadBuildingDetail(this.props.buildingId); + } + + render() { + const { error, loading, address } = this.props.buildingDetail.overview; + let mainContent =
; + if (this.props.children && !error && !loading && address !== undefined) { + mainContent = React.cloneElement(this.props.children, { + buildingId: this.props.buildingId, + building: this.props.buildingDetail.overview, + }); + } + + return ( +
+
+ +
+
+
+ {`There was a error retrieving the building | ${error.message}`} +
+ { mainContent } +
+
+ ); + } +} + +BuildingOverview.propTypes = { + children: PropTypes.element, + buildingDetail: buildingDetailPropTypes, + buildingId: PropTypes.string, + loadBuildingDetail: PropTypes.func, +}; + +function mapDispatchToProps(dispatch) { + return bindActionCreators({ + loadBuildingDetail, + }, dispatch); +} + +function mapStateToProps({ buildingDetail }) { + return { buildingDetail }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(BuildingOverview); diff --git a/src/containers/BuildingOverview/buildingDetailPropType.js b/src/containers/Building/propTypes.js similarity index 100% rename from src/containers/BuildingOverview/buildingDetailPropType.js rename to src/containers/Building/propTypes.js diff --git a/src/containers/BuildingOverview/reducer.js b/src/containers/Building/reducer.js similarity index 100% rename from src/containers/BuildingOverview/reducer.js rename to src/containers/Building/reducer.js diff --git a/src/containers/BuildingOverview/sagas.js b/src/containers/Building/sagas.js similarity index 100% rename from src/containers/BuildingOverview/sagas.js rename to src/containers/Building/sagas.js diff --git a/src/containers/BuildingOverview/styles.css b/src/containers/Building/styles.css similarity index 100% rename from src/containers/BuildingOverview/styles.css rename to src/containers/Building/styles.css diff --git a/src/containers/BuildingOverview/index.js b/src/containers/BuildingOverview/index.js deleted file mode 100644 index 56666f902cf217d311e3159e43c349d694ba8c63..0000000000000000000000000000000000000000 --- a/src/containers/BuildingOverview/index.js +++ /dev/null @@ -1,58 +0,0 @@ -import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import buildingDetailPropTypes from './buildingDetailPropType'; - -import { loadBuildingDetail } from './actions'; - -import './styles.css'; -import BuildingOverviewTop from '../../components/BuildingOverviewTop'; - - -class BuildingOverview extends Component { - componentDidMount() { - this.props.loadBuildingDetail(this.props.params.buildingID); - } - - render() { - let mainContent =
; - - if (this.props.buildingDetail.overview.error) { - mainContent = ( -

- {this.props.buildingDetail.overview.error.message} -

- ); - } else { - mainContent = ( - - ); - } - - return ( -
- {mainContent} -
- ); - } -} - -BuildingOverview.propTypes = { - buildingDetail: buildingDetailPropTypes, - params: PropTypes.objectOf(PropTypes.string), - loadBuildingDetail: PropTypes.func, -}; - -function mapDispatchToProps(dispatch) { - return bindActionCreators({ - loadBuildingDetail, - }, dispatch); -} - -function mapStateToProps({ buildingDetail }) { - return { buildingDetail }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(BuildingOverview); diff --git a/src/containers/Dimensions/index.js b/src/containers/Dimensions/index.js index 7ca16d493ffcf603c8b25ace8c665534286c1b89..137e56ebef6766f08f654d92caa02e9ba108e3a1 100644 --- a/src/containers/Dimensions/index.js +++ b/src/containers/Dimensions/index.js @@ -8,11 +8,7 @@ import { hitDecision, } from './actions'; -import { - loadBuildingDetail, -} from '../BuildingOverview/actions'; - -import buildingDetailPropTypes from '../BuildingOverview/buildingDetailPropType'; +import buildingDetailPropTypes from '../Building/propTypes'; import turkHitPropTypes from './propTypes'; import './styles.css'; @@ -21,13 +17,7 @@ import TurkHit from '../../components/TurkHit'; class Dimensions extends Component { componentDidMount() { - /* eslint-disable camelcase */ - const { address, building_id } = this.props.buildingDetail.overview; - this.props.loadHit(this.props.buildingId); - if (!address || this.props.buildingId !== building_id) { - this.props.loadBuildingDetail(this.props.buildingId); - } } createHitConfirmation = (form) => { @@ -62,7 +52,6 @@ Dimensions.propTypes = { loadHit: PropTypes.func, createHit: PropTypes.func, hitDecision: PropTypes.func, - loadBuildingDetail: PropTypes.func, }; function mapDispatchToProps(dispatch) { @@ -70,7 +59,6 @@ function mapDispatchToProps(dispatch) { loadHit, createHit, hitDecision, - loadBuildingDetail, }, dispatch); } diff --git a/src/reducers.js b/src/reducers.js index 6870601e215350285ac1fffc1c76a57a40dedfab..bf22b798707bf26ff0fe8a971879d17a5c4eb729 100644 --- a/src/reducers.js +++ b/src/reducers.js @@ -2,14 +2,14 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; import SearchBarReducer from './containers/SearchBar/reducer'; -import BuildingOverviewReducer from './containers/BuildingOverview/reducer'; +import BuildingReducer from './containers/Building/reducer'; import GoogleLoginReducer from './containers/GoogleLogin/reducer'; import DimensionsReducer from './containers/Dimensions/reducer'; export default combineReducers({ routing: routerReducer, buildingList: SearchBarReducer, - buildingDetail: BuildingOverviewReducer, + buildingDetail: BuildingReducer, googleLogin: GoogleLoginReducer, dimensions: DimensionsReducer, }); diff --git a/src/routes.js b/src/routes.js index e6a4400298c16d755876d0d6391d703e06078c9f..4211ce3fed569331714c79b38e7e33e6e5f2903f 100644 --- a/src/routes.js +++ b/src/routes.js @@ -6,8 +6,8 @@ import { requireAuth, redirectIfLoggedIn } from './utils/auth'; import Login from './screens/Login'; import NotFound from './screens/NotFound'; import HomePage from './screens/HomePage'; -import BuildingDetail from './screens/BuildingDetail'; -import BuildingOverview from './containers/BuildingOverview'; +import DetailPage from './screens/DetailPage'; +import BuildingOverview from './components/BuildingOverview'; import Dimensions from './containers/Dimensions'; import Utilities from './components/Utilities'; @@ -17,7 +17,7 @@ export default ( - + diff --git a/src/sagas.js b/src/sagas.js index 1d1af9dc85fcac78fecee30ee66d645ac770ec81..bd7d214ac1d3888e08e6c226689228c9b2af0e66 100644 --- a/src/sagas.js +++ b/src/sagas.js @@ -1,10 +1,10 @@ import buildingsSearchSaga from './containers/SearchBar/sagas'; -import buildingOverviewSaga from './containers/BuildingOverview/sagas'; +import buildingSaga from './containers/Building/sagas'; import dimensionsSaga from './containers/Dimensions/sagas'; export default function* rootSaga() { yield [ - buildingOverviewSaga(), + buildingSaga(), dimensionsSaga(), buildingsSearchSaga(), ]; diff --git a/src/screens/BuildingDetail/index.js b/src/screens/BuildingDetail/index.js deleted file mode 100644 index 85cfdc0daef6938caade0bc24aa1dc0eb9a67516..0000000000000000000000000000000000000000 --- a/src/screens/BuildingDetail/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import React, { PropTypes } from 'react'; -import SideBarDetail from '../../components/SideBarDetail'; - -import NavBar from '../../components/NavBar'; - - -export default function BuildingDetail(props) { - return ( -
- -
- -
-
- {props.children && React.cloneElement(props.children, { - buildingId: props.params.buildingID, - })} -
-
- ); -} - -BuildingDetail.propTypes = { - children: PropTypes.element, - params: PropTypes.shape({ - buildingID: PropTypes.string, - }), -}; diff --git a/src/screens/DetailPage/index.js b/src/screens/DetailPage/index.js new file mode 100644 index 0000000000000000000000000000000000000000..721e57fd64176b0baa595034d2c0ed63ba02bcd2 --- /dev/null +++ b/src/screens/DetailPage/index.js @@ -0,0 +1,22 @@ +import React, { PropTypes } from 'react'; +import NavBar from '../../components/NavBar'; +import Building from '../../containers/Building'; + + +export default function BuildingDetail(props) { + return ( +
+ + + { props.children } + +
+ ); +} + +BuildingDetail.propTypes = { + children: PropTypes.element, + params: PropTypes.shape({ + buildingId: PropTypes.string, + }), +}; diff --git a/src/screens/BuildingDetail/styles.css b/src/screens/DetailPage/styles.css similarity index 100% rename from src/screens/BuildingDetail/styles.css rename to src/screens/DetailPage/styles.css