From 6399a94ce221be3d15e7132654c28cd953075ec6 Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Fri, 27 May 2016 16:01:28 -0400 Subject: PLT-2672 Refactored posts view with caching (#3054) * Refactored posts view to use view controller design * Add post view caching * Required updates after rebase * Fixed bug where current channel not set yet was causing breakage --- .../post_view/post_focus_view_controller.jsx | 128 +++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 webapp/components/post_view/post_focus_view_controller.jsx (limited to 'webapp/components/post_view/post_focus_view_controller.jsx') diff --git a/webapp/components/post_view/post_focus_view_controller.jsx b/webapp/components/post_view/post_focus_view_controller.jsx new file mode 100644 index 000000000..7c1da6566 --- /dev/null +++ b/webapp/components/post_view/post_focus_view_controller.jsx @@ -0,0 +1,128 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import PostList from './components/post_list.jsx'; +import LoadingScreen from 'components/loading_screen.jsx'; + +import PostStore from 'stores/post_store.jsx'; +import UserStore from 'stores/user_store.jsx'; +import ChannelStore from 'stores/channel_store.jsx'; + +import Constants from 'utils/constants.jsx'; +const ScrollTypes = Constants.ScrollTypes; + +import React from 'react'; + +export default class PostFocusView extends React.Component { + constructor(props) { + super(props); + + this.onChannelChange = this.onChannelChange.bind(this); + this.onPostsChange = this.onPostsChange.bind(this); + this.onUserChange = this.onUserChange.bind(this); + this.onPostListScroll = this.onPostListScroll.bind(this); + + const focusedPostId = PostStore.getFocusedPostId(); + + const channel = ChannelStore.getCurrent(); + let profiles = UserStore.getProfiles(); + if (channel && channel.type === Constants.DM_CHANNEL) { + profiles = Object.assign({}, profiles, UserStore.getDirectProfiles()); + } + + this.state = { + postList: PostStore.getVisiblePosts(focusedPostId), + currentUser: UserStore.getCurrentUser(), + profiles, + scrollType: ScrollTypes.POST, + currentChannel: ChannelStore.getCurrentId().slice(), + scrollPostId: focusedPostId, + atTop: PostStore.getVisibilityAtTop(focusedPostId), + atBottom: PostStore.getVisibilityAtBottom(focusedPostId) + }; + } + + componentDidMount() { + ChannelStore.addChangeListener(this.onChannelChange); + PostStore.addChangeListener(this.onPostsChange); + UserStore.addChangeListener(this.onUserChange); + } + + componentWillUnmount() { + ChannelStore.removeChangeListener(this.onChannelChange); + PostStore.removeChangeListener(this.onPostsChange); + UserStore.removeChangeListener(this.onUserChange); + } + + onChannelChange() { + const currentChannel = ChannelStore.getCurrentId(); + if (this.state.currentChannel !== currentChannel) { + this.setState({ + currentChannel: currentChannel.slice(), + scrollType: ScrollTypes.POST + }); + } + } + + onPostsChange() { + const focusedPostId = PostStore.getFocusedPostId(); + if (focusedPostId == null) { + return; + } + + this.setState({ + scrollPostId: focusedPostId, + postList: PostStore.getVisiblePosts(focusedPostId), + atTop: PostStore.getVisibilityAtTop(focusedPostId), + atBottom: PostStore.getVisibilityAtBottom(focusedPostId) + }); + } + + onUserChange() { + const channel = ChannelStore.getCurrent(); + let profiles = UserStore.getProfiles(); + if (channel && channel.type === Constants.DM_CHANNEL) { + profiles = Object.assign({}, profiles, UserStore.getDirectProfiles()); + } + this.setState({currentUser: UserStore.getCurrentUser(), profiles: JSON.parse(JSON.stringify(profiles))}); + } + + onPostListScroll() { + this.setState({scrollType: ScrollTypes.FREE}); + } + + render() { + const postsToHighlight = {}; + postsToHighlight[this.state.scrollPostId] = true; + + let content; + if (this.state.postList == null) { + content = ( + + ); + } else { + content = ( + + ); + } + + return ( +
+ {content} +
+ ); + } +} -- cgit v1.2.3-1-g7c22