summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--web/react/components/error_bar.jsx2
-rw-r--r--web/react/components/member_list_team.jsx8
-rw-r--r--web/react/components/more_channels.jsx2
-rw-r--r--web/react/components/post_list.jsx5
-rw-r--r--web/react/components/sidebar_right.jsx6
-rw-r--r--web/react/components/textbox.jsx50
-rw-r--r--web/react/stores/channel_store.jsx9
-rw-r--r--web/react/stores/error_store.jsx2
-rw-r--r--web/react/utils/async_client.jsx4
-rw-r--r--web/sass-files/sass/partials/_post.scss4
10 files changed, 65 insertions, 27 deletions
diff --git a/web/react/components/error_bar.jsx b/web/react/components/error_bar.jsx
index f23dc060e..d9d91ef51 100644
--- a/web/react/components/error_bar.jsx
+++ b/web/react/components/error_bar.jsx
@@ -9,7 +9,7 @@ var ActionTypes = Constants.ActionTypes;
function getStateFromStores() {
var error = ErrorStore.getLastError();
- if (error) {
+ if (error && error.message !== "There appears to be a problem with your internet connection") {
return { message: error.message };
} else {
return { message: null };
diff --git a/web/react/components/member_list_team.jsx b/web/react/components/member_list_team.jsx
index 3613d97d8..cfb473e5e 100644
--- a/web/react/components/member_list_team.jsx
+++ b/web/react/components/member_list_team.jsx
@@ -92,10 +92,10 @@ var MemberListTeamItem = React.createClass({
<span className="caret"></span>
</a>
<ul className="dropdown-menu member-menu" role="menu" aria-labelledby="channel_header_dropdown">
- { showMakeAdmin ? <li role="presentation"><a role="menuitem" onClick={this.handleMakeAdmin}>Make Admin</a></li> : "" }
- { showMakeMember ? <li role="presentation"><a role="menuitem" onClick={this.handleMakeMember}>Make Member</a></li> : "" }
- { showMakeActive ? <li role="presentation"><a role="menuitem" onClick={this.handleMakeActive}>Make Active</a></li> : "" }
- { showMakeNotActive ? <li role="presentation"><a role="menuitem" onClick={this.handleMakeNotActive}>Make Inactive</a></li> : "" }
+ { showMakeAdmin ? <li role="presentation"><a role="menuitem" href="#" onClick={this.handleMakeAdmin}>Make Admin</a></li> : "" }
+ { showMakeMember ? <li role="presentation"><a role="menuitem" href="#" onClick={this.handleMakeMember}>Make Member</a></li> : "" }
+ { showMakeActive ? <li role="presentation"><a role="menuitem" href="#" onClick={this.handleMakeActive}>Make Active</a></li> : "" }
+ { showMakeNotActive ? <li role="presentation"><a role="menuitem" href="#" onClick={this.handleMakeNotActive}>Make Inactive</a></li> : "" }
</ul>
</div>
{ server_error }
diff --git a/web/react/components/more_channels.jsx b/web/react/components/more_channels.jsx
index 1af259853..c3ddc76f3 100644
--- a/web/react/components/more_channels.jsx
+++ b/web/react/components/more_channels.jsx
@@ -79,7 +79,7 @@ module.exports = React.createClass({
<button data-toggle="modal" data-target="#new_channel" data-channeltype={this.state.channel_type} type="button" className="btn btn-primary channel-create-btn" onClick={this.handleNewChannel}>Create New Channel</button>
</div>
<div className="modal-body">
- {moreChannels ?
+ {!moreChannels.loading ?
(moreChannels.length ?
<table className="more-channel-table table">
<tbody>
diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx
index 177e4a1db..d6dc9ce30 100644
--- a/web/react/components/post_list.jsx
+++ b/web/react/components/post_list.jsx
@@ -78,7 +78,6 @@ module.exports = React.createClass({
PostStore.addChangeListener(this._onChange);
ChannelStore.addChangeListener(this._onChange);
- UserStore.addStatusesChangeListener(this._onChange);
SocketStore.addChangeListener(this._onSocketChange);
$(".post-list-holder-by-time").perfectScrollbar();
@@ -158,7 +157,6 @@ module.exports = React.createClass({
componentWillUnmount: function() {
PostStore.removeChangeListener(this._onChange);
ChannelStore.removeChangeListener(this._onChange);
- UserStore.removeStatusesChangeListener(this._onChange);
SocketStore.removeChangeListener(this._onSocketChange);
$('body').off('click.userpopover');
},
@@ -195,9 +193,6 @@ module.exports = React.createClass({
this.scrolledToNew = false;
}
this.setState(newState);
- } else {
- // Updates the timestamp on each post
- this.forceUpdate()
}
},
_onSocketChange: function(msg) {
diff --git a/web/react/components/sidebar_right.jsx b/web/react/components/sidebar_right.jsx
index 60c8ffae6..8334b345b 100644
--- a/web/react/components/sidebar_right.jsx
+++ b/web/react/components/sidebar_right.jsx
@@ -16,16 +16,10 @@ module.exports = React.createClass({
componentDidMount: function() {
PostStore.addSearchChangeListener(this._onSearchChange);
PostStore.addSelectedPostChangeListener(this._onSelectedChange);
- UserStore.addStatusesChangeListener(this._onChange);
},
componentWillUnmount: function() {
PostStore.removeSearchChangeListener(this._onSearchChange);
PostStore.removeSelectedPostChangeListener(this._onSelectedChange);
- UserStore.removeStatusesChangeListener(this._onChange);
- },
- _onChange: function() {
- // Updates the timestamp on each post
- this.forceUpdate();
},
_onSelectedChange: function(from_search) {
if (this.isMounted()) {
diff --git a/web/react/components/textbox.jsx b/web/react/components/textbox.jsx
index 6b746aa78..ad50b7920 100644
--- a/web/react/components/textbox.jsx
+++ b/web/react/components/textbox.jsx
@@ -8,11 +8,23 @@ var SocketStore = require('../stores/socket_store.jsx');
var MsgTyping = require('./msg_typing.jsx');
var MentionList = require('./mention_list.jsx');
var CommandList = require('./command_list.jsx');
+var ErrorStore = require('../stores/error_store.jsx');
+var AsyncClient = require('../utils/async_client.jsx');
var utils = require('../utils/utils.jsx');
var Constants = require('../utils/constants.jsx');
var ActionTypes = Constants.ActionTypes;
+function getStateFromStores() {
+ var error = ErrorStore.getLastError();
+
+ if (error) {
+ return { message: error.message };
+ } else {
+ return { message: null };
+ }
+}
+
module.exports = React.createClass({
caret: -1,
addedMention: false,
@@ -20,6 +32,7 @@ module.exports = React.createClass({
mentions: [],
componentDidMount: function() {
PostStore.addAddMentionListener(this._onChange);
+ ErrorStore.addChangeListener(this._onError);
this.resize();
this.processMentions();
@@ -27,11 +40,44 @@ module.exports = React.createClass({
},
componentWillUnmount: function() {
PostStore.removeAddMentionListener(this._onChange);
+ ErrorStore.removeChangeListener(this._onError);
},
_onChange: function(id, username) {
if (id !== this.props.id) return;
this.addMention(username);
},
+ _onError: function() {
+ var errorState = getStateFromStores();
+
+ if (this.state.timerInterrupt != null) {
+ window.clearInterval(this.state.timerInterrupt);
+ this.setState({ timerInterrupt: null });
+ }
+
+ if (errorState.message === "There appears to be a problem with your internet connection") {
+ this.setState({ connection: "bad-connection" });
+ var timerInterrupt = window.setInterval(this._onTimerInterrupt, 5000);
+ this.setState({ timerInterrupt: timerInterrupt });
+ }
+ else {
+ this.setState({ connection: "" });
+ }
+ },
+ _onTimerInterrupt: function() {
+ //Since these should only happen when you have no connection and slightly briefly after any
+ //performance hit should not matter
+ if (this.state.connection === "bad-connection") {
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.RECIEVED_ERROR,
+ err: null
+ });
+
+ AsyncClient.updateLastViewedAt();
+ }
+
+ window.clearInterval(this.state.timerInterrupt);
+ this.setState({ timerInterrupt: null });
+ },
componentDidUpdate: function() {
if (this.caret >= 0) {
utils.setCaretPosition(this.refs.message.getDOMNode(), this.caret)
@@ -57,7 +103,7 @@ module.exports = React.createClass({
this.resize();
},
getInitialState: function() {
- return { mentionText: '-1', mentions: [] };
+ return { mentionText: '-1', mentions: [], connection: "", timerInterrupt: null };
},
updateMentionTab: function(mentionText, excludeList) {
var self = this;
@@ -287,7 +333,7 @@ module.exports = React.createClass({
<div ref="wrapper" className="textarea-wrapper">
<CommandList ref='commands' addCommand={this.addCommand} channelId={this.props.channelId} />
<div className="form-control textarea-div" ref="textdiv"/>
- <textarea id={this.props.id} ref="message" className="form-control custom-textarea" spellCheck="true" autoComplete="off" autoCorrect="off" rows="1" placeholder={this.props.createMessage} value={this.props.messageText} onInput={this.handleChange} onChange={this.handleChange} onKeyPress={this.handleKeyPress} onKeyDown={this.handleKeyDown} onScroll={this.scroll} onFocus={this.handleFocus} onBlur={this.handleBlur} onPaste={this.handlePaste} />
+ <textarea id={this.props.id} ref="message" className={"form-control custom-textarea " + this.state.connection} spellCheck="true" autoComplete="off" autoCorrect="off" rows="1" placeholder={this.props.createMessage} value={this.props.messageText} onInput={this.handleChange} onChange={this.handleChange} onKeyPress={this.handleKeyPress} onKeyDown={this.handleKeyDown} onScroll={this.scroll} onFocus={this.handleFocus} onBlur={this.handleBlur} onPaste={this.handlePaste} />
</div>
);
}
diff --git a/web/react/stores/channel_store.jsx b/web/react/stores/channel_store.jsx
index 340ce9922..4429a5312 100644
--- a/web/react/stores/channel_store.jsx
+++ b/web/react/stores/channel_store.jsx
@@ -202,16 +202,17 @@ var ChannelStore = assign({}, EventEmitter.prototype, {
BrowserStore.setItem("more_channels", JSON.stringify(channels));
},
_getMoreChannels: function() {
- var channels;
+ var channels = null;
try {
channels = JSON.parse(BrowserStore.getItem("more_channels"));
}
catch (err) {
}
- if (channels == null) {
- channels = [];
- }
+ if (channels == null) {
+ channels = {};
+ channels.loading = true;
+ }
return channels;
},
diff --git a/web/react/stores/error_store.jsx b/web/react/stores/error_store.jsx
index c20e15680..3aed6aef2 100644
--- a/web/react/stores/error_store.jsx
+++ b/web/react/stores/error_store.jsx
@@ -31,7 +31,7 @@ var ErrorStore = assign({}, EventEmitter.prototype, {
getLastError: function() {
var error = null;
try {
- error = JSON.parse(BrowserStore.last_error);
+ error = JSON.parse(BrowserStore.getItem("last_error"));
}
catch (err) {
}
diff --git a/web/react/utils/async_client.jsx b/web/react/utils/async_client.jsx
index 87dc91200..00bd83ed1 100644
--- a/web/react/utils/async_client.jsx
+++ b/web/react/utils/async_client.jsx
@@ -15,8 +15,6 @@ var ActionTypes = Constants.ActionTypes;
var callTracker = {};
var dispatchError = function(err, method) {
- if (err.message === "There appears to be a problem with your internet connection") return;
-
AppDispatcher.handleServerAction({
type: ActionTypes.RECIEVED_ERROR,
err: err,
@@ -104,7 +102,7 @@ module.exports.updateLastViewedAt = function() {
module.exports.getMoreChannels = function(force) {
if (isCallInProgress("getMoreChannels")) return;
- if (!ChannelStore.getMoreAll() || force) {
+ if (ChannelStore.getMoreAll().loading || force) {
callTracker["getMoreChannels"] = utils.getTimestamp();
client.getMoreChannels(
diff --git a/web/sass-files/sass/partials/_post.scss b/web/sass-files/sass/partials/_post.scss
index 2d5cd67db..d0c536363 100644
--- a/web/sass-files/sass/partials/_post.scss
+++ b/web/sass-files/sass/partials/_post.scss
@@ -11,6 +11,10 @@
min-height:36px;
}
+.bad-connection {
+ background-color: rgb(255, 255, 172);
+}
+
.textarea-div {
white-space:pre-wrap;
word-wrap:normal;