UNPKG

d2-ui

Version:
192 lines (161 loc) 4.28 kB
import React from 'react'; import StylePropable from '../mixins/style-propable'; import TimeDisplay from './time-display'; import ClockHours from './clock-hours'; import ClockMinutes from './clock-minutes'; import getMuiTheme from '../styles/getMuiTheme'; const Clock = React.createClass({ propTypes: { format: React.PropTypes.oneOf(['ampm', '24hr']), initialTime: React.PropTypes.object, isActive: React.PropTypes.bool, mode: React.PropTypes.oneOf(['hour', 'minute']), onChangeHours: React.PropTypes.func, onChangeMinutes: React.PropTypes.func, }, contextTypes: { muiTheme: React.PropTypes.object, }, mixins: [StylePropable], getDefaultProps() { return { initialTime: new Date(), }; }, getInitialState() { return { muiTheme: this.context.muiTheme || getMuiTheme(), selectedTime: this.props.initialTime, mode: 'hour', }; }, componentWillReceiveProps(nextProps, nextContext) { let newMuiTheme = nextContext.muiTheme ? nextContext.muiTheme : this.state.muiTheme; this.setState({ muiTheme: newMuiTheme, selectedTime: nextProps.initialTime, }); }, _setMode(mode) { setTimeout(() => { this.setState({ mode: mode, }); }, 100); }, _setAffix(affix) { if (affix === this._getAffix()) return; let hours = this.state.selectedTime.getHours(); if (affix === 'am') { this.handleChangeHours(hours - 12, affix); return; } this.handleChangeHours(hours + 12, affix); }, _getAffix() { if (this.props.format !== 'ampm') return ''; let hours = this.state.selectedTime.getHours(); if (hours < 12) { return 'am'; } return 'pm'; }, handleChangeHours(hours, finished) { let time = new Date(this.state.selectedTime); let affix; if ( typeof finished === 'string' ) { affix = finished; finished = undefined; } if (!affix) { affix = this._getAffix(); } if (affix === 'pm' && hours < 12) { hours += 12; } time.setHours(hours); this.setState({ selectedTime: time, }); const {onChangeHours} = this.props; if (finished) { setTimeout(() => { this.setState({ mode: 'minute', }); if (typeof (onChangeHours) === 'function') { onChangeHours(time); } }, 100); } }, handleChangeMinutes(minutes) { let time = new Date(this.state.selectedTime); time.setMinutes(minutes); this.setState({ selectedTime: time, }); const {onChangeMinutes} = this.props; if (typeof (onChangeMinutes) === 'function') { setTimeout(() => { onChangeMinutes(time); }, 0); } }, getSelectedTime() { return this.state.selectedTime; }, render() { let clock = null; let styles = { root: {}, container: { height: 280, padding: 10, position: 'relative', }, circle: { position: 'absolute', top: 20, width: 260, height: 260, borderRadius: '100%', backgroundColor: this.state.muiTheme.timePicker.clockCircleColor, }, }; if ( this.state.mode === 'hour') { clock = ( <ClockHours key="hours" format={this.props.format} onChange={this.handleChangeHours} initialHours={this.state.selectedTime.getHours()} /> ); } else { clock = ( <ClockMinutes key="minutes" onChange={this.handleChangeMinutes} initialMinutes={this.state.selectedTime.getMinutes()} /> ); } return ( <div style={this.prepareStyles(styles.root)}> <TimeDisplay selectedTime={this.state.selectedTime} mode={this.state.mode} format={this.props.format} affix={this._getAffix()} onSelectAffix={this._setAffix} onSelectHour={this._setMode.bind(this, 'hour')} onSelectMin={this._setMode.bind(this, 'minute')} /> <div style={this.prepareStyles(styles.container)} > <div style={this.prepareStyles(styles.circle)} /> {clock} </div> </div> ); }, }); export default Clock;