From cc40ca1ac01063441c35f8e5b57f813561a0b739 Mon Sep 17 00:00:00 2001 From: JoramWilander Date: Wed, 19 Aug 2015 09:52:03 -0400 Subject: Added a message deleted indicator when a post is deleted to let the user know what's happening. --- web/react/components/post_info.jsx | 4 ++++ web/react/components/post_list.jsx | 43 +++++++++++++++++++++++++------------- web/react/stores/post_store.jsx | 22 +++++++++++++++++++ web/react/utils/constants.jsx | 5 +++-- 4 files changed, 58 insertions(+), 16 deletions(-) (limited to 'web') diff --git a/web/react/components/post_info.jsx b/web/react/components/post_info.jsx index c5b015cb9..c96a04c7c 100644 --- a/web/react/components/post_info.jsx +++ b/web/react/components/post_info.jsx @@ -22,6 +22,10 @@ export default class PostInfo extends React.Component { var isOwner = UserStore.getCurrentId() === post.user_id; var isAdmin = UserStore.getCurrentUser().roles.indexOf('admin') > -1; + if (post.state === Constants.POST_FAILED || post.state === Constants.POST_LOADING || post.state === Constants.POST_DELETED) { + return ''; + } + var type = 'Post'; if (post.root_id && post.root_id.length > 0) { type = 'Comment'; diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx index bebd6847f..81b65174c 100644 --- a/web/react/components/post_list.jsx +++ b/web/react/components/post_list.jsx @@ -23,12 +23,31 @@ function getStateFromStores() { } var postList = PostStore.getCurrentPosts(); + var deletedPosts = PostStore.getUnseenDeletedPosts(channel.id); + + if (deletedPosts && Object.keys(deletedPosts).length > 0) { + for (var pid in deletedPosts) { + postList.posts[pid] = deletedPosts[pid]; + postList.order.unshift(pid); + } + + postList.order.sort(function postSort(a, b) { + if (postList.posts[a].create_at > postList.posts[b].create_at) { + return -1; + } + if (postList.posts[a].create_at < postList.posts[b].create_at) { + return 1; + } + return 0; + }); + } + var pendingPostList = PostStore.getPendingPosts(channel.id); if (pendingPostList) { postList.order = pendingPostList.order.concat(postList.order); - for (var pid in pendingPostList.posts) { - postList.posts[pid] = pendingPostList.posts[pid]; + for (var ppid in pendingPostList.posts) { + postList.posts[ppid] = pendingPostList.posts[ppid]; } } @@ -88,7 +107,6 @@ module.exports = React.createClass({ $('.modal-body').css('max-height', $(window).height() * 0.7); }); - // Timeout exists for the DOM to fully render before making changes var self = this; $(window).resize(function resize() { $(postHolder).perfectScrollbar('update'); @@ -185,6 +203,7 @@ module.exports = React.createClass({ } } if (this.state.channel.id !== newState.channel.id) { + PostStore.clearUnseenDeletedPosts(this.state.channel.id); this.scrolledToNew = false; } this.setState(newState); @@ -220,23 +239,19 @@ module.exports = React.createClass({ activeRootPostId = activeRoot.id; } - if (this.state.channel.id === msg.channel_id) { - postList = this.state.postList; - if (!(msg.props.post_id in this.state.postList.posts)) { - return; - } + post = JSON.parse(msg.props.post); + postList = this.state.postList; + + PostStore.storeUnseenDeletedPost(post); - delete postList.posts[msg.props.post_id]; - var index = postList.order.indexOf(msg.props.post_id); + if (postList.posts[post.id]) { + delete postList.posts[post.id]; + var index = postList.order.indexOf(post.id); if (index > -1) { postList.order.splice(index, 1); } - this.setState({postList: postList}); - PostStore.storePosts(msg.channel_id, postList); - } else { - AsyncClient.getPosts(true, msg.channel_id); } if (activeRootPostId === msg.props.post_id && UserStore.getCurrentId() !== msg.user_id) { diff --git a/web/react/stores/post_store.jsx b/web/react/stores/post_store.jsx index 3e4fde30a..2fffb17d0 100644 --- a/web/react/stores/post_store.jsx +++ b/web/react/stores/post_store.jsx @@ -172,6 +172,28 @@ var PostStore = assign({}, EventEmitter.prototype, { getPendingPosts: function(channelId) { return BrowserStore.getItem('pending_posts_' + channelId); }, + storeUnseenDeletedPost: function(post) { + var posts = this.getUnseenDeletedPosts(post.channel_id); + + if (!posts) { + posts = {}; + } + + post.message = '(message deleted)'; + post.state = Constants.POST_DELETED; + + posts[post.id] = post; + this.storeUnseenDeletedPosts(post.channel_id, posts); + }, + storeUnseenDeletedPosts: function(channelId, posts) { + BrowserStore.setItem('deleted_posts_' + channelId, posts); + }, + getUnseenDeletedPosts: function(channelId) { + return BrowserStore.getItem('deleted_posts_' + channelId); + }, + clearUnseenDeletedPosts: function(channelId) { + BrowserStore.setItem('deleted_posts_' + channelId, {}); + }, removePendingPost: function(channelId, pendingPostId) { this._removePendingPost(channelId, pendingPostId); this.emitChange(); diff --git a/web/react/utils/constants.jsx b/web/react/utils/constants.jsx index 41b02c8d6..8239a4a69 100644 --- a/web/react/utils/constants.jsx +++ b/web/react/utils/constants.jsx @@ -63,8 +63,9 @@ module.exports = { GOOGLE_SERVICE: 'google', POST_CHUNK_SIZE: 60, MAX_POST_CHUNKS: 3, - POST_LOADING: "loading", - POST_FAILED: "failed", + POST_LOADING: 'loading', + POST_FAILED: 'failed', + POST_DELETED: 'deleted', RESERVED_TEAM_NAMES: [ "www", "web", -- cgit v1.2.3-1-g7c22