Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 1 | import {kAdditionalInfoPrefix} from '../../contentScripts/communityConsole/flattenThreads/flattenThreads.js'; |
Adrià Vilanova Martínez | 2d9be8d | 2022-12-28 00:50:14 +0100 | [diff] [blame] | 2 | import GapModel from '../../models/Gap.js'; |
| 3 | import MessageModel from '../../models/Message.js'; |
| 4 | |
| 5 | const 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ínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 16 | // Do the actual flattening |
Adrià Vilanova Martínez | 2d9be8d | 2022-12-28 00:50:14 +0100 | [diff] [blame] | 17 | 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ínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 27 | |
| 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ínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 30 | let prevReplyId; |
| 31 | let prevReplyParentId; |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 32 | mogs.forEach(m => { |
Adrià Vilanova Martínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 33 | const info = this.getAdditionalInformation( |
| 34 | m, mogs, prevReplyId, prevReplyParentId); |
| 35 | prevReplyId = m.getId(); |
| 36 | prevReplyParentId = info.parentId; |
| 37 | |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 38 | 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ínez | 2d9be8d | 2022-12-28 00:50:14 +0100 | [diff] [blame] | 46 | 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ínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 54 | |
Adrià Vilanova Martínez | 2d9be8d | 2022-12-28 00:50:14 +0100 | [diff] [blame] | 55 | response[1][40] = mogs.map(mog => mog.toRawMessageOrGap()); |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 56 | |
Adrià Vilanova Martínez | 2d9be8d | 2022-12-28 00:50:14 +0100 | [diff] [blame] | 57 | // 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ínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 61 | getAdditionalInformation(message, mogs, prevReplyId, prevReplyParentId) { |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 62 | const id = message.getId(); |
| 63 | const parentId = message.getParentMessageId(); |
Adrià Vilanova Martínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 64 | const authorName = message.getAuthor()?.[1]?.[1]; |
| 65 | if (!parentId) { |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 66 | return { |
| 67 | isComment: false, |
| 68 | id, |
Adrià Vilanova Martínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 69 | authorName, |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 70 | }; |
| 71 | } |
| 72 | |
Adrià Vilanova Martínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 73 | let prevId; |
| 74 | if (parentId === prevReplyParentId && prevReplyParentId) |
| 75 | prevId = prevReplyId; |
| 76 | else |
| 77 | prevId = parentId; |
| 78 | |
| 79 | const prevMessage = |
| 80 | prevId ? mogs.find(m => m.getId() === prevId) : null; |
| 81 | |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 82 | return { |
| 83 | isComment: true, |
| 84 | id, |
Adrià Vilanova Martínez | 115e3d8 | 2023-01-10 21:50:06 +0100 | [diff] [blame] | 85 | authorName, |
| 86 | parentId, |
| 87 | prevMessage: { |
| 88 | id: prevId, |
| 89 | payload: prevMessage.getPayload(), |
| 90 | author: prevMessage.getAuthor(), |
Adrià Vilanova Martínez | 412b758 | 2022-12-30 01:35:30 +0100 | [diff] [blame] | 91 | }, |
| 92 | }; |
| 93 | } |
Adrià Vilanova Martínez | 2d9be8d | 2022-12-28 00:50:14 +0100 | [diff] [blame] | 94 | }; |
| 95 | |
| 96 | export default loadMoreThread; |