feat(client): show loader if editor takes a long time to load

This commit is contained in:
Valeriy
2019-09-01 03:36:36 +03:00
committed by Mrugesh Mohapatra
parent aaf7ed7357
commit d161459109
4 changed files with 29 additions and 12 deletions

View File

@ -1,20 +1,29 @@
import React from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import Spinner from 'react-spinkit'; import Spinner from 'react-spinkit';
import './loader.css'; import './loader.css';
function Loader({ fullScreen }) { function Loader({ fullScreen, timeout }) {
const [showSpinner, setShowSpinner] = useState(!timeout);
useEffect(() => {
let timerId;
if (!showSpinner) {
timerId = setTimeout(() => setShowSpinner(true), timeout);
}
return () => clearTimeout(timerId);
}, [setShowSpinner, showSpinner, timeout]);
return ( return (
<div className={fullScreen ? 'full-screen-wrapper' : ''}> <div className={`fcc-loader ${fullScreen ? 'full-screen-wrapper' : ''}`}>
<Spinner name='line-scale-pulse-out' /> {showSpinner && <Spinner name='line-scale-pulse-out' />}
</div> </div>
); );
} }
Loader.displayName = 'Loader'; Loader.displayName = 'Loader';
Loader.propTypes = { Loader.propTypes = {
fullScreen: PropTypes.bool fullScreen: PropTypes.bool,
timeout: PropTypes.number
}; };
export default Loader; export default Loader;

View File

@ -2,7 +2,7 @@
exports[`<Loader /> matches the fullScreen render snapshot 1`] = ` exports[`<Loader /> matches the fullScreen render snapshot 1`] = `
<div <div
class="full-screen-wrapper" class="fcc-loader full-screen-wrapper"
> >
<div <div
class="sk-fade-in sk-spinner line-scale-pulse-out" class="sk-fade-in sk-spinner line-scale-pulse-out"
@ -18,7 +18,7 @@ exports[`<Loader /> matches the fullScreen render snapshot 1`] = `
exports[`<Loader /> matches to the default render snapshot 1`] = ` exports[`<Loader /> matches to the default render snapshot 1`] = `
<div <div
class="" class="fcc-loader "
> >
<div <div
class="sk-fade-in sk-spinner line-scale-pulse-out" class="sk-fade-in sk-spinner line-scale-pulse-out"

View File

@ -1,12 +1,19 @@
.full-screen-wrapper { .fcc-loader {
height: 100vh; height: 100%;
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.full-screen-wrapper .sk-spinner { .fcc-loader .sk-spinner {
transform: scale(2);
color: var(--secondary-color); color: var(--secondary-color);
} }
.fcc-loader.full-screen-wrapper {
height: calc(100vh - var(--header-height, 0px));
}
.fcc-loader.full-screen-wrapper .sk-spinner {
transform: scale(2);
}

View File

@ -6,6 +6,7 @@ import { createSelector } from 'reselect';
import { executeChallenge, updateFile } from '../redux'; import { executeChallenge, updateFile } from '../redux';
import { userSelector } from '../../../redux'; import { userSelector } from '../../../redux';
import { Loader } from '../../../components/helpers';
const MonacoEditor = React.lazy(() => import('react-monaco-editor')); const MonacoEditor = React.lazy(() => import('react-monaco-editor'));
@ -130,7 +131,7 @@ class Editor extends Component {
const { contents, ext, theme, fileKey } = this.props; const { contents, ext, theme, fileKey } = this.props;
const editorTheme = theme === 'night' ? 'vs-dark-custom' : 'vs-custom'; const editorTheme = theme === 'night' ? 'vs-dark-custom' : 'vs-custom';
return ( return (
<Suspense fallback={<div />}> <Suspense fallback={<Loader timeout={600} />}>
<MonacoEditor <MonacoEditor
editorDidMount={this.editorDidMount} editorDidMount={this.editorDidMount}
editorWillMount={this.editorWillMount} editorWillMount={this.editorWillMount}