blob: ba77a7911021251459f85aa5bbd3a1c76e9ce665 [file] [log] [blame]
/*
*
* Copyright 2016 RIFT.IO Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import React from 'react';
import Loader from 'widgets/loading-indicator/loadingIndicator.jsx';
//Currently displays all buffer state messages. Should consider showing only the n most recent.
//TODO remove loader when current state is running
//TODO need to look at refactoring this
class ThrottledMessage extends React.Component {
constructor(props) {
super(props);
let self = this;
this.displayBuffer = [];
this.bufferInterval;
this.last_id = null;
this.state = {};
this.state.loading = props.loading;
this.state.buffer = {};
this.state.displayMessage = 'Loading...'
}
componentWillReceiveProps(nextProps) {
let buffer = nextProps.buffer;
if(buffer.length) {
this.buildBufferObject(nextProps);
this.bufferIt(this.props);
}
}
componentDidMount() {
if(this.props.buffer.length) {
let buffer = this.props.buffer;
this.buildBufferObject(this.props);
this.bufferIt(this.props);
}
}
componentWillUnmount() {
clearInterval(this.bufferInterval);
}
buildBufferObject(props) {
let self = this;
let buffer = self.state.buffer;
this.last_id = props.buffer[props.buffer.length -1].id;
props.buffer.map(function(item) {
if(!buffer[item.id]) {
buffer[item.id] = {
displayed: false,
data: item
}
self.displayBuffer.push(buffer[item.id]);
}
});
}
bufferIt(props) {
let self = this
clearInterval(self.bufferInterval);
self.bufferInterval = setInterval(function() {
let currentStatus = self.props.currentStatus;
let failed = currentStatus == 'failed';
for (let i = 0; i < self.displayBuffer.length; i++) {
if(!self.displayBuffer[i].displayed) {
self.displayBuffer[i].displayed = true;
let displaymsg;
if(failed) {
displaymsg = self.displayBuffer[self.displayBuffer.length-1].data.description;
clearInterval(self.bufferInterval);
self.props.onEnd(failed);
} else {
displaymsg = self.displayBuffer[i].data.description;
}
self.setState({
displayMessage: displaymsg
});
break;
}
}
if((currentStatus == 'running' || currentStatus == 'started' || currentStatus == 'stopped' || failed) && self.displayBuffer[self.displayBuffer.length - 1].displayed ) {
clearInterval(self.bufferInterval);
self.props.onEnd(failed);
}
}, 600)
}
render() {
if(!this.props.hasFailed) {
return (<span className='throttledMessageText'>{this.state.displayMessage}</span>)
} else {
return (<span> </span>)
}
}
}
ThrottledMessage.defaultProps = {
buffer: []
}
export default class operationalStatus extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.state.message = 'Loading...';
this.state.messageHistory = {};
}
componentWillReceiveProps(nextProps) {
}
finishedMessages(){
this.setState({
loading: false
})
}
statusMessage(currentStatus, currentStatusDetails) {
var message = currentStatus;
if (currentStatusDetails) {
message += ' - ' + currentStatusDetails;
}
return message;
}
render() {
let html;
let isDisplayed = this.props.display;
let isFailed = (this.props.currentStatus == 'failed') || false;
let title = (!this.props.loading || isFailed) ? <h2>History</h2> : '';
let status = this.props.status.map(function(status, index) {
return (
<li key={index}>
{status.description}
{status.details ? (
<ul>
<li>{status.details}
</li>
</ul>) : null}
</li>
)
}).reverse();
if(this.props.loading) {
if (!isFailed) {
isDisplayed = true;
//If there is no collection of status event message, just display currentStatus
if(status.length) {
html = (
<div className={this.props.className + '_loading'}>
<Loader show={!isFailed}/>
<ThrottledMessage currentStatus={this.props.currentStatus} buffer={this.props.status} onEnd={this.props.doneLoading}/>
</div>
)
} else {
html = (
<div className={this.props.className + '_loading'}>
<Loader show={!isFailed}/>
{this.statusMessage(this.props.currentStatus,this.props.currentStatusDetails)}
</div>
)
}
} else {
isDisplayed = true;
html = (
<ul>
<ThrottledMessage currentStatus={this.props.currentStatus} buffer={this.props.status} onEnd={this.props.doneLoading} hasFailed={isFailed}/>
{status}
</ul>
)
}
} else {
html = (
<ul>
{status}
</ul>
)
}
return (<div className={this.props.className + (isDisplayed ? '_open':'_close')}>{title} {html}</div>);
}
}
operationalStatus.defaultProps = {
status: [],
loading: true,
display: false
}