Skip to content

Commit b803240

Browse files
feat(Classic Footer): Enable feature on trail items (#2149)
1 parent aee5bf9 commit b803240

File tree

1 file changed

+38
-22
lines changed

1 file changed

+38
-22
lines changed

src/features/classic_footer/index.js

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { buildStyle, postSelector } from '../../utils/interface.js';
44
import { translate } from '../../utils/language_data.js';
55
import { pageModifications } from '../../utils/mutations.js';
66
import { getPreferences } from '../../utils/preferences.js';
7-
import { timelineObject } from '../../utils/react_props.js';
7+
import { timelineObject, trailItem } from '../../utils/react_props.js';
88

99
const activeAttribute = 'data-classic-footer';
1010
const noteCountClass = 'xkit-classic-footer-note-count';
@@ -232,31 +232,42 @@ const onNoteCountClick = (event) => {
232232
const postElement = event.currentTarget.closest(postOrRadarSelector);
233233
if (!postElement) { return; }
234234

235+
// todo: improve reliablity by targeting close button in modal notes (i.e. if user switched to reblogs tab).
235236
const closeNotesButton = postElement.querySelector(closeNotesButtonSelector);
237+
const replyButton = event.currentTarget.parentElement.querySelector(replyButtonSelector);
236238

237239
closeNotesButton
238240
? closeNotesButton.click()
239-
: [...postElement.querySelectorAll(`[${activeAttribute}] ${replyButtonSelector}`)].at(-1)?.click();
241+
: replyButton.click();
240242
};
241243

242244
const processPosts = (postElements) => postElements.forEach(async postElement => {
243-
postElement.querySelector(`.${noteCountClass}`)?.remove();
244-
postElement.querySelector(`.${reblogLinkClass}`)?.remove();
245-
246-
const { noteCount } = await timelineObject(postElement);
247-
const noteCountButton = button({
248-
'aria-hidden': noteCount === 0 && noZeroNotes,
249-
class: `${noteCountClass} ${modernButtonStyle ? modernStyleClass : ''}`,
250-
click: onNoteCountClick,
251-
}, getButtonChildren(noteCount));
252-
253-
const engagementControls = [...postElement.querySelectorAll(engagementControlsSelector)].at(-1);
254-
engagementControls?.closest('footer').setAttribute(activeAttribute, '');
255-
engagementControls?.before(noteCountButton);
256-
257-
if (noReblogMenu) {
258-
processReblogButton(engagementControls?.querySelector(reblogButtonSelector));
259-
}
245+
[...postElement.querySelectorAll(`.${noteCountClass}, .${reblogLinkClass}`)]
246+
.forEach(element => element.remove());
247+
248+
const timelineObjectData = await timelineObject(postElement);
249+
250+
[...postElement.querySelectorAll(engagementControlsSelector)]
251+
.forEach(async engagementControls => {
252+
const trailItemData = await trailItem(engagementControls);
253+
254+
const noteCount = trailItemData
255+
? trailItemData.post.noteCount ?? 0
256+
: timelineObjectData.noteCount;
257+
258+
const noteCountButton = button({
259+
'aria-hidden': noteCount === 0 && noZeroNotes,
260+
class: `${noteCountClass} ${modernButtonStyle ? modernStyleClass : ''}`,
261+
click: onNoteCountClick,
262+
}, getButtonChildren(noteCount));
263+
264+
engagementControls.closest('footer').setAttribute(activeAttribute, '');
265+
engagementControls.before(noteCountButton);
266+
267+
if (noReblogMenu) {
268+
processReblogButton(engagementControls.querySelector(reblogButtonSelector), timelineObjectData, trailItemData);
269+
}
270+
});
260271
});
261272

262273
const getReblogMenuItem = async (reblogButton, href) => {
@@ -296,10 +307,15 @@ const onReblogLinkClick = (event) => {
296307
getReblogMenuItem(reblogButton, href).then(reblogMenuItem => reblogMenuItem.click());
297308
};
298309

299-
const processReblogButton = async reblogButton => {
310+
const processReblogButton = (reblogButton, timelineObjectData, trailItemData) => {
300311
if (!reblogButton) return;
301312

302-
const { blogName, canReblog, idString, reblogKey } = await timelineObject(reblogButton);
313+
const { blog: { name } } = trailItemData ?? timelineObjectData;
314+
const { canReblog, id } = trailItemData?.post ?? timelineObjectData;
315+
316+
// trail items have the same reblog key as their parent post
317+
const { reblogKey } = timelineObjectData;
318+
303319
if (!canReblog) return;
304320

305321
const styleContent = `${reblogMenuPortalSelector}:has([aria-labelledby="${reblogButton.id}"]) { display: none; }`;
@@ -308,7 +324,7 @@ const processReblogButton = async reblogButton => {
308324
'aria-label': reblogButton.getAttribute('aria-label'),
309325
class: reblogLinkClass,
310326
click: onReblogLinkClick,
311-
href: `/reblog/${blogName}/${idString}/${reblogKey}`,
327+
href: `/reblog/${name}/${id}/${reblogKey}`,
312328
}, [
313329
link({ rel: 'stylesheet', class: 'xkit', href: `data:text/css,${encodeURIComponent(styleContent)}` }),
314330
reblogButton.firstElementChild.cloneNode(true)],

0 commit comments

Comments
 (0)