blob: cece8b47f7baab4381f284879d6f3ae16c6afc50 [file] [log] [blame]
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +01001import {kAdditionalInfoPrefix} from '../../contentScripts/communityConsole/flattenThreads/flattenThreads.js';
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +01002import GapModel from '../../models/Gap.js';
3import MessageModel from '../../models/Message.js';
4
5const loadMoreThread = {
6 urlRegex: /api\/ViewThread/i,
7 featureGated: true,
8 features: ['flattenthreads', 'flattenthreads_switch_enabled'],
9 isEnabled(options) {
10 return options['flattenthreads'] &&
11 options['flattenthreads_switch_enabled'];
12 },
13 async interceptor(_request, response) {
14 if (!response[1]?.[40]) return response;
15
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010016 // Do the actual flattening
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010017 const originalMogs =
18 MessageModel.mapToMessageOrGapModels(response[1][40] ?? []);
19 let extraMogs = [];
20 originalMogs.forEach(mog => {
21 if (mog instanceof GapModel) return;
22 const cogs = mog.getCommentsAndGaps();
23 extraMogs = extraMogs.concat(cogs);
24 mog.clearCommentsAndGaps();
25 });
26 const mogs = originalMogs.concat(extraMogs);
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010027
28 // Add some message data to the payload so the extension can show the parent
29 // comment/reply in the case of comments.
30 mogs.forEach(m => {
31 const info = this.getAdditionalInformation(m, mogs);
32 const span = document.createElement('span');
33 span.textContent = kAdditionalInfoPrefix + JSON.stringify(info);
34 span.setAttribute('style', 'display: none');
35 m.newPayload = m.getPayload() + span.outerHTML;
36 });
37 mogs.forEach(m => m.setPayload(m.newPayload));
38
39 // Sort the messages by date
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010040 mogs.sort((a, b) => {
41 const c = a instanceof MessageModel ? a.getCreatedMicroseconds() :
42 a.getStartTimestamp();
43 const d = b instanceof MessageModel ? b.getCreatedMicroseconds() :
44 b.getStartTimestamp();
45 const diff = c - d;
46 return diff > 0 ? 1 : diff < 0 ? -1 : 0;
47 });
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010048
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010049 response[1][40] = mogs.map(mog => mog.toRawMessageOrGap());
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010050
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010051 // Set num_messages to the updated value, since we've flattened the replies.
52 response[1][8] = response[1][40].length;
53 return response;
54 },
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010055 getAdditionalInformation(message, mogs) {
56 const id = message.getId();
57 const parentId = message.getParentMessageId();
58 const parentMessage =
59 parentId ? mogs.find(m => m.getId() === parentId) : null;
60 if (!parentMessage) {
61 return {
62 isComment: false,
63 id,
64 };
65 }
66
67 return {
68 isComment: true,
69 id,
70 parentMessage: {
71 id: parentId,
72 payload: parentMessage.getPayload(),
73 author: parentMessage.getAuthor(),
74 },
75 };
76 }
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010077};
78
79export default loadMoreThread;