130 lines
2.9 KiB
JavaScript
Raw Normal View History

/*
*
* OverlayBlocker
*
*/
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
2018-01-12 12:51:39 +01:00
import { FormattedMessage } from 'react-intl';
import cn from 'classnames';
import styles from './styles.scss';
2019-02-27 17:48:06 +01:00
const DELAY = 1000;
class OverlayBlocker extends React.Component {
constructor(props) {
super(props);
2019-02-27 17:48:06 +01:00
this.state = { elapsed: 0, start: 0 };
this.overlayContainer = document.createElement('div');
document.body.appendChild(this.overlayContainer);
}
2019-02-27 17:48:06 +01:00
componentDidUpdate(prevProps) {
const { isOpen } = this.props;
if (prevProps.isOpen !== this.props.isOpen && isOpen) {
this.startTimer();
}
if (prevProps.isOpen !== isOpen && !isOpen) {
this.stopTimer();
}
}
componentWillUnmount() {
document.body.removeChild(this.overlayContainer);
}
2019-02-27 17:48:06 +01:00
tick = () => {
const { elapsed } = this.state;
if (elapsed > 30) {
clearInterval(this.timer);
return;
}
this.setState(prevState => ({ elapsed: (Math.round(Date.now() - prevState.start) / 1000) }));
}
startTimer = () => {
this.setState({ start: Date.now() });
this.timer = setInterval(this.tick, DELAY);
}
stopTimer = () => {
this.setState({ elapsed: 0 });
clearInterval(this.timer);
}
render() {
2019-02-27 17:48:06 +01:00
let { title, description, icon } = this.props;
const { elapsed } = this.state;
if (elapsed > 30) {
title = 'components.OverlayBlocker.title.serverError';
description = 'components.OverlayBlocker.description.serverError';
icon = 'fa fa-clock-o';
}
2018-01-12 12:51:39 +01:00
const content = this.props.children ? (
this.props.children
) : (
<div className={styles.container}>
2019-02-27 17:48:06 +01:00
<div className={cn(styles.icoContainer, elapsed < 30 && styles.spin)}>
<i className={icon} />
2018-01-12 12:51:39 +01:00
</div>
<div>
<h4>
<FormattedMessage id={title} />
2018-01-12 12:51:39 +01:00
</h4>
<p>
<FormattedMessage id={description} />
2018-01-12 12:51:39 +01:00
</p>
2019-02-27 17:48:06 +01:00
{ elapsed < 30 && (
<div className={styles.buttonContainer}>
<a className={cn(styles.primary, 'btn')} href="https://strapi.io/documentation/configurations/configurations.html#server" target="_blank">Read the documentation</a>
</div>
)}
2018-01-12 12:51:39 +01:00
</div>
</div>
);
if (this.props.isOpen) {
return ReactDOM.createPortal(
<div className={styles.overlay}>
<div>
2018-01-12 12:51:39 +01:00
{content}
</div>
</div>,
this.overlayContainer
);
}
return '';
}
}
OverlayBlocker.defaultProps = {
2019-02-27 17:48:06 +01:00
children: null,
description: 'components.OverlayBlocker.description',
icon: 'fa fa-refresh',
isOpen: false,
title: 'components.OverlayBlocker.title',
};
OverlayBlocker.propTypes = {
children: PropTypes.node,
description: PropTypes.string,
icon: PropTypes.string,
isOpen: PropTypes.bool,
title: PropTypes.string,
};
export default OverlayBlocker;