UNPKG

@atlaskit/global-search

Version:

A cross-product search component (batteries included)

96 lines (83 loc) 2.6 kB
import uuid from 'uuid'; import { ResultType, ContentType } from '../model/Result'; export const mapJiraItemToResult = analyticsType => item => item.attributes && item.attributes['@type'] ? mapJiraItemToResultV2(item, analyticsType) : mapJiraItemToResultV1(item, analyticsType); const extractSpecificAttributes = attributes => { const type = attributes['@type']; switch (type) { case 'issue': return { objectKey: attributes.key, containerName: attributes.container && attributes.container.title }; case 'board': return { containerName: attributes.containerName, containerId: attributes.containerId }; case 'filter': return { containerName: attributes.ownerName }; case 'project': return { containerName: attributes.projectType, projectType: attributes.projectType // projectType maps directly to JiraProjectType enum at the moment for convenience }; } return null; }; const extractAvatarUrl = ({ url = '', urls = {} } = {}) => { if (url) { return url; } return urls['48x48'] || urls[Object.keys(urls)[0]]; }; const JIRA_TYPE_TO_CONTENT_TYPE = { issue: ContentType.JiraIssue, board: ContentType.JiraBoard, filter: ContentType.JiraFilter, project: ContentType.JiraProject }; const mapJiraItemToResultV2 = (item, analyticsType) => { const { id, name, url, attributes } = item; const contentType = JIRA_TYPE_TO_CONTENT_TYPE[attributes['@type']]; const resultType = contentType === ContentType.JiraProject ? ResultType.JiraProjectResult : ResultType.JiraObjectResult; return { resultId: id, key: uuid(), name: name, href: url, resultType: resultType, containerId: attributes.container && attributes.container.id, analyticsType, ...extractSpecificAttributes(attributes), avatarUrl: attributes.avatar && extractAvatarUrl(attributes.avatar), contentType, isRecentResult: mapAnalyticsTypeToRecentResult(analyticsType) }; }; const mapJiraItemToResultV1 = (item, analyticsType) => { return { resultId: item.key, avatarUrl: item.fields.issuetype.iconUrl, name: item.fields.summary, href: `/browse/${item.key}`, containerName: item.fields.project.name, objectKey: item.key, analyticsType, resultType: ResultType.JiraObjectResult, contentType: ContentType.JiraIssue, isRecentResult: mapAnalyticsTypeToRecentResult(analyticsType) }; }; const mapAnalyticsTypeToRecentResult = analyticsType => { return analyticsType.startsWith('recent'); };