@@ -4,7 +4,7 @@ import { buildStyle, postSelector } from '../../utils/interface.js';
44import { translate } from '../../utils/language_data.js' ;
55import { pageModifications } from '../../utils/mutations.js' ;
66import { getPreferences } from '../../utils/preferences.js' ;
7- import { timelineObject } from '../../utils/react_props.js' ;
7+ import { timelineObject , trailItem } from '../../utils/react_props.js' ;
88
99const activeAttribute = 'data-classic-footer' ;
1010const 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
242244const 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
262273const 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