diff --git a/web/react/components/channel_loader.jsx b/web/react/components/channel_loader.jsx
index 6b80f6012c..525b67b5c0 100644
--- a/web/react/components/channel_loader.jsx
+++ b/web/react/components/channel_loader.jsx
@@ -9,6 +9,7 @@ var BrowserStore = require('../stores/browser_store.jsx');
var AsyncClient = require('../utils/async_client.jsx');
var SocketStore = require('../stores/socket_store.jsx');
var ChannelStore = require('../stores/channel_store.jsx');
+var PostStore = require('../stores/post_store.jsx');
var Constants = require('../utils/constants.jsx');
module.exports = React.createClass({
@@ -24,20 +25,24 @@ module.exports = React.createClass({
AsyncClient.getMyTeam();
/* End of async loads */
+ /* Perform pending post clean-up */
+ PostStore.clearPendingPosts();
+ /* End pending post clean-up */
/* Start interval functions */
- setInterval(function(){AsyncClient.getStatuses();}, 30000);
+ setInterval(
+ function pollStatuses() {
+ AsyncClient.getStatuses();
+ }, 30000);
/* End interval functions */
-
/* Start device tracking setup */
- var iOS = /(iPad|iPhone|iPod)/g.test( navigator.userAgent );
+ var iOS = (/(iPad|iPhone|iPod)/g).test(navigator.userAgent);
if (iOS) {
- $("body").addClass("ios");
+ $('body').addClass('ios');
}
/* End device tracking setup */
-
/* Start window active tracking setup */
window.isActive = true;
@@ -57,7 +62,7 @@ module.exports = React.createClass({
},
_onSocketChange: function(msg) {
if (msg && msg.user_id) {
- UserStore.setStatus(msg.user_id, "online");
+ UserStore.setStatus(msg.user_id, 'online');
}
},
render: function() {
diff --git a/web/react/components/create_comment.jsx b/web/react/components/create_comment.jsx
index fbb05c77f4..1de768872d 100644
--- a/web/react/components/create_comment.jsx
+++ b/web/react/components/create_comment.jsx
@@ -1,6 +1,7 @@
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
// See License.txt for license information.
+var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
var client = require('../utils/client.jsx');
var AsyncClient = require('../utils/async_client.jsx');
var SocketStore = require('../stores/socket_store.jsx');
@@ -13,6 +14,7 @@ var FileUpload = require('./file_upload.jsx');
var FilePreview = require('./file_preview.jsx');
var utils = require('../utils/utils.jsx');
var Constants = require('../utils/constants.jsx');
+var ActionTypes = Constants.ActionTypes;
module.exports = React.createClass({
lastTime: 0,
@@ -27,6 +29,8 @@ module.exports = React.createClass({
return;
}
+ this.setState({submitting: true, serverError: null});
+
var post = {};
post.filenames = [];
post.message = this.state.messageText;
@@ -47,17 +51,16 @@ module.exports = React.createClass({
post.parent_id = this.props.rootId;
post.filenames = this.state.previews;
var time = utils.getTimestamp();
- post.pending_post_id = user_id + ":"+ time;
+ post.pending_post_id = user_id + ':'+ time;
post.user_id = user_id;
post.create_at = time;
- this.setState({submitting: true, serverError: null});
+ PostStore.storePendingPost(post);
+ PostStore.storeCommentDraft(this.props.rootId, null);
+ this.setState({messageText: '', submitting: false, postError: null, previews: [], serverError: null});
client.createPost(post, ChannelStore.getCurrent(),
function(data) {
- PostStore.storeCommentDraft(this.props.rootId, null);
- this.setState({messageText: '', submitting: false, postError: null, serverError: null});
- this.clearPreviews();
AsyncClient.getPosts(true, this.props.channelId);
var channel = ChannelStore.get(this.props.channelId);
@@ -65,18 +68,22 @@ module.exports = React.createClass({
member.msg_count = channel.total_msg_count;
member.last_viewed_at = Date.now();
ChannelStore.setChannelMember(member);
+
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.RECIEVED_POST,
+ post: data
+ });
}.bind(this),
function(err) {
var state = {};
- state.serverError = err.message;
- state.submitting = false;
if (err.message === 'Invalid RootId parameter') {
if ($('#post_deleted').length > 0) {
$('#post_deleted').modal('show');
}
+ PostStore.removePendingPost(post.pending_post_id);
} else {
- post.did_fail = true;
+ post.state = Constants.POST_FAILED;
PostStore.updatePendingPost(post);
}
@@ -84,11 +91,6 @@ module.exports = React.createClass({
this.setState(state);
}.bind(this)
);
-
- post.is_loading = true;
- PostStore.storePendingPost(post);
- PostStore.storeCommentDraft(this.props.rootId, null);
- this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
},
commentMsgKeyPress: function(e) {
if (e.which === 13 && !e.shiftKey && !e.altKey) {
@@ -153,9 +155,6 @@ module.exports = React.createClass({
this.setState({serverError: err});
}
},
- clearPreviews: function() {
- this.setState({previews: []});
- },
removePreview: function(id) {
var previews = this.state.previews;
var uploadsInProgress = this.state.uploadsInProgress;
diff --git a/web/react/components/create_post.jsx b/web/react/components/create_post.jsx
index 8110f58869..8e9e957519 100644
--- a/web/react/components/create_post.jsx
+++ b/web/react/components/create_post.jsx
@@ -66,33 +66,44 @@ module.exports = React.createClass({
post.filenames = this.state.previews;
var time = utils.getTimestamp();
- post.pending_post_id = user_id + ":"+ time;
- post.user_id = user_id;
+ var userId = UserStore.getCurrentId();
+ post.pending_post_id = userId + ':' + time;
+ post.user_id = userId;
post.create_at = time;
post.root_id = this.state.rootId;
post.parent_id = this.state.parentId;
- var channel = ChannelStore.getCurrent();
+ var channel = ChannelStore.get(this.state.channelId);
+
+ PostStore.storePendingPost(post);
+ PostStore.storeDraft(channel.id, userId, null);
+ this.setState({messageText: '', submitting: false, postError: null, previews: [], serverError: null});
client.createPost(post, channel,
function(data) {
this.resizePostHolder();
AsyncClient.getPosts(true);
- var channel = ChannelStore.get(this.state.channelId);
- var member = ChannelStore.getMember(this.state.channelId);
+ var member = ChannelStore.getMember(channel.id);
member.msg_count = channel.total_msg_count;
member.last_viewed_at = Date.now();
ChannelStore.setChannelMember(member);
+
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.RECIEVED_POST,
+ post: data
+ });
}.bind(this),
function(err) {
- var state = {}
+ var state = {};
- if (err.message === "Invalid RootId parameter") {
- if ($('#post_deleted').length > 0) $('#post_deleted').modal('show');
+ if (err.message === 'Invalid RootId parameter') {
+ if ($('#post_deleted').length > 0) {
+ $('#post_deleted').modal('show');
+ }
PostStore.removePendingPost(post.pending_post_id);
} else {
- post.did_fail = true;
+ post.state = Constants.POST_FAILED;
PostStore.updatePendingPost(post);
}
@@ -100,11 +111,6 @@ module.exports = React.createClass({
this.setState(state);
}.bind(this)
);
-
- post.is_loading = true;
- PostStore.storePendingPost(post);
- PostStore.storeDraft(channel.id, user_id, null);
- this.setState({messageText: '', submitting: false, postError: null, previews: [], serverError: null});
}
$('.post-list-holder-by-time').perfectScrollbar('update');
@@ -218,10 +224,10 @@ module.exports = React.createClass({
var previews = [];
var messageText = '';
var uploadsInProgress = 0;
- if (draft && draft['previews'] && draft['message']) {
- previews = draft['previews'];
- messageText = draft['message'];
- uploadsInProgress = draft['uploadsInProgress'];
+ if (draft && draft.previews && draft.message) {
+ previews = draft.previews;
+ messageText = draft.message;
+ uploadsInProgress = draft.uploadsInProgress;
}
this.setState({channelId: channelId, messageText: messageText, initialText: messageText, submitting: false, serverError: null, postError: null, previews: previews, uploadsInProgress: uploadsInProgress});
@@ -229,19 +235,18 @@ module.exports = React.createClass({
},
getInitialState: function() {
PostStore.clearDraftUploads();
- PostStore.clearPendingPosts(ChannelStore.getCurrentId());
var draft = PostStore.getCurrentDraft();
var previews = [];
var messageText = '';
var uploadsInProgress = 0;
- if (draft && draft["previews"] && draft["message"]) {
- previews = draft['previews'];
- messageText = draft['message'];
- uploadsInProgress = draft['uploadsInProgress'];
+ if (draft && draft.previews && draft.message) {
+ previews = draft.previews;
+ messageText = draft.message;
+ uploadsInProgress = draft.uploadsInProgress;
}
- return { channelId: ChannelStore.getCurrentId(), messageText: messageText, uploadsInProgress: uploadsInProgress, previews: previews, submitting: false, initialText: messageText};
+ return {channelId: ChannelStore.getCurrentId(), messageText: messageText, uploadsInProgress: uploadsInProgress, previews: previews, submitting: false, initialText: messageText};
},
getFileCount: function(channelId) {
if (channelId === this.state.channelId) {
diff --git a/web/react/components/post.jsx b/web/react/components/post.jsx
index c985eaeb2f..cc505f91fe 100644
--- a/web/react/components/post.jsx
+++ b/web/react/components/post.jsx
@@ -44,20 +44,20 @@ module.exports = React.createClass({
function(data) {
AsyncClient.getPosts(true);
+ var channel = ChannelStore.get(post.channel_id);
var member = ChannelStore.getMember(post.channel_id);
member.msg_count = channel.total_msg_count;
member.last_viewed_at = (new Date).getTime();
ChannelStore.setChannelMember(member);
}.bind(this),
function(err) {
- post.did_fail = true;
+ post.state = Constants.POST_FAILED;
PostStore.updatePendingPost(post);
this.forceUpdate();
}.bind(this)
);
- post.did_fail = false;
- post.is_loading = true;
+ post.state = Constants.POST_LOADING;
PostStore.updatePendingPost(post);
this.forceUpdate();
},
@@ -69,9 +69,9 @@ module.exports = React.createClass({
var parentPost = this.props.parentPost;
var posts = this.props.posts;
- var type = "Post"
- if (post.root_id.length > 0) {
- type = "Comment"
+ var type = "Post";
+ if (post.root_id && post.root_id.length > 0) {
+ type = "Comment";
}
var commentCount = 0;
diff --git a/web/react/components/post_body.jsx b/web/react/components/post_body.jsx
index 65e045344d..77a8fd7b5f 100644
--- a/web/react/components/post_body.jsx
+++ b/web/react/components/post_body.jsx
@@ -4,6 +4,7 @@
var FileAttachmentList = require('./file_attachment_list.jsx');
var UserStore = require('../stores/user_store.jsx');
var utils = require('../utils/utils.jsx');
+var Constants = require('../utils/constants.jsx');
module.exports = React.createClass({
componentWillReceiveProps: function(nextProps) {
@@ -60,10 +61,10 @@ module.exports = React.createClass({
}
var loading;
- if (post.did_fail) {
+ if (post.state === Constants.POST_FAILED) {
postClass += " post-fail";
loading = Retry;
- } else if (post.is_loading) {
+ } else if (post.state === Constants.POST_LOADING) {
postClass += " post-waiting";
loading =
;
}
diff --git a/web/react/components/post_info.jsx b/web/react/components/post_info.jsx
index 93d028e185..37e5257170 100644
--- a/web/react/components/post_info.jsx
+++ b/web/react/components/post_info.jsx
@@ -15,19 +15,19 @@ module.exports = React.createClass({
var isOwner = UserStore.getCurrentId() == post.user_id;
var isAdmin = UserStore.getCurrentUser().roles.indexOf("admin") > -1
- var type = "Post"
- if (post.root_id.length > 0) {
- type = "Comment"
+ var type = "Post";
+ if (post.root_id && post.root_id.length > 0) {
+ type = "Comment";
}
var comments = "";
var lastCommentClass = this.props.isLastComment ? " comment-icon__container__show" : " comment-icon__container__hide";
- if (this.props.commentCount >= 1 && !post.did_fail && !post.is_loading) {
+ if (this.props.commentCount >= 1 && post.state !== Constants.POST_FAILED && post.state !== Constants.POST_LOADING) {
comments = {this.props.commentCount};
}
var show_dropdown = isOwner || (this.props.allowReply === "true" && type != "Comment");
- if (post.did_fail || post.is_loading) show_dropdown = false;
+ if (post.state === Constants.POST_FAILED || post.state === Constants.POST_LOADING) show_dropdown = false;
return (
{message}
- { post.filenames && post.filenames.length > 0 ? -
;
+ var postClass = '';
+ if (post.state === Constants.POST_FAILED) {
+ postClass += ' post-fail';
+ loading = Retry;
+ } else if (post.state === Constants.POST_LOADING) {
+ postClass += ' post-waiting';
+ loading =
;
+ }
+
+ var ownerOptions;
+ if (isOwner && post.state !== Constants.POST_FAILED && post.state !== Constants.POST_LOADING) {
+ ownerOptions = (
+
+ );
+ }
+
+ var fileAttachment;
+ if (post.filenames && post.filenames.length > 0) {
+ fileAttachment = (
+ {loading}{message}
- { post.filenames && post.filenames.length > 0 ? -