UNPKG

@atlaskit/global-search

Version:

A cross-product search component (batteries included)

226 lines (201 loc) 8.82 kB
import _extends from "@babel/runtime/helpers/extends"; import React from 'react'; import styled from 'styled-components'; // AFP-2532 TODO: Fix automatic suppressions below // eslint-disable-next-line @atlassian/tangerine/import/entry-points import { colors } from '@atlaskit/theme'; import SearchIcon from '@atlaskit/icon/glyph/search'; import { ObjectResult as ObjectResultComponent, PersonResult as PersonResultComponent, ContainerResult as ContainerResultComponent, ResultBase } from '@atlaskit/quick-search'; import { FormattedMessage } from 'react-intl'; import { messages } from '../messages'; import { ResultType, JiraProjectType, ContentType, AnalyticsType } from '../model/Result'; import { SelectedIcon } from './styled'; import { getAvatarForConfluenceObjectResult } from '../util/confluence-avatar-util'; import { getDefaultAvatar } from '../util/jira-avatar-util'; import DarkReturn from '../assets/DarkReturn'; import Return from '../assets/Return'; import { injectFeatures } from './FeaturesProvider'; const extractAvatarData = jiraResult => jiraResult.avatarUrl ? { avatarUrl: jiraResult.avatarUrl } : { avatar: getDefaultAvatar(jiraResult.contentType) }; const selectedIcon = /*#__PURE__*/React.createElement(SelectedIcon, null, /*#__PURE__*/React.createElement(DarkReturn, null)); const getI18nJiraContainerName = projectType => { switch (projectType) { case JiraProjectType.Business: { return /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_project_type_business_project); } case JiraProjectType.Software: { return /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_project_type_software_project); } case JiraProjectType.ServiceDesk: { return /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_project_type_service_desk_project); } case JiraProjectType.Ops: { return /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_project_type_ops_project); } } }; const getI18nJiraContentType = contentType => { switch (contentType) { case ContentType.JiraBoard: { return /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_result_type_board); } case ContentType.JiraFilter: { return /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_result_type_filter); } } return undefined; }; // Being tested as part of the 'complex' experiment, to improve scannability when there // is lots of text. const LightSubtextWrapper = styled.span` color: ${colors.N90}; `; const getI18nConfluenceContainerSubtext = (containerName, friendlyLastModified) => { const containerText = friendlyLastModified ? /*#__PURE__*/React.createElement(FormattedMessage, _extends({}, messages.confluence_container_subtext_with_modified_date, { values: { containerName, friendlyLastModified } })) : containerName; return /*#__PURE__*/React.createElement(LightSubtextWrapper, null, containerText); }; export const getUniqueResultId = result => result.key ? result.key : `${result.contentType}-${result.resultId}`; class ResultList extends React.Component { render() { const { results, sectionIndex, features } = this.props; return results.map((result, index) => { const resultType = result.resultType; const analyticsData = { sectionIndex, indexWithinSection: index, containerId: result.containerId, experimentId: result.experimentId, ...this.props.analyticsData, contentType: result.contentType, resultId: result.resultId, isRecentResult: !!result.isRecentResult }; // Make sure that key and resultId are unique across all search results const uniqueResultId = getUniqueResultId(result); const uniqueKey = `${uniqueResultId}_${Date.now()}`; // same result might appear on two successive search switch (resultType) { case ResultType.ConfluenceObjectResult: { const confluenceResult = result; const subText = getI18nConfluenceContainerSubtext(confluenceResult.containerName, confluenceResult.friendlyLastModified); return /*#__PURE__*/React.createElement(ObjectResultComponent, { key: uniqueKey, resultId: uniqueResultId, name: confluenceResult.name, href: confluenceResult.href, type: confluenceResult.analyticsType, containerName: subText, avatar: getAvatarForConfluenceObjectResult(confluenceResult), analyticsData: analyticsData, selectedIcon: selectedIcon }); } case ResultType.JiraProjectResult: { const jiraResult = result; const avatarData = extractAvatarData(jiraResult); const containerNameElement = jiraResult.projectType ? getI18nJiraContainerName(jiraResult.projectType) : null; return /*#__PURE__*/React.createElement(ContainerResultComponent, _extends({ key: uniqueKey, resultId: uniqueResultId, name: jiraResult.name, href: jiraResult.href, type: jiraResult.analyticsType, subText: containerNameElement }, avatarData, { analyticsData: analyticsData, selectedIcon: selectedIcon })); } case ResultType.JiraObjectResult: { const jiraResult = result; const avatarData = extractAvatarData(jiraResult); const objectKey = jiraResult.contentType === 'jira-board' || jiraResult.contentType === 'jira-filter' ? getI18nJiraContentType(jiraResult.contentType) : jiraResult.objectKey; return /*#__PURE__*/React.createElement(ObjectResultComponent, _extends({ key: uniqueKey, resultId: uniqueResultId, name: jiraResult.name, href: jiraResult.href, type: jiraResult.analyticsType, objectKey: objectKey, containerName: jiraResult.containerName }, avatarData, { analyticsData: analyticsData, selectedIcon: selectedIcon })); } case ResultType.GenericContainerResult: { const containerResult = result; return /*#__PURE__*/React.createElement(ContainerResultComponent, { key: uniqueKey, resultId: uniqueResultId, name: containerResult.name, href: containerResult.href, type: containerResult.analyticsType, avatarUrl: containerResult.avatarUrl, analyticsData: analyticsData, selectedIcon: selectedIcon }); } case ResultType.PersonResult: { const personResult = result; const presenceMessage = features.complexSearchExtensionsEnabled ? /*#__PURE__*/React.createElement(LightSubtextWrapper, null, personResult.presenceMessage) : personResult.presenceMessage; return /*#__PURE__*/React.createElement(PersonResultComponent, { key: uniqueKey, resultId: uniqueResultId, name: personResult.name, href: personResult.href, type: personResult.analyticsType, avatarUrl: personResult.avatarUrl, mentionName: personResult.mentionName, presenceMessage: presenceMessage, analyticsData: analyticsData, selectedIcon: selectedIcon, target: "_blank" }); } case ResultType.JiraIssueAdvancedSearch: { return /*#__PURE__*/React.createElement(ResultBase, { href: result.href, resultId: "jira-advanced-issue-search", text: /*#__PURE__*/React.createElement(FormattedMessage, messages.jira_view_all_issues), icon: /*#__PURE__*/React.createElement(SearchIcon, { size: "medium", label: "View all issues" }), type: AnalyticsType.LinkPostQueryAdvancedSearchJira, key: uniqueKey, elemAfter: /*#__PURE__*/React.createElement(Return, null) }); } default: { // Make the TS compiler verify that all enums have been matched const _nonExhaustiveMatch = resultType; throw new Error(`Non-exhaustive match for result type: ${_nonExhaustiveMatch}`); } } }); } } export const UnwrappedResultList = ResultList; export default injectFeatures(ResultList);