From 83cd5e57a203826ca6c22e2f92fda218287d5fe9 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Mon, 23 Mar 2020 08:47:05 +0000 Subject: [PATCH] only refresh feeds table if something changes. This prevents the hover menu from flickering --- .../java/com/muwire/webui/FeedManager.java | 8 ++++++++ .../java/com/muwire/webui/FeedServlet.java | 4 +++- webui/src/main/js/feeds.js | 19 +++++++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/webui/src/main/java/com/muwire/webui/FeedManager.java b/webui/src/main/java/com/muwire/webui/FeedManager.java index ed90a7c2..0b3ff24d 100644 --- a/webui/src/main/java/com/muwire/webui/FeedManager.java +++ b/webui/src/main/java/com/muwire/webui/FeedManager.java @@ -24,6 +24,7 @@ public class FeedManager { private final Core core; private final FileManager fileManager; private final Map remoteFeeds = new ConcurrentHashMap<>(); + private volatile long revision; public FeedManager(Core core, FileManager fileManager) { this.core = core; @@ -34,14 +35,20 @@ public class FeedManager { return remoteFeeds; } + long getRevision() { + return revision; + } + public void onFeedLoadedEvent(FeedLoadedEvent e) { remoteFeeds.put(e.getFeed().getPublisher(), new RemoteFeed(e.getFeed())); + revision++; } public void onUIFeedConfigurationEvent(UIFeedConfigurationEvent e) { if (!e.isNewFeed()) return; remoteFeeds.put(e.getFeed().getPublisher(), new RemoteFeed(e.getFeed())); + revision++; } public void onFeedFetchEvent(FeedFetchEvent e) { @@ -50,6 +57,7 @@ public class FeedManager { return; // hmm feed.getFeed().setStatus(e.getStatus()); feed.revision++; + revision++; } public void onFeedItemFetchedEvent(FeedItemFetchedEvent e) { diff --git a/webui/src/main/java/com/muwire/webui/FeedServlet.java b/webui/src/main/java/com/muwire/webui/FeedServlet.java index 63d81a04..4cf0b7da 100644 --- a/webui/src/main/java/com/muwire/webui/FeedServlet.java +++ b/webui/src/main/java/com/muwire/webui/FeedServlet.java @@ -43,7 +43,9 @@ public class FeedServlet extends HttpServlet { StringBuilder sb = new StringBuilder(); sb.append(""); - if (section.equals("feeds")) { + if (section.equals("revision")) { + sb.append("").append(feedManager.getRevision()).append(""); + } else if (section.equals("feeds")) { List feeds = feedManager.getRemoteFeeds().values().stream(). map(rf -> new WrappedFeed(rf, core.getFeedManager().getFeedItems(rf.getFeed().getPublisher()).size())). collect(Collectors.toList()); diff --git a/webui/src/main/js/feeds.js b/webui/src/main/js/feeds.js index c3790852..6a126ff0 100644 --- a/webui/src/main/js/feeds.js +++ b/webui/src/main/js/feeds.js @@ -116,10 +116,24 @@ class Item { function initFeeds() { - setTimeout(refreshFeeds, 1) - setInterval(refreshFeeds, 3000) + setTimeout(fetchRevision, 1) + setInterval(fetchRevision, 3000) } +function fetchRevision() { + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var newRevision = parseInt(this.responseXML.getElementsByTagName("Revision")[0].childNodes[0].nodeValue) + if (newRevision > revision) { + revision = newRevision + refreshFeeds() + } + } + } + xmlhttp.open("GET", "/MuWire/Feed?section=revision", true) + xmlhttp.send() +} function refreshFeeds() { var xmlhttp = new XMLHttpRequest() @@ -375,6 +389,7 @@ function download(infoHash) { xmlhttp.send("action=download&host=" + hostB64 + "&infoHash=" + infoHash) } +var revision = 0 var feeds = new Map() var currentFeed = null