blob: c4e807cd49ad799522be6c4e0f6d1975db1b2f5f [file] [log] [blame]
Adrià Vilanova Martínez0d92a0c2023-11-06 01:37:20 +01001import {MDCTooltip} from '@material/tooltip';
2
3import {parseUrl} from '../../../../common/commonUtils.js';
4import {createExtBadge} from '../../utils/common.js';
5import {kItemMetadataState, kItemMetadataStateI18n} from '../consts.js';
6import ThreadExtraInfoService from '../services/thread.js';
7
8import BaseExtraInfoInjection from './base.js';
9
10export default class ThreadListExtraInfoInjection extends
11 BaseExtraInfoInjection {
12 getInjectionDetails(li) {
13 const headerContent = li.querySelector(
14 'ec-thread-summary .main-header .header a.header-content');
15 if (headerContent === null) {
16 throw new Error(
17 `extraInfo: Header is not present in the thread item's DOM.`);
18 }
19
20 const threadInfo = parseUrl(headerContent.href);
21 if (threadInfo === false)
22 throw new Error(`extraInfo: Thread's link cannot be parsed.`);
23
24 return {
25 li,
26 threadInfo,
27 isExpanded: false,
28 };
29 }
30
31 inject(threads, injectionDetails) {
32 const thread = ThreadExtraInfoService.getThreadFromThreadList(
33 threads, injectionDetails.threadInfo);
34
35 const state = thread?.['2']?.['12']?.['1'];
36 if (!state || [1, 13, 18, 9].includes(state)) return;
37
38 const [label, badgeTooltip] = this.createLabelElement(state);
39 const authorLine = this.getAuthorLine(injectionDetails.li);
40 authorLine.prepend(label);
41
42 new MDCTooltip(badgeTooltip);
43 }
44
45 createLabelElement(state) {
46 const label = document.createElement('div');
47 label.classList.add('TWPT-label');
48
49 const [badge, badgeTooltip] = createExtBadge();
50
51 let span = document.createElement('span');
52 const stateI18nKey =
53 'inject_extrainfo_message_state_' + kItemMetadataStateI18n[state];
54 span.textContent = chrome.i18n.getMessage(stateI18nKey) ?? state;
55 span.title = kItemMetadataState[state] ?? state;
56
57 label.append(badge, span);
58
59 return [label, badgeTooltip];
60 }
61
62 getAuthorLine(li) {
63 const authorLine = li.querySelector(
64 'ec-thread-summary .header-content .top-row .author-line');
65 if (!authorLine) {
66 throw new Error(
67 `extraInfo: Author line is not present in the thread item's DOM.`);
68 }
69 return authorLine;
70 }
71}