@atlaskit/global-search
Version:
A cross-product search component (batteries included)
61 lines (54 loc) • 2.05 kB
JavaScript
import { utils } from '@atlaskit/util-service-support';
import { AnalyticsType, ContentType, ResultType } from '../model/Result';
const RECENT_PAGES_PATH = 'rest/recentlyviewed/1.0/recent';
const RECENT_SPACE_PATH = 'rest/recentlyviewed/1.0/recent/spaces';
export default class ConfluenceClientImpl {
constructor(url) {
this.serviceConfig = {
url: url
};
}
async getRecentItems() {
const recentPages = await this.createRecentRequestPromise(RECENT_PAGES_PATH);
const baseUrl = this.serviceConfig.url;
return recentPages.filter(page => !!page.title).map(recentPage => recentPageToResult(recentPage, baseUrl));
}
async getRecentSpaces() {
const recentSpaces = await this.createRecentRequestPromise(RECENT_SPACE_PATH);
const baseUrl = this.serviceConfig.url;
return recentSpaces.map(recentSpace => recentSpaceToResult(recentSpace, baseUrl));
}
createRecentRequestPromise(path) {
const options = {
path: path
};
return utils.requestService(this.serviceConfig, options);
}
}
function recentPageToResult(recentPage, baseUrl) {
return {
resultId: String(recentPage.id),
name: recentPage.title || '',
// This is a failsafe, there should be a filter to drop pages with no titles
href: `${baseUrl}${recentPage.url}`,
containerName: recentPage.space,
analyticsType: AnalyticsType.RecentConfluence,
resultType: ResultType.ConfluenceObjectResult,
contentType: `confluence-${recentPage.contentType}`,
iconClass: recentPage.iconClass,
containerId: recentPage.spaceKey,
isRecentResult: true,
friendlyLastModified: undefined // not available for recent results
};
}
function recentSpaceToResult(recentSpace, baseUrl) {
return {
resultId: recentSpace.id,
name: recentSpace.name,
href: `${baseUrl}/spaces/${recentSpace.key}/overview`,
avatarUrl: recentSpace.icon,
analyticsType: AnalyticsType.RecentConfluence,
resultType: ResultType.GenericContainerResult,
contentType: ContentType.ConfluenceSpace
};
}