import React, { Component } from 'react'; import PropTypes from 'prop-types'; import TransitionGroup from 'react-transition-group/TransitionGroup'; import CSSTransition from 'react-transition-group/CSSTransition'; import { getAnimationModule } from '../utils/utils'; import time from '../utils/time'; import Hours from './ClockHours'; import Minutes from './ClockMinutes'; class Clock extends Component { static propTypes = { display: PropTypes.oneOf(['hours', 'minutes']), format: PropTypes.oneOf(['24hr', 'ampm']), onChange: PropTypes.func, onHandMoved: PropTypes.func, theme: PropTypes.shape({ clock: PropTypes.string, clockWrapper: PropTypes.string, placeholder: PropTypes.string, }), time: PropTypes.instanceOf(Date), }; static defaultProps = { className: '', display: 'hours', format: '24hr', time: new Date(), }; state = { center: { x: null, y: null }, radius: 0, }; componentDidMount() { window.addEventListener('resize', this.handleCalculateShape); setTimeout(() => { this.handleCalculateShape(); }); } componentWillUnmount() { window.removeEventListener('resize', this.handleCalculateShape); } handleHourChange = (hours) => { if (this.props.time.getHours() !== hours) { this.props.onChange(time.setHours(this.props.time, this.adaptHourToFormat(hours))); } }; handleMinuteChange = (minutes) => { if (this.props.time.getMinutes() !== minutes) { this.props.onChange(time.setMinutes(this.props.time, minutes)); } }; handleCalculateShape = () => { const { top, left, width } = this.placeholderNode.getBoundingClientRect(); this.setState({ center: { x: left + ((width / 2) - window.pageXOffset), y: top + ((width / 2) - window.pageXOffset), }, radius: width / 2, }); }; adaptHourToFormat(hour) { if (this.props.format === 'ampm') { if (time.getTimeMode(this.props.time) === 'pm') { return hour < 12 ? hour + 12 : hour; } return hour === 12 ? 0 : hour; } return hour; } renderHours() { return ( ); } renderMinutes() { return ( ); } render() { const { theme } = this.props; const animation = this.state.display === 'hours' ? 'zoomOut' : 'zoomIn'; const animationModule = getAnimationModule(animation, theme); return (
{ this.placeholderNode = node; }} >
{this.props.display === 'hours' ? this.renderHours() : null} {this.props.display === 'minutes' ? this.renderMinutes() : null}
); } } export default Clock;