UNPKG

slideshow-generator

Version:
152 lines (149 loc) 3.85 kB
import 'styles/App.less' import React,{ Component, PropTypes } from 'react' import { connect } from 'react-redux' import * as action from 'actions' import { Link } from 'react-router' import DocumentTitle from 'react-document-title' import classNames from 'classnames' import Slide from 'components/Slide' import global from 'modules/global' import Formsy from 'formsy-react' import Password from 'components/Password' class App extends Component { constructor(props) { super(props) this.state = { } this.onFullscreen = this.onFullscreen.bind(this) this.onStart = this.onStart.bind(this) this.onResize = this.onResize.bind(this) this.onSubmit = this.onSubmit.bind(this) } onSubmit() { let { dispatch } = this.props let model = this.refs.form.getModel() this.context.router.push('/'+model.password+'/') } onResize() { this.setState({ fullscreen:this.getFullscreen() }) } componentDidMount() { const { route,dispatch } = this.props let that = this window.addEventListener('resize',this.onResize) if(this.refs.password) { this.refs.password.setFocus() } dispatch(action.slide.fetch(route.password)) } componentWillUmount() { window.removeEventListener('resize',this.onResize) } componentWillReceiveProps(nextProps) { const { password,route,slide,dispatch } = this.props if((route.password !== nextProps.route.password) || (!slide && nextProps.route.password)) { dispatch(action.slide.fetch(nextProps.route.password)) } if(!route.password && password !== nextProps.password) { this.context.router.replace('/'+nextProps.password+'/') } } getFullscreen() { if(document.fullscreenElement) { return document.fullscreenElement } else if(document.webkitFullscreenElement) { return document.webkitFullscreenElement } else if(document.mozFullScreenElement) { return document.mozFullScreenElement } else if(document.msFullscreenElement) { return document.msFullscreenElement } } onFullscreen() { let elem = document.body if(elem.requestFullscreen) { elem.requestFullscreen() } else if(elem.webkitRequestFullscreen) { elem.webkitRequestFullscreen() } else if(elem.mozRequestFullScreen) { elem.mozRequestFullScreen() } else if(elem.msRequestFullscreen) { elem.msRequestFullscreen() } } onStart() { let { route } = this.props this.context.router.push('/'+route.password+'/0') } render() { const { fullscreen } = this.state const { routes, route, children, slide } = this.props return ( <DocumentTitle title={slide ? (route.index!==undefined ? (parseInt(route.index)+1)+'/'+slide.pages.length+' ' : '')+slide.title : 'Slide' } > <div> { !slide && <div className='app-input'> <Formsy.Form ref='form' className='app-input-container' onValidSubmit={this.onSubmit}> <Password ref='password' required name='password'/> </Formsy.Form> </div> } { slide && <div ref='slide' className={{ 'app-component':true, fullscreen:!!fullscreen }} > {!children && <div className='app-start'> <div className='app-start-button' onClick={this.onStart} dangerouslySetInnerHTML={{__html:slide.title}} > </div> </div> } { children && <div className='app-component'> { children } </div> } { !fullscreen && <div onClick={this.onFullscreen} className='app-fullscreen' /> } </div> } </div> </DocumentTitle> ) } } // App.contextTypes = { router: React.PropTypes.object.isRequired } App.propTypes = { } function mapStateToProps(state, ownProps) { return { route:ownProps.params, password:state.slide.password, slide:state.slide.data } } export default connect(mapStateToProps)(App)