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 (