Merge pull request #2099 from hmhealey/plt1883

PLT-1883 Update search result components when we receive channels
Этот коммит содержится в:
Corey Hulen
2016-02-09 08:35:25 -08:00
родитель a4cce1023c be716c3b66
Коммит 7ba50278d3
3 изменённых файлов: 50 добавлений и 8 удалений

Просмотреть файл

@@ -1,6 +1,7 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
import ChannelStore from '../stores/channel_store.jsx';
import SearchStore from '../stores/search_store.jsx'; import SearchStore from '../stores/search_store.jsx';
import UserStore from '../stores/user_store.jsx'; import UserStore from '../stores/user_store.jsx';
import SearchBox from './search_bar.jsx'; import SearchBox from './search_bar.jsx';
@@ -11,7 +12,22 @@ import SearchResultsItem from './search_results_item.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'mm-intl'; import {FormattedMessage, FormattedHTMLMessage} from 'mm-intl';
function getStateFromStores() { function getStateFromStores() {
return {results: SearchStore.getSearchResults()}; const results = SearchStore.getSearchResults();
const channels = new Map();
const channelIds = results.order.map((postId) => results.posts[postId].channel_id);
for (const id of channelIds) {
if (channels.has(id)) {
continue;
}
channels.set(id, ChannelStore.get(id));
}
return {
results,
channels
};
} }
export default class SearchResults extends React.Component { export default class SearchResults extends React.Component {
@@ -33,16 +49,22 @@ export default class SearchResults extends React.Component {
componentDidMount() { componentDidMount() {
this.mounted = true; this.mounted = true;
SearchStore.addSearchChangeListener(this.onChange); SearchStore.addSearchChangeListener(this.onChange);
ChannelStore.addChangeListener(this.onChange);
this.resize(); this.resize();
window.addEventListener('resize', this.handleResize); window.addEventListener('resize', this.handleResize);
} }
shouldComponentUpdate(nextProps, nextState) {
return !Utils.areObjectsEqual(this.props, nextProps) || !Utils.areObjectsEqual(this.state, nextState);
}
componentDidUpdate() { componentDidUpdate() {
this.resize(); this.resize();
} }
componentWillUnmount() { componentWillUnmount() {
SearchStore.removeSearchChangeListener(this.onChange); SearchStore.removeSearchChangeListener(this.onChange);
ChannelStore.removeChangeListener(this.onChange);
this.mounted = false; this.mounted = false;
window.removeEventListener('resize', this.handleResize); window.removeEventListener('resize', this.handleResize);
} }
@@ -56,10 +78,7 @@ export default class SearchResults extends React.Component {
onChange() { onChange() {
if (this.mounted) { if (this.mounted) {
var newState = getStateFromStores(); this.setState(getStateFromStores());
if (!Utils.areObjectsEqual(newState, this.state)) {
this.setState(newState);
}
} }
} }
@@ -116,6 +135,7 @@ export default class SearchResults extends React.Component {
return ( return (
<SearchResultsItem <SearchResultsItem
key={post.id} key={post.id}
channel={this.state.channels.get(post.channel_id)}
post={post} post={post}
term={searchTerm} term={searchTerm}
isMentionSearch={this.props.isMentionSearch} isMentionSearch={this.props.isMentionSearch}

Просмотреть файл

@@ -1,7 +1,6 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
import ChannelStore from '../stores/channel_store.jsx';
import UserStore from '../stores/user_store.jsx'; import UserStore from '../stores/user_store.jsx';
import UserProfile from './user_profile.jsx'; import UserProfile from './user_profile.jsx';
import * as EventHelpers from '../dispatcher/event_helpers.jsx'; import * as EventHelpers from '../dispatcher/event_helpers.jsx';
@@ -37,8 +36,8 @@ export default class SearchResultsItem extends React.Component {
} }
render() { render() {
var channelName = ''; var channelName = null;
var channel = ChannelStore.get(this.props.post.channel_id); const channel = this.props.channel;
var timestamp = UserStore.getCurrentUser().update_at; var timestamp = UserStore.getCurrentUser().update_at;
if (channel) { if (channel) {
@@ -136,6 +135,7 @@ export default class SearchResultsItem extends React.Component {
SearchResultsItem.propTypes = { SearchResultsItem.propTypes = {
post: React.PropTypes.object, post: React.PropTypes.object,
channel: React.PropTypes.object,
isMentionSearch: React.PropTypes.bool, isMentionSearch: React.PropTypes.bool,
term: React.PropTypes.string term: React.PropTypes.string
}; };

Просмотреть файл

@@ -392,6 +392,10 @@ export function areObjectsEqual(x, y) {
return x.toString() === y.toString(); return x.toString() === y.toString();
} }
if (x instanceof Map && y instanceof Map) {
return areMapsEqual(x, y);
}
// At last checking prototypes as good a we can // At last checking prototypes as good a we can
if (!(x instanceof Object && y instanceof Object)) { if (!(x instanceof Object && y instanceof Object)) {
return false; return false;
@@ -456,6 +460,24 @@ export function areObjectsEqual(x, y) {
return true; return true;
} }
export function areMapsEqual(a, b) {
if (a.size !== b.size) {
return false;
}
for (const [key, value] of a) {
if (!b.has(key)) {
return false;
}
if (!areObjectsEqual(value, b.get(key))) {
return false;
}
}
return true;
}
export function replaceHtmlEntities(text) { export function replaceHtmlEntities(text) {
var tagsToReplace = { var tagsToReplace = {
'&amp;': '&', '&amp;': '&',