import React from 'dom-chef'; import cache from 'webext-storage-cache'; import select from 'select-dom'; import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; import looseParseInt from '../helpers/loose-parse-int'; import {getRepoGQL, getRepo} from '../github-helpers'; interface IssueInfo { updatedAt: string; } const getLastUpdated = cache.function(async (issueNumbers: number[]): Promise> => { const {repository} = await api.v4(` repository(${getRepoGQL()}) { ${issueNumbers.map(number => ` ${api.escapeKey(number)}: issue(number: ${number}) { updatedAt } `).join('\n')} } `); return repository; }, { maxAge: {minutes: 30}, cacheKey: ([issues]) => __filebasename + ':' + getRepo()!.nameWithOwner + ':' + String(issues) }); function getPinnedIssueNumber(pinnedIssue: HTMLElement): number { return looseParseInt(select('.opened-by', pinnedIssue)!.firstChild!.textContent!); } async function init(): Promise { const pinnedIssues = select.all('.pinned-issue-item'); if (pinnedIssues.length === 0) { return false; } const lastUpdated: Record = await getLastUpdated(pinnedIssues.map(getPinnedIssueNumber)); for (const pinnedIssue of pinnedIssues) { const issueNumber = getPinnedIssueNumber(pinnedIssue); const {updatedAt} = lastUpdated[api.escapeKey(issueNumber)]; select('.pinned-item-desc', pinnedIssue)!.append( ' • ', updated ); } } void features.add(__filebasename, { include: [ pageDetect.isRepoIssueList ], init });