From 4873a22dc760f6cc21dba3c8d5f779cb9c3d4293 Mon Sep 17 00:00:00 2001 From: Kyle Doherty <kyle.l.doherty@gmail.com> Date: Thu, 14 Sep 2017 14:19:29 -0700 Subject: [PATCH] add cycling of messages to loading and error wrapper --- .../components/LoadingAndErrorWrapper.jsx | 76 +++++++++++++++---- .../xray/containers/SegmentComparison.jsx | 6 ++ frontend/src/metabase/xray/xray.js | 1 + 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx b/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx index d89b9d9f227..b155be6ba5d 100644 --- a/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx +++ b/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx @@ -7,15 +7,24 @@ import LoadingSpinner from "metabase/components/LoadingSpinner.jsx"; import cx from "classnames"; export default class LoadingAndErrorWrapper extends Component { + + state = { + messageIndex: 0, + loadCount: 0 + } + static propTypes = { - className: PropTypes.string, - error: PropTypes.any, - loading: PropTypes.any, - noBackground: PropTypes.bool, - noWrapper: PropTypes.bool, - children: PropTypes.any, - style: PropTypes.object, - showSpinner: PropTypes.bool + className: PropTypes.string, + error: PropTypes.any, + loading: PropTypes.any, + noBackground: PropTypes.bool, + noWrapper: PropTypes.bool, + children: PropTypes.any, + style: PropTypes.object, + showSpinner: PropTypes.bool, + loadingMessages: PropTypes.array, + messageInterval: PropTypes.number, + loadingTimeout: PropTypes.number }; static defaultProps = { @@ -24,7 +33,10 @@ export default class LoadingAndErrorWrapper extends Component { loading: false, noBackground: false, noWrapper: false, - showSpinner: true + showSpinner: true, + loadingMessages: ['Loading...'], + messageInterval: 6000, + loadingTimeout: 20000, }; getErrorMessage() { @@ -38,6 +50,23 @@ export default class LoadingAndErrorWrapper extends Component { ); } + componentDidMount () { + const { loadingMessages, messageInterval } = this.props; + // only start cycling if multiple messages are provided + if(loadingMessages.length > 1) { + this.cycle = setInterval(this.cycleLoadingMessage, messageInterval) + } + } + + componentWillUnmount () { + clearInterval(this.cycle) + } + + loadingInterval = () => { + this.setState({ loadCount: this.state.loadCount + 1}) + this.cycleLoadingMessage() + } + getChildren() { function resolveChild(child) { if (Array.isArray(child)) { @@ -51,11 +80,31 @@ export default class LoadingAndErrorWrapper extends Component { return resolveChild(this.props.children); } + cycleLoadingMessage = () => { + this.setState({ + messageIndex: this.state.messageIndex + 1 < this.props.loadingMessages.length -1 + ? this.state.messageIndex + 1 + : 0 + + }) + } + render() { - const { loading, error, noBackground, noWrapper, showSpinner } = this.props; + const { + loading, + error, + noBackground, + noWrapper, + showSpinner, + loadingMessages + } = this.props; + + const { messageIndex } = this.state; + const contentClassName = cx("wrapper py4 text-brand text-centered flex-full flex flex-column layout-centered", { "bg-white": !noBackground }); + if (noWrapper && !error && !loading) { return React.Children.only(this.getChildren()); } @@ -66,10 +115,11 @@ export default class LoadingAndErrorWrapper extends Component { <h2 className="text-normal text-grey-2 ie-wrap-content-fix">{this.getErrorMessage()}</h2> </div> : loading ? - showSpinner && <div className={contentClassName}> - <LoadingSpinner /> - <h2 className="text-normal text-grey-2 mt1">Loading...</h2> + { showSpinner && <LoadingSpinner /> } + <h2 className="text-normal text-grey-2 mt1"> + {loadingMessages[messageIndex]} + </h2> </div> : diff --git a/frontend/src/metabase/xray/containers/SegmentComparison.jsx b/frontend/src/metabase/xray/containers/SegmentComparison.jsx index c5c67a95d14..47e25a8ec4a 100644 --- a/frontend/src/metabase/xray/containers/SegmentComparison.jsx +++ b/frontend/src/metabase/xray/containers/SegmentComparison.jsx @@ -42,6 +42,7 @@ class SegmentComparison extends Component { try { await this.props.fetchSegmentComparison(segmentId1, segmentId2, cost) } catch (error) { + console.log('error', error) this.setState({ error }) } } @@ -63,6 +64,11 @@ class SegmentComparison extends Component { loading={!comparison} error={error} noBackground + loadingMessages={[ + 'Generating ypur comparison...', + 'Teaching robots to love...', + 'Still working...', + ]} > { () => diff --git a/frontend/src/metabase/xray/xray.js b/frontend/src/metabase/xray/xray.js index f464f051cd8..fa23ad4d5ee 100644 --- a/frontend/src/metabase/xray/xray.js +++ b/frontend/src/metabase/xray/xray.js @@ -84,6 +84,7 @@ export const fetchTableComparison = createThunkAction( return comparison } catch (error) { console.error(error) + return error } } ) -- GitLab