* Added a RECEIVED_SEARCH_TERM event on search form submit, attempted to modify Search Results Header title when loading search results * Fixed RHS behaviour so that loading icon is shown while waiting for search results on slow connections. * PLT-7140: Fixed all eslint issues * PLT-7140: reverted changes to config/config.json that were accidentally committed * PLT-7140: Removed all static function decorators that I previously added to jsx files. These were suggested by eslint, but can cause issues for functions that override parent functionality. still can't reproduce the errors seen on spinmint locally, so I'm guessing at this point * PLT-7140: Changed var to const * Updating UI for search results loading (#7096)
265 строки
9.2 KiB
JavaScript
265 строки
9.2 KiB
JavaScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import $ from 'jquery';
|
|
|
|
import SearchResults from 'components/search_results.jsx';
|
|
import RhsThread from 'components/rhs_thread';
|
|
import SearchBox from 'components/search_bar.jsx';
|
|
import FileUploadOverlay from 'components/file_upload_overlay.jsx';
|
|
import SearchStore from 'stores/search_store.jsx';
|
|
import PostStore from 'stores/post_store.jsx';
|
|
import UserStore from 'stores/user_store.jsx';
|
|
import PreferenceStore from 'stores/preference_store.jsx';
|
|
import WebrtcStore from 'stores/webrtc_store.jsx';
|
|
|
|
import {getFlaggedPosts, getPinnedPosts} from 'actions/post_actions.jsx';
|
|
import {trackEvent} from 'actions/diagnostics_actions.jsx';
|
|
import {postListScrollChange} from 'actions/global_actions.jsx';
|
|
|
|
import * as Utils from 'utils/utils.jsx';
|
|
import Constants from 'utils/constants.jsx';
|
|
|
|
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
|
|
export default class SidebarRight extends React.Component {
|
|
static propTypes = {
|
|
channel: PropTypes.object,
|
|
postRightVisible: PropTypes.bool,
|
|
fromSearch: PropTypes.string,
|
|
fromFlaggedPosts: PropTypes.bool,
|
|
fromPinnedPosts: PropTypes.bool
|
|
}
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.plScrolledToBottom = true;
|
|
|
|
this.onPreferenceChange = this.onPreferenceChange.bind(this);
|
|
this.onPostPinnedChange = this.onPostPinnedChange.bind(this);
|
|
this.onSearchChange = this.onSearchChange.bind(this);
|
|
this.onUserChange = this.onUserChange.bind(this);
|
|
this.onShowSearch = this.onShowSearch.bind(this);
|
|
this.onShrink = this.onShrink.bind(this);
|
|
this.toggleSize = this.toggleSize.bind(this);
|
|
|
|
this.doStrangeThings = this.doStrangeThings.bind(this);
|
|
|
|
this.state = {
|
|
searchVisible: SearchStore.getSearchResults() !== null,
|
|
isMentionSearch: SearchStore.getIsMentionSearch(),
|
|
isFlaggedPosts: SearchStore.getIsFlaggedPosts(),
|
|
isPinnedPosts: SearchStore.getIsPinnedPosts(),
|
|
expanded: false,
|
|
fromSearch: false,
|
|
currentUser: UserStore.getCurrentUser(),
|
|
useMilitaryTime: PreferenceStore.getBool(Constants.Preferences.CATEGORY_DISPLAY_SETTINGS, Constants.Preferences.USE_MILITARY_TIME, false)
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
SearchStore.addSearchChangeListener(this.onSearchChange);
|
|
PostStore.addPostPinnedChangeListener(this.onPostPinnedChange);
|
|
SearchStore.addShowSearchListener(this.onShowSearch);
|
|
UserStore.addChangeListener(this.onUserChange);
|
|
PreferenceStore.addChangeListener(this.onPreferenceChange);
|
|
this.doStrangeThings();
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
SearchStore.removeSearchChangeListener(this.onSearchChange);
|
|
PostStore.removePostPinnedChangeListener(this.onPostPinnedChange);
|
|
SearchStore.removeShowSearchListener(this.onShowSearch);
|
|
UserStore.removeChangeListener(this.onUserChange);
|
|
PreferenceStore.removeChangeListener(this.onPreferenceChange);
|
|
}
|
|
|
|
shouldComponentUpdate(nextProps, nextState) {
|
|
return !Utils.areObjectsEqual(nextState, this.state) || this.props.postRightVisible !== nextProps.postRightVisible;
|
|
}
|
|
|
|
componentWillUpdate(nextProps, nextState) {
|
|
const isOpen = this.state.searchVisible || this.props.postRightVisible;
|
|
const willOpen = nextState.searchVisible || nextProps.postRightVisible;
|
|
|
|
if (!isOpen && willOpen) {
|
|
trackEvent('ui', 'ui_rhs_opened');
|
|
}
|
|
|
|
if (!isOpen && willOpen) {
|
|
this.setState({
|
|
expanded: false
|
|
});
|
|
}
|
|
}
|
|
|
|
doStrangeThings() {
|
|
// We should have a better way to do this stuff
|
|
// Hence the function name.
|
|
$('.app__body .inner-wrap').removeClass('.move--right');
|
|
$('.app__body .inner-wrap').addClass('move--left');
|
|
$('.app__body .sidebar--left').removeClass('move--right');
|
|
$('.multi-teams .team-sidebar').removeClass('move--right');
|
|
$('.app__body .sidebar--right').addClass('move--left');
|
|
|
|
//$('.sidebar--right').prepend('<div class="sidebar__overlay"></div>');
|
|
if (!this.state.searchVisible && !this.props.postRightVisible) {
|
|
$('.app__body .inner-wrap').removeClass('move--left').removeClass('move--right');
|
|
$('.app__body .sidebar--right').removeClass('move--left');
|
|
return (
|
|
<div/>
|
|
);
|
|
}
|
|
|
|
/*setTimeout(() => {
|
|
$('.sidebar__overlay').fadeOut('200', () => {
|
|
$('.sidebar__overlay').remove();
|
|
});
|
|
}, 500);*/
|
|
return null;
|
|
}
|
|
|
|
componentDidUpdate(prevProps, prevState) {
|
|
const isOpen = this.state.searchVisible || this.props.postRightVisible;
|
|
WebrtcStore.emitRhsChanged(isOpen);
|
|
this.doStrangeThings();
|
|
|
|
const wasOpen = prevState.searchVisible || prevProps.postRightVisible;
|
|
|
|
if (isOpen && !wasOpen) {
|
|
setTimeout(() => postListScrollChange(), 0);
|
|
}
|
|
}
|
|
|
|
onPreferenceChange() {
|
|
if (this.state.isFlaggedPosts) {
|
|
getFlaggedPosts();
|
|
}
|
|
|
|
this.setState({
|
|
useMilitaryTime: PreferenceStore.getBool(Constants.Preferences.CATEGORY_DISPLAY_SETTINGS, Constants.Preferences.USE_MILITARY_TIME, false)
|
|
});
|
|
}
|
|
|
|
onPostPinnedChange() {
|
|
if (this.props.channel && this.state.isPinnedPosts) {
|
|
getPinnedPosts(this.props.channel.id);
|
|
}
|
|
}
|
|
|
|
onShrink() {
|
|
this.setState({
|
|
expanded: false
|
|
});
|
|
}
|
|
|
|
onSearchChange() {
|
|
this.setState({
|
|
searchVisible: SearchStore.getSearchResults() !== null || SearchStore.isLoading(),
|
|
isMentionSearch: SearchStore.getIsMentionSearch(),
|
|
isFlaggedPosts: SearchStore.getIsFlaggedPosts(),
|
|
isPinnedPosts: SearchStore.getIsPinnedPosts()
|
|
});
|
|
}
|
|
|
|
onUserChange() {
|
|
this.setState({
|
|
currentUser: UserStore.getCurrentUser()
|
|
});
|
|
}
|
|
|
|
onShowSearch() {
|
|
if (!this.state.searchVisible) {
|
|
this.setState({
|
|
searchVisible: true
|
|
});
|
|
}
|
|
}
|
|
|
|
toggleSize() {
|
|
this.setState({expanded: !this.state.expanded});
|
|
}
|
|
|
|
render() {
|
|
let content = null;
|
|
let expandedClass = '';
|
|
|
|
if (this.state.expanded) {
|
|
expandedClass = 'sidebar--right--expanded';
|
|
}
|
|
|
|
var currentId = UserStore.getCurrentId();
|
|
var searchForm = null;
|
|
if (currentId) {
|
|
searchForm = <SearchBox isFocus={this.state.searchVisible && Utils.isMobile()}/>;
|
|
}
|
|
|
|
const channel = this.props.channel;
|
|
|
|
let channelDisplayName = '';
|
|
if (channel) {
|
|
if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {
|
|
channelDisplayName = Utils.localizeMessage('rhs_root.direct', 'Direct Message');
|
|
} else {
|
|
channelDisplayName = channel.display_name;
|
|
}
|
|
}
|
|
|
|
if (this.state.searchVisible) {
|
|
content = (
|
|
<div className='sidebar--right__content'>
|
|
<div className='search-bar__container channel-header alt'>{searchForm}</div>
|
|
<SearchResults
|
|
isMentionSearch={this.state.isMentionSearch}
|
|
isFlaggedPosts={this.state.isFlaggedPosts}
|
|
isPinnedPosts={this.state.isPinnedPosts}
|
|
useMilitaryTime={this.state.useMilitaryTime}
|
|
toggleSize={this.toggleSize}
|
|
shrink={this.onShrink}
|
|
channelDisplayName={channelDisplayName}
|
|
/>
|
|
</div>
|
|
);
|
|
} else if (this.props.postRightVisible) {
|
|
content = (
|
|
<div className='post-right__container'>
|
|
<FileUploadOverlay overlayType='right'/>
|
|
<div className='search-bar__container channel-header alt'>{searchForm}</div>
|
|
<RhsThread
|
|
fromFlaggedPosts={this.props.fromFlaggedPosts}
|
|
fromSearch={this.props.fromSearch}
|
|
fromPinnedPosts={this.props.fromPinnedPosts}
|
|
isWebrtc={WebrtcStore.isBusy()}
|
|
isMentionSearch={this.state.isMentionSearch}
|
|
currentUser={this.state.currentUser}
|
|
useMilitaryTime={this.state.useMilitaryTime}
|
|
toggleSize={this.toggleSize}
|
|
shrink={this.onShrink}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (!content) {
|
|
expandedClass = '';
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className={'sidebar--right ' + expandedClass}
|
|
id='sidebar-right'
|
|
>
|
|
<div
|
|
onClick={this.onShrink}
|
|
className='sidebar--right__bg'
|
|
/>
|
|
<div className='sidebar-right-container'>
|
|
{content}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|