{
timer?: number;
state: State = { showSpinner: false };
componentDidMount() {
if (this.props.loading == null || this.props.loading === true) {
this.startTimer();
}
}
componentDidUpdate(prevProps: Props) {
if (prevProps.loading === false && this.props.loading === true) {
this.stopTimer();
this.startTimer();
}
if (prevProps.loading === true && this.props.loading === false) {
this.stopTimer();
this.setState({ showSpinner: false });
}
}
componentWillUnmount() {
this.stopTimer();
}
startTimer = () => {
this.timer = window.setTimeout(
() => this.setState({ showSpinner: true }),
this.props.timeout || DEFAULT_TIMEOUT
);
};
stopTimer = () => {
window.clearTimeout(this.timer);
};
render() {
const { ariaLabel = translate('loading'), children, className, customSpinner } = this.props;
const { showSpinner } = this.state;
if (customSpinner) {
return showSpinner ? customSpinner : children;
}
return (
<>
{showSpinner && {ariaLabel}}
{!showSpinner && children}
>
);
}
}