143 lines
3.1 KiB
JavaScript
Raw Normal View History

/*
2019-07-02 08:37:41 +02:00
*
* 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';
2019-12-04 10:34:18 +01:00
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
2018-01-12 12:51:39 +01:00
import cn from 'classnames';
2019-10-09 18:06:51 +02:00
import Container from './Container';
import Overlay from './Overlay';
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;
2019-03-07 15:10:09 +01:00
if (elapsed > 15) {
2019-02-27 17:48:06 +01:00
clearInterval(this.timer);
return;
}
2019-07-02 08:37:41 +02:00
this.setState(prevState => ({
elapsed: Math.round(Date.now() - prevState.start) / 1000,
}));
};
2019-02-27 17:48:06 +01:00
startTimer = () => {
this.setState({ start: Date.now() });
this.timer = setInterval(this.tick, DELAY);
2019-07-02 08:37:41 +02:00
};
2019-02-27 17:48:06 +01:00
stopTimer = () => {
this.setState({ elapsed: 0 });
clearInterval(this.timer);
2019-07-02 08:37:41 +02:00
};
2019-02-27 17:48:06 +01:00
render() {
2019-02-27 17:48:06 +01:00
let { title, description, icon } = this.props;
const { elapsed } = this.state;
2019-02-27 17:51:41 +01:00
let button = (
2019-10-09 18:06:51 +02:00
<div className="buttonContainer">
2019-07-02 08:37:41 +02:00
<a
2019-10-09 18:06:51 +02:00
className={cn('primary', 'btn')}
2019-07-02 08:37:41 +02:00
href="https://strapi.io/documentation/configurations/configurations.html#server"
target="_blank"
rel="noopener noreferrer"
>
Read the documentation
</a>
2019-02-27 17:51:41 +01:00
</div>
);
2019-03-07 15:10:09 +01:00
if (elapsed > 15) {
2019-02-27 17:51:41 +01:00
button = null;
2019-12-04 10:34:18 +01:00
icon = ['far', 'clock'];
2019-02-27 17:51:41 +01:00
description = 'components.OverlayBlocker.description.serverError';
title = 'components.OverlayBlocker.title.serverError';
2019-02-27 17:48:06 +01:00
}
2018-01-12 12:51:39 +01:00
const content = this.props.children ? (
this.props.children
) : (
2019-10-09 18:06:51 +02:00
<Container>
<div className={cn('icoContainer', elapsed < 15 && 'spinner')}>
2019-12-04 10:34:18 +01:00
<FontAwesomeIcon icon={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:51:41 +01:00
{button}
2018-01-12 12:51:39 +01:00
</div>
2019-10-09 18:06:51 +02:00
</Container>
2018-01-12 12:51:39 +01:00
);
if (this.props.isOpen) {
return ReactDOM.createPortal(
<Overlay noGradient={this.props.noGradient}>
2019-07-02 08:37:41 +02:00
<div>{content}</div>
2019-10-09 18:06:51 +02:00
</Overlay>,
this.overlayContainer
);
}
return '';
}
}
OverlayBlocker.defaultProps = {
2019-02-27 17:48:06 +01:00
children: null,
description: 'components.OverlayBlocker.description',
2019-12-04 10:34:18 +01:00
icon: 'sync-alt',
isOpen: false,
noGradient: false,
title: 'components.OverlayBlocker.title',
};
OverlayBlocker.propTypes = {
children: PropTypes.node,
description: PropTypes.string,
icon: PropTypes.string,
isOpen: PropTypes.bool,
noGradient: PropTypes.bool,
title: PropTypes.string,
};
export default OverlayBlocker;