blob: 23db6eb362f6de579d91b659696a6c0d078fca8a [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.
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010030 let prevReplyId;
31 let prevReplyParentId;
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010032 mogs.forEach(m => {
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010033 const info = this.getAdditionalInformation(
34 m, mogs, prevReplyId, prevReplyParentId);
35 prevReplyId = m.getId();
36 prevReplyParentId = info.parentId;
37
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010038 const span = document.createElement('span');
39 span.textContent = kAdditionalInfoPrefix + JSON.stringify(info);
40 span.setAttribute('style', 'display: none');
41 m.newPayload = m.getPayload() + span.outerHTML;
42 });
43 mogs.forEach(m => m.setPayload(m.newPayload));
44
45 // Sort the messages by date
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010046 mogs.sort((a, b) => {
47 const c = a instanceof MessageModel ? a.getCreatedMicroseconds() :
48 a.getStartTimestamp();
49 const d = b instanceof MessageModel ? b.getCreatedMicroseconds() :
50 b.getStartTimestamp();
51 const diff = c - d;
52 return diff > 0 ? 1 : diff < 0 ? -1 : 0;
53 });
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010054
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010055 response[1][40] = mogs.map(mog => mog.toRawMessageOrGap());
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010056
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010057 // Set num_messages to the updated value, since we've flattened the replies.
58 response[1][8] = response[1][40].length;
59 return response;
60 },
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010061 getAdditionalInformation(message, mogs, prevReplyId, prevReplyParentId) {
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010062 const id = message.getId();
63 const parentId = message.getParentMessageId();
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010064 const authorName = message.getAuthor()?.[1]?.[1];
65 if (!parentId) {
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010066 return {
67 isComment: false,
68 id,
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010069 authorName,
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010070 };
71 }
72
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010073 let prevId;
Adrià Vilanova Martínezb47ec062023-01-15 17:43:26 +010074 if (parentId == prevReplyParentId && prevReplyParentId)
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010075 prevId = prevReplyId;
76 else
77 prevId = parentId;
78
79 const prevMessage =
Adrià Vilanova Martínezb47ec062023-01-15 17:43:26 +010080 prevId ? mogs.find(m => m.getId() == prevId) : null;
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010081
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010082 return {
83 isComment: true,
84 id,
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +010085 authorName,
86 parentId,
87 prevMessage: {
88 id: prevId,
Adrià Vilanova Martínezb47ec062023-01-15 17:43:26 +010089 payload: prevMessage?.getPayload(),
90 author: prevMessage?.getAuthor(),
Adrià Vilanova Martínez412b7582022-12-30 01:35:30 +010091 },
92 };
93 }
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010094};
95
96export default loadMoreThread;