@atlaskit/global-search
Version:
A cross-product search component (batteries included)
180 lines (157 loc) • 5.93 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import React from 'react';
import ConfluenceQuickSearchContainer from './confluence/ConfluenceQuickSearchContainer';
import JiraQuickSearchContainer from './jira/JiraQuickSearchContainer';
import configureSearchClients from '../api/configureSearchClients';
import MessagesIntlProvider from './MessagesIntlProvider';
import { GlobalSearchPreFetchContext } from './PrefetchedResultsProvider';
import { createFeatures } from '../util/features';
import { ABTestProvider } from './AbTestProvider';
import { withFeedbackButton } from './feedback/withFeedbackButton';
import FeaturesProvider from './FeaturesProvider';
const DEFAULT_NOOP_LOGGER = {
safeInfo() {},
safeWarn() {},
safeError() {}
};
const ConfluenceContainerWithFeedback = withFeedbackButton(ConfluenceQuickSearchContainer);
/**
* Component that exposes the public API for global quick search. Its only purpose is to offer a simple, user-friendly API to the outside and hide the implementation detail of search clients etc.
*/
export default class GlobalQuickSearchWrapper extends React.Component {
constructor(...args) {
super(...args);
_defineProperty(this, "onAdvancedSearch", (e, entity, query, searchSessionId, spaces = []) => {
if (this.props.onAdvancedSearch) {
let preventEventDefault = false;
this.props.onAdvancedSearch({
preventDefault: () => preventEventDefault = true,
query,
// query entered by the user
category: entity,
originalEvent: e,
searchSessionId,
spaces
});
if (preventEventDefault && e) {
e.preventDefault();
e.stopPropagation();
}
}
});
}
makeConfig() {
const config = {};
const {
activityServiceUrl,
searchAggregatorServiceUrl,
directoryServiceUrl,
confluenceUrl,
autocompleteUrl
} = this.props;
if (activityServiceUrl) {
config.activityServiceUrl = activityServiceUrl;
}
if (searchAggregatorServiceUrl) {
config.searchAggregatorServiceUrl = searchAggregatorServiceUrl;
}
if (directoryServiceUrl) {
config.directoryServiceUrl = directoryServiceUrl;
}
if (confluenceUrl) {
config.confluenceUrl = confluenceUrl;
}
if (autocompleteUrl) {
config.autocompleteUrl = autocompleteUrl;
}
return config;
}
shouldComponentUpdate(nextProps, nextState) {
return Object.keys({ ...nextProps,
...this.props
}).map(key => this.props[key] !== nextProps[key]).reduce((acc, value) => acc || value, false) || this.state !== nextState;
}
createFeatures(abTest) {
const {
disableJiraPreQueryPeopleSearch,
enablePreQueryFromAggregator,
useUrsForBootstrapping,
isAutocompleteEnabled,
isNavAutocompleteEnabled
} = this.props;
return createFeatures({
abTest,
useUrsForBootstrapping: !!useUrsForBootstrapping,
disableJiraPreQueryPeopleSearch: !!disableJiraPreQueryPeopleSearch,
enablePreQueryFromAggregator: !!enablePreQueryFromAggregator,
isAutocompleteEnabled: !!isAutocompleteEnabled,
isNavAutocompleteEnabled: !!isNavAutocompleteEnabled
});
}
renderSearchContainer(searchClients, abTest) {
const {
linkComponent,
referralContextIdentifiers,
logger,
inputControls,
appPermission,
modelContext,
showFeedbackCollector,
feedbackCollectorProps,
confluenceUrl,
isJiraPeopleProfilesEnabled
} = this.props;
const commonProps = { ...searchClients,
linkComponent: linkComponent,
referralContextIdentifiers: referralContextIdentifiers,
logger: logger || DEFAULT_NOOP_LOGGER,
onAdvancedSearch: this.onAdvancedSearch
};
if (this.props.context === 'confluence') {
if (showFeedbackCollector) {
return (
/*#__PURE__*/
// Same as below but missing input controls which is injected by the feedback button
React.createElement(ConfluenceContainerWithFeedback, _extends({}, commonProps, feedbackCollectorProps, {
modelContext: modelContext,
confluenceUrl: confluenceUrl || ''
}))
);
}
return /*#__PURE__*/React.createElement(ConfluenceQuickSearchContainer, _extends({}, commonProps, feedbackCollectorProps, {
modelContext: modelContext,
inputControls: inputControls,
confluenceUrl: confluenceUrl || ''
}));
} else if (this.props.context === 'jira') {
return /*#__PURE__*/React.createElement(JiraQuickSearchContainer, _extends({}, commonProps, {
appPermission: appPermission,
isJiraPeopleProfilesEnabled: isJiraPeopleProfilesEnabled
}));
} else {
const errorMessage = `Invalid product type, product ${this.props.context} is unsupported`;
if (logger) {
logger.safeError(errorMessage);
}
throw new Error(errorMessage);
}
}
render() {
return /*#__PURE__*/React.createElement(MessagesIntlProvider, null, /*#__PURE__*/React.createElement(GlobalSearchPreFetchContext.Consumer, null, prefetchedResults => {
const searchClients = configureSearchClients(this.props.cloudId, this.makeConfig(), this.props.userId === null, prefetchedResults);
const {
context
} = this.props;
return /*#__PURE__*/React.createElement(ABTestProvider, {
context: context,
crossProductSearchClient: searchClients.crossProductSearchClient
}, abTest => /*#__PURE__*/React.createElement(FeaturesProvider, {
features: this.createFeatures(abTest)
}, this.renderSearchContainer(searchClients, abTest)));
}));
}
}
_defineProperty(GlobalQuickSearchWrapper, "defaultProps", {
logger: DEFAULT_NOOP_LOGGER
});