// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // See License.txt for license information. var PostStore = require('../stores/post_store.jsx'); var ChannelStore = require('../stores/channel_store.jsx'); var UserProfile = require('./user_profile.jsx'); var UserStore = require('../stores/user_store.jsx'); var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); var utils = require('../utils/utils.jsx'); var SearchBox = require('./search_bar.jsx'); var CreateComment = require('./create_comment.jsx'); var Constants = require('../utils/constants.jsx'); var FileAttachmentList = require('./file_attachment_list.jsx'); var FileUploadOverlay = require('./file_upload_overlay.jsx'); var client = require('../utils/client.jsx'); var AsyncClient = require('../utils/async_client.jsx'); var ActionTypes = Constants.ActionTypes; RhsHeaderPost = React.createClass({ handleClose: function(e) { e.preventDefault(); AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_SEARCH, results: null }); AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_POST_SELECTED, results: null }); }, handleBack: function(e) { e.preventDefault(); AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_SEARCH_TERM, term: this.props.fromSearch, do_search: true, is_mention_search: this.props.isMentionSearch }); AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_POST_SELECTED, results: null }); }, render: function() { var back; if (this.props.fromSearch) { back = ; } return (
{back}Message Details
); } }); RootPost = React.createClass({ render: function() { var post = this.props.post; var message = utils.textToJsx(post.message); var isOwner = UserStore.getCurrentId() === post.user_id; var timestamp = UserStore.getProfile(post.user_id).update_at; var channel = ChannelStore.get(post.channel_id); var type = 'Post'; if (post.root_id.length > 0) { type = 'Comment'; } var currentUserCss = ''; if (UserStore.getCurrentId() === post.user_id) { currentUserCss = 'current--user'; } var channelName; if (channel) { if (channel.type === 'D') { channelName = 'Private Message'; } else { channelName = channel.display_name; } } var ownerOptions; if (isOwner) { ownerOptions = (
); } var fileAttachment; if (post.filenames && post.filenames.length > 0) { fileAttachment = ( ); } return (
{ channelName }
  • {ownerOptions}

{message}

{fileAttachment}

); } }); CommentPost = React.createClass({ retryComment: function(e) { e.preventDefault(); var post = this.props.post; client.createPost(post, post.channel_id, function success(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); AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_POST, post: data }); }.bind(this), function fail() { post.state = Constants.POST_FAILED; PostStore.updatePendingPost(post); this.forceUpdate(); }.bind(this) ); post.state = Constants.POST_LOADING; PostStore.updatePendingPost(post); this.forceUpdate(); }, render: function() { var post = this.props.post; var currentUserCss = ''; if (UserStore.getCurrentId() === post.user_id) { currentUserCss = 'current--user'; } var isOwner = UserStore.getCurrentId() === post.user_id; var type = 'Post'; if (post.root_id.length > 0) { type = 'Comment'; } var message = utils.textToJsx(post.message); var timestamp = UserStore.getCurrentUser().update_at; var loading; 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 = ( ); } return (
  • {ownerOptions}

{loading}{message}

{fileAttachment}
); } }); function getStateFromStores() { var postList = PostStore.getSelectedPost(); if (!postList || postList.order.length < 1) { return {postList: {}}; } var channelId = postList.posts[postList.order[0]].channel_id; var pendingPostList = PostStore.getPendingPosts(channelId); if (pendingPostList) { for (var pid in pendingPostList.posts) { postList.posts[pid] = pendingPostList.posts[pid]; } } return {postList: postList}; } module.exports = React.createClass({ componentDidMount: function() { PostStore.addSelectedPostChangeListener(this.onChange); PostStore.addChangeListener(this.onChangeAll); UserStore.addStatusesChangeListener(this.onTimeChange); this.resize(); var self = this; $(window).resize(function() { self.resize(); }); }, componentDidUpdate: function() { $('.post-right__scroll').scrollTop($('.post-right__scroll')[0].scrollHeight); $('.post-right__scroll').perfectScrollbar('update'); this.resize(); }, componentWillUnmount: function() { PostStore.removeSelectedPostChangeListener(this.onChange); PostStore.removeChangeListener(this.onChangeAll); UserStore.removeStatusesChangeListener(this.onTimeChange); }, onChange: function() { if (this.isMounted()) { var newState = getStateFromStores(); if (!utils.areStatesEqual(newState, this.state)) { this.setState(newState); } } }, onChangeAll: function() { if (this.isMounted()) { // if something was changed in the channel like adding a // comment or post then lets refresh the sidebar list var currentSelected = PostStore.getSelectedPost(); if (!currentSelected || currentSelected.order.length === 0) { return; } var currentPosts = PostStore.getPosts(currentSelected.posts[currentSelected.order[0]].channel_id); if (!currentPosts || currentPosts.order.length === 0) { return; } if (currentPosts.posts[currentPosts.order[0]].channel_id === currentSelected.posts[currentSelected.order[0]].channel_id) { currentSelected.posts = {}; for (var postId in currentPosts.posts) { currentSelected.posts[postId] = currentPosts.posts[postId]; } PostStore.storeSelectedPost(currentSelected); } this.setState(getStateFromStores()); } }, onTimeChange: function() { for (var id in this.state.postList.posts) { if (!this.refs[id]) { continue; } this.refs[id].forceUpdate(); } }, getInitialState: function() { return getStateFromStores(); }, resize: function() { var height = $(window).height() - $('#error_bar').outerHeight() - 100; $('.post-right__scroll').css('height', height + 'px'); $('.post-right__scroll').scrollTop(100000); $('.post-right__scroll').perfectScrollbar(); $('.post-right__scroll').perfectScrollbar('update'); }, render: function() { var postList = this.state.postList; if (postList == null) { return (
); } var selectedPost = postList.posts[postList.order[0]]; var rootPost = null; if (selectedPost.root_id === '') { rootPost = selectedPost; } else { rootPost = postList.posts[selectedPost.root_id]; } var postsArray = []; for (var postId in postList.posts) { var cpost = postList.posts[postId]; if (cpost.root_id === rootPost.id) { postsArray.push(cpost); } } postsArray.sort(function postSort(a, b) { if (a.create_at < b.create_at) { return -1; } if (a.create_at > b.create_at) { return 1; } return 0; }); var currentId = UserStore.getCurrentId(); var searchForm; if (currentId != null) { searchForm = ; } return (
{searchForm}
{postsArray.map(function mapPosts(comPost) { return ; })}
); } });