UNPKG

react-planner-electron

Version:

react-planner-electron is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.

130 lines (110 loc) 3.72 kB
import React, {Component} from 'react'; import PropTypes from 'prop-types'; import {bindActionCreators} from 'redux'; import {connect} from 'react-redux'; import Translator from './translator/translator'; import Catalog from './catalog/catalog'; import actions from './actions/export'; import {objectsMap} from './utils/objects-utils'; import { ToolbarComponents, Content, SidebarComponents, FooterBarComponents } from './components/export'; import {VERSION} from './version'; import './styles/export'; const {Toolbar} = ToolbarComponents; const {Sidebar} = SidebarComponents; const {FooterBar} = FooterBarComponents; const toolbarW = 50; const sidebarW = 300; const footerBarH= 20; const wrapperStyle = { display: 'flex', flexFlow: 'row nowrap' }; class ReactPlanner extends Component { getChildContext() { return { ...objectsMap(actions, actionNamespace => this.props[actionNamespace]), translator: this.props.translator, catalog: this.props.catalog, } } componentWillMount() { let {store} = this.context; let {projectActions, catalog, stateExtractor, plugins} = this.props; plugins.forEach(plugin => plugin(store, stateExtractor)); projectActions.initCatalog(catalog); } componentWillReceiveProps(nextProps) { let {stateExtractor, state, projectActions, catalog} = nextProps; let plannerState = stateExtractor(state); let catalogReady = plannerState.getIn(['catalog', 'ready']); if (!catalogReady) { projectActions.initCatalog(catalog); } } render() { let {width, height, state, stateExtractor, ...props} = this.props; let contentW = width - toolbarW - sidebarW; let toolbarH = height - footerBarH; let contentH = height - footerBarH; let sidebarH = height - footerBarH; let extractedState = stateExtractor(state); return ( <div style={{...wrapperStyle, height}}> <Toolbar width={toolbarW} height={toolbarH} state={extractedState} {...props} /> <Content width={contentW} height={contentH} state={extractedState} {...props} onWheel={event => event.preventDefault()} /> <Sidebar width={sidebarW} height={sidebarH} state={extractedState} {...props} /> <FooterBar width={width} height={footerBarH} state={extractedState} {...props} /> </div> ); } } ReactPlanner.propTypes = { translator: PropTypes.instanceOf(Translator), catalog: PropTypes.instanceOf(Catalog), allowProjectFileSupport: PropTypes.bool, plugins: PropTypes.arrayOf(PropTypes.func), autosaveKey: PropTypes.string, autosaveDelay: PropTypes.number, width: PropTypes.number.isRequired, height: PropTypes.number.isRequired, stateExtractor: PropTypes.func.isRequired, toolbarButtons: PropTypes.array, sidebarComponents: PropTypes.array, footerbarComponents: PropTypes.array, customContents: PropTypes.object, softwareSignature: PropTypes.string }; ReactPlanner.contextTypes = { store: PropTypes.object.isRequired, }; ReactPlanner.childContextTypes = { ...objectsMap(actions, () => PropTypes.object), translator: PropTypes.object, catalog: PropTypes.object, }; ReactPlanner.defaultProps = { translator: new Translator(), catalog: new Catalog(), plugins: [], allowProjectFileSupport: true, softwareSignature: ``, toolbarButtons: [], sidebarComponents: [], footerbarComponents: [], customContents: {}, }; //redux connect function mapStateToProps(reduxState) { return { state: reduxState } } function mapDispatchToProps(dispatch) { return objectsMap(actions, actionNamespace => bindActionCreators(actions[actionNamespace], dispatch)); } export default connect(mapStateToProps, mapDispatchToProps)(ReactPlanner);