diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js index 4d011976..9067fd0c 100644 --- a/Resources/Scripts/code.js +++ b/Resources/Scripts/code.js @@ -1,14 +1,4 @@ (function($TD, $TDX, $, TD){ - // - // Variable: Current highlighted column jQuery & data objects. - // - let highlightedColumn = null; - - // - // Variable: Currently highlighted tweet jQuery & data objects. - // - let highlightedTweet = null; - // // Variable: Array of functions called after the website app is loaded. // @@ -111,6 +101,53 @@ } }; + // + // Function: Returns an object containing data about the column below the cursor. + // + const getHoveredColumn = function(){ + let hovered = document.querySelectorAll(":hover"); + + for(let index = hovered.length-1; index >= 0; index--){ + let ele = hovered[index]; + + if (ele.tagName === "SECTION" && ele.classList.contains("js-column")){ + let obj = TD.controller.columnManager.get(ele.getAttribute("data-column")); + + if (obj){ + return { ele, obj }; + } + } + } + + return null; + }; + + // + // Function: Returns an object containing data about the tweet below the cursor. + // + const getHoveredTweet = function(){ + let hovered = document.querySelectorAll(":hover"); + + for(let index = hovered.length-1; index >= 0; index--){ + let ele = hovered[index]; + + if (ele.tagName === "ARTICLE" && ele.classList.contains("js-stream-item") && ele.hasAttribute("data-account-key")){ + let column = getHoveredColumn(); + + if (column){ + let wrap = column.obj.findChirp(ele.getAttribute("data-key")); + let obj = column.obj.findChirp(ele.getAttribute("data-tweet-id")) || wrap; + + if (obj){ + return { ele, obj, wrap, column }; + } + } + } + } + + return null; + }; + // // Function: Retrieves a property of an element with a specified class. // @@ -626,8 +663,11 @@ $(document.body).delegate("a", "contextmenu", function(){ let me = $(this)[0]; - if (me.classList.contains("js-media-image-link") && highlightedTweet){ - let tweet = highlightedTweet.obj.hasMedia() ? highlightedTweet.obj : highlightedTweet.obj.quotedTweet; + if (me.classList.contains("js-media-image-link")){ + let hovered = getHoveredTweet(); + return if !hovered; + + let tweet = hovered.obj.hasMedia() ? hovered.obj : hovered.obj.quotedTweet; let media = tweet.getMedia().find(media => media.mediaId === me.getAttribute("data-media-entity-id")); if ((media.isVideo && media.service === "twitter") || media.isAnimatedGif){ @@ -678,59 +718,23 @@ }; // - // Block: Update highlighted column and tweet for context menu and other functionality. + // Block: Add tweet-related options to the context menu. // - execSafe(function setupHighlightedColumn(){ + execSafe(function setupTweetContextMenu(){ throw 1 if !ensurePropertyExists(TD, "controller", "columnManager", "get"); throw 2 if !ensurePropertyExists(TD, "services", "ChirpBase", "TWEET"); - - const updateHighlightedColumn = function(ele){ - let obj = ele ? TD.controller.columnManager.get(ele.attr("data-column")) : null; - - if (obj){ - highlightedColumn = { ele, obj }; - return true; - } - else{ - highlightedColumn = null; - return false; - } - }; - - const updateHighlightedTweet = function(ele){ - if (ele && ele[0].hasAttribute("data-account-key") && (highlightedColumn || updateHighlightedColumn(ele.closest("section.js-column")))){ - let wrap = highlightedColumn.obj.findChirp(ele.attr("data-key")); - let obj = highlightedColumn.obj.findChirp(ele.attr("data-tweet-id")) || wrap; - - if (obj){ - highlightedTweet = { ele, obj, wrap }; - return true; - } - } - - highlightedTweet = null; - return false; - }; + throw 3 if !ensurePropertyExists(TD, "services", "TwitterActionFollow"); const processMedia = function(chirp){ return chirp.getMedia().filter(item => !item.isAnimatedGif).map(item => item.entity.media_url_https+":small").join(";"); }; app.delegate("section.js-column", { - mouseenter: function(){ - if (!highlightedColumn){ - updateHighlightedColumn($(this)); - } - }, - - mouseleave: function(){ - updateHighlightedColumn(null); - }, - contextmenu: function(){ - return if !highlightedTweet; + let hovered = getHoveredTweet(); + return if !hovered; - let tweet = highlightedTweet.obj; + let tweet = hovered.obj; let quote = tweet.quotedTweet; if (tweet.chirpType === TD.services.ChirpBase.TWEET){ @@ -747,16 +751,6 @@ } } }); - - app.delegate("article.js-stream-item", { - mouseenter: function(){ - updateHighlightedTweet($(this)); - }, - - mouseleave: function(){ - updateHighlightedTweet(null); - } - }); }); // @@ -764,19 +758,20 @@ // execSafe(function setupTweetScreenshot(){ window.TDGF_triggerScreenshot = function(){ - return if !highlightedTweet || !highlightedColumn; + let hovered = getHoveredTweet(); + return if !hovered; - let columnWidth = highlightedColumn.ele.width(); - let chirp = highlightedTweet.wrap || highlightedTweet.obj; + let columnWidth = $(hovered.column.ele).width(); + let tweet = hovered.wrap || hovered.obj; - let html = $(chirp.render({ + let html = $(tweet.render({ withFooter: false, withTweetActions: false, isInConvo: false, isFavorite: false, isRetweeted: false, // keeps retweet mark above tweet isPossiblySensitive: false, - mediaPreviewSize: highlightedColumn.obj.getMediaPreviewSize() + mediaPreviewSize: hovered.column.obj.getMediaPreviewSize() })); html.find("footer").last().remove(); // apparently withTweetActions breaks for certain tweets, nice @@ -804,12 +799,12 @@ let gif = html.find(".js-media-gif-container"); if (gif.length){ - gif.css("background-image", 'url("'+chirp.getMedia()[0].small()+'")'); + gif.css("background-image", 'url("'+tweet.getMedia()[0].small()+'")'); } - let type = chirp.getChirpType(); + let type = tweet.getChirpType(); - if ((type.startsWith("favorite") || type.startsWith("retweet")) && chirp.isAboutYou()){ + if ((type.startsWith("favorite") || type.startsWith("retweet")) && tweet.isAboutYou()){ html.addClass("td-notification-padded"); } @@ -878,8 +873,11 @@ }; const tryCloseHighlightedColumn = function(){ - let column = highlightedColumn && highlightedColumn.ele.closest(".js-column"); - return column && ((column.is(".is-shifted-2") && tryClickSelector(".js-tweet-social-proof-back", column)) || (column.is(".is-shifted-1") && tryClickSelector(".js-column-back", column))); + let column = getHoveredColumn(); + return false if !column; + + let ele = $(column.ele); + return ((ele.is(".is-shifted-2") && tryClickSelector(".js-tweet-social-proof-back", ele)) || (ele.is(".is-shifted-1") && tryClickSelector(".js-column-back", ele))); }; window.TDGF_onMouseClickExtra = function(button){ @@ -895,8 +893,10 @@ $(".is-shifted-1 .js-column-back").click(); } else if (button === 2){ // forward button - if (highlightedTweet){ - highlightedTweet.ele.children().first().click(); + let hovered = getHoveredTweet(); + + if (hovered){ + $(hovered.ele).children().first().click(); } } }; @@ -1198,7 +1198,8 @@ let src = !e.ctrlKey && getGifLink($(this).closest(".js-media-gif-container").find("video")); if (src){ - window.TDGF_playVideo(src, getUsername(highlightedTweet.obj)); + let hovered = getHoveredTweet(); + window.TDGF_playVideo(src, getUsername(hovered && hovered.obj)); } else{ $TD.openBrowser(getVideoTweetLink($(this)));