feat(client): show loader if editor takes a long time to load
This commit is contained in:
committed by
Mrugesh Mohapatra
parent
aaf7ed7357
commit
d161459109
@ -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;
|
||||||
|
@ -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"
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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}
|
||||||
|
Reference in New Issue
Block a user