@atlaskit/global-search
Version:
A cross-product search component (batteries included)
129 lines • 7.7 kB
JavaScript
import { __extends } from "tslib";
import * as React from 'react';
import PreQueryState from './PreQueryState';
import { isEmpty } from '../SearchResultsUtil';
import { PostQueryAnalyticsComponent } from './ScreenAnalyticsHelper';
import ResultGroupsComponent, { ResultGroupType, } from './ResultGroupsComponent';
import SearchError from '../SearchError';
import deepEqual from 'deep-equal';
export var SearchResultsState;
(function (SearchResultsState) {
SearchResultsState[SearchResultsState["PreQueryLoading"] = 0] = "PreQueryLoading";
SearchResultsState[SearchResultsState["PreQueryResults"] = 1] = "PreQueryResults";
SearchResultsState[SearchResultsState["PreQueryNoResults"] = 2] = "PreQueryNoResults";
SearchResultsState[SearchResultsState["PostQueryResults"] = 3] = "PostQueryResults";
SearchResultsState[SearchResultsState["PostQueryNoResults"] = 4] = "PostQueryNoResults";
SearchResultsState[SearchResultsState["IntermediateResults"] = 5] = "IntermediateResults";
SearchResultsState[SearchResultsState["IntermediateNoResults"] = 6] = "IntermediateNoResults";
})(SearchResultsState || (SearchResultsState = {}));
export var getSearchResultState = function (_a) {
var isPreQuery = _a.isPreQuery, isLoading = _a.isLoading, hasResults = _a.hasResults;
if (isPreQuery) {
// Pre query
if (isLoading) {
return SearchResultsState.PreQueryLoading;
}
if (!hasResults) {
return SearchResultsState.PreQueryNoResults;
}
return SearchResultsState.PreQueryResults;
}
else if (isLoading) {
// Intermediate
if (!hasResults) {
return SearchResultsState.IntermediateNoResults;
}
return SearchResultsState.IntermediateResults;
}
else {
// Post query
if (!hasResults) {
return SearchResultsState.PostQueryNoResults;
}
return SearchResultsState.PostQueryResults;
}
};
var SearchResults = /** @class */ (function (_super) {
__extends(SearchResults, _super);
function SearchResults() {
return _super !== null && _super.apply(this, arguments) || this;
}
SearchResults.prototype.shouldComponentUpdate = function (nextProps) {
return !deepEqual(nextProps, this.props);
};
SearchResults.prototype.hasNoResult = function () {
var _a = this.props, isPreQuery = _a.isPreQuery, isLoading = _a.isLoading, keepPreQueryState = _a.keepPreQueryState, getPreQueryGroups = _a.getPreQueryGroups, getPostQueryGroups = _a.getPostQueryGroups;
var results = isPreQuery || (isLoading && keepPreQueryState)
? getPreQueryGroups()
: getPostQueryGroups();
return results.map(function (_a) {
var items = _a.items;
return items;
}).every(isEmpty);
};
SearchResults.prototype.renderNoResult = function () {
var _a = this.props, renderNoResult = _a.renderNoResult, postQueryScreenCounter = _a.postQueryScreenCounter, searchSessionId = _a.searchSessionId, referralContextIdentifiers = _a.referralContextIdentifiers;
return (React.createElement(React.Fragment, null,
renderNoResult(),
React.createElement(PostQueryAnalyticsComponent, { screenCounter: postQueryScreenCounter, searchSessionId: searchSessionId, referralContextIdentifiers: referralContextIdentifiers, key: "post-query-analytics" })));
};
SearchResults.prototype.renderPreQueryState = function () {
var _a = this.props, searchSessionId = _a.searchSessionId, preQueryScreenCounter = _a.preQueryScreenCounter, renderNoRecentActivity = _a.renderNoRecentActivity, referralContextIdentifiers = _a.referralContextIdentifiers, renderBeforePreQueryState = _a.renderBeforePreQueryState, renderAdvancedSearchGroup = _a.renderAdvancedSearchGroup, getPreQueryGroups = _a.getPreQueryGroups;
return (React.createElement(React.Fragment, null,
renderBeforePreQueryState && renderBeforePreQueryState(),
React.createElement(PreQueryState, { resultsGroups: getPreQueryGroups(), renderNoRecentActivity: renderNoRecentActivity, searchSessionId: searchSessionId, screenCounter: preQueryScreenCounter, referralContextIdentifiers: referralContextIdentifiers, renderAdvancedSearchGroup: renderAdvancedSearchGroup })));
};
SearchResults.prototype.renderSearchResultsState = function () {
var _a = this.props, searchSessionId = _a.searchSessionId, referralContextIdentifiers = _a.referralContextIdentifiers, renderAdvancedSearchGroup = _a.renderAdvancedSearchGroup, getPostQueryGroups = _a.getPostQueryGroups, postQueryScreenCounter = _a.postQueryScreenCounter, searchMore = _a.searchMore, onSearchMoreAdvancedSearchClicked = _a.onSearchMoreAdvancedSearchClicked, query = _a.query, getFilterComponent = _a.getFilterComponent, isLoading = _a.isLoading, currentFilters = _a.currentFilters, onFilterChanged = _a.onFilterChanged;
var resultGroups = getPostQueryGroups();
var topGroup = resultGroups.length > 0 ? resultGroups[0] : null;
return (React.createElement(React.Fragment, null,
topGroup &&
getFilterComponent({
latestSearchQuery: query,
searchResultsTotalSize: topGroup.totalSize,
isLoading: isLoading,
searchSessionId: searchSessionId,
currentFilters: currentFilters,
onFilterChanged: onFilterChanged,
}),
React.createElement(ResultGroupsComponent, { query: query, type: ResultGroupType.PostQuery, renderAdvancedSearch: renderAdvancedSearchGroup, resultsGroups: resultGroups, searchSessionId: searchSessionId, screenCounter: postQueryScreenCounter, referralContextIdentifiers: referralContextIdentifiers, onShowMoreClicked: searchMore || (function () { }), onSearchMoreAdvancedSearchClicked: onSearchMoreAdvancedSearchClicked })));
};
SearchResults.prototype.render = function () {
var _a = this.props, isPreQuery = _a.isPreQuery, isError = _a.isError, isLoading = _a.isLoading, retrySearch = _a.retrySearch, keepPreQueryState = _a.keepPreQueryState;
if (isError) {
return React.createElement(SearchError, { onRetryClick: retrySearch });
}
var searchResultState = getSearchResultState({
isPreQuery: isPreQuery,
isLoading: isLoading,
hasResults: !this.hasNoResult(),
});
switch (searchResultState) {
case SearchResultsState.PreQueryLoading:
return null;
case SearchResultsState.PreQueryNoResults:
return this.renderPreQueryState();
case SearchResultsState.PreQueryResults:
return this.renderPreQueryState();
case SearchResultsState.IntermediateNoResults:
return keepPreQueryState ? this.renderPreQueryState() : null;
case SearchResultsState.IntermediateResults:
return keepPreQueryState
? this.renderPreQueryState()
: this.renderSearchResultsState();
case SearchResultsState.PostQueryNoResults:
return this.renderNoResult();
case SearchResultsState.PostQueryResults:
return this.renderSearchResultsState();
default:
throw new Error('unhandled state');
}
};
SearchResults.defaultProps = {
getFilterComponent: function () { return null; },
};
return SearchResults;
}(React.Component));
export default SearchResults;
//# sourceMappingURL=SearchResults.js.map