No edit summary
No edit summary
 
(22 intermediate revisions by the same user not shown)
Line 26: Line 26:
   });
   });
   element.addEventListener('click', (e) => {
   element.addEventListener('click', (e) => {
     // this will only get triggered on desktop
     // this will only get triggered on desktopg
     // because we call preventDefault for the "touchend" event
     // because we call preventDefault for the "touchend" event
     handler(e);
     handler(e);
Line 107: Line 107:
   }
   }
}
}
/* Jake */
/* Jakes Recent Changes Portlet */
(function () {
(function () {
   function jakeTimeAgo(d) {
   function jakeTimeAgo(date) {
     var s = Math.floor((Date.now() - d.getTime()) / 1000);
     var s = Math.floor((Date.now() - date.getTime()) / 1000);
     if (s < 60) return s + "s ago";
     if (s < 60) return s + "s ago";
     var m = Math.floor(s / 60);
     var m = Math.floor(s / 60);
Line 116: Line 116:
     var h = Math.floor(m / 60);
     var h = Math.floor(m / 60);
     if (h < 24) return h + "h ago";
     if (h < 24) return h + "h ago";
     var days = Math.floor(h / 24);
     var d = Math.floor(h / 24);
     return days + "d ago";
     return d + "d ago";
   }
   }


   function jakeBuildRecentChangesPortlet() {
   function jakeInjectStyles() {
     var jakeMenu = document.getElementById("vector-main-menu") || document.getElementById("mw-panel");
     if (document.getElementById("jake-rc-style")) return;
    if (!jakeMenu) return null;


    var style = document.createElement("style");
    style.id = "jake-rc-style";
    style.textContent =
      "#p-jake-recentchanges .vector-menu-heading{display:flex;align-items:center;justify-content:space-between;}" +
      "#p-jake-recentchanges .jake-rc-dot{width:8px;height:8px;border-radius:50%;background:#2da44e;box-shadow:0 0 0 2px rgba(45,164,78,.18);flex:0 0 auto;}" +
      "#p-jake-recentchanges .vector-menu-heading{font-size:.95em;}" +
      "#p-jake-recentchanges .vector-menu-content{font-size:.92em;}" +
      "#p-jake-recentchanges .jake-rc-meta{font-size:.85em;opacity:.85;}";
    document.head.appendChild(style);
  }
  function jakeBuildPortlet() {
    var menu =
      document.getElementById("vector-main-menu") ||
      document.getElementById("mw-panel");
    if (!menu) return null;
     if (document.getElementById("p-jake-recentchanges")) return null;
     if (document.getElementById("p-jake-recentchanges")) return null;


     var jakePortlet = document.createElement("div");
    jakeInjectStyles();
     jakePortlet.id = "p-jake-recentchanges";
 
     jakePortlet.className = "vector-menu mw-portlet";
     var portlet = document.createElement("div");
     portlet.id = "p-jake-recentchanges";
     portlet.className = "vector-menu mw-portlet";
 
    var heading = document.createElement("div");
    heading.className = "vector-menu-heading";
 
    var headingText = document.createElement("span");
    headingText.textContent = "Recent changes";


     var jakeHeading = document.createElement("div");
     var dot = document.createElement("span");
     jakeHeading.className = "vector-menu-heading";
     dot.className = "jake-rc-dot";
     jakeHeading.textContent = "Recent changes";
     dot.setAttribute("aria-hidden", "true");
    dot.title = "Live";


     var jakeContent = document.createElement("div");
     heading.appendChild(headingText);
     jakeContent.className = "vector-menu-content";
     heading.appendChild(dot);


     var jakeList = document.createElement("ul");
     var content = document.createElement("div");
     jakeList.className = "vector-menu-content-list";
     content.className = "vector-menu-content";
    jakeList.id = "jake-rc-list";


     var jakeMoreWrap = document.createElement("div");
     var ul = document.createElement("ul");
     jakeMoreWrap.className = "jake-rc-more";
     ul.className = "vector-menu-content-list";
    ul.id = "jake-rc-list";


     var jakeMoreLink = document.createElement("a");
     var moreWrap = document.createElement("div");
     jakeMoreLink.href = mw.util.getUrl("Special:RecentChanges");
     moreWrap.className = "jake-rc-more";
    jakeMoreLink.textContent = "Show more…";


     jakeMoreWrap.appendChild(jakeMoreLink);
     var moreLink = document.createElement("a");
    moreLink.href = mw.util.getUrl("Special:RecentChanges");
    moreLink.textContent = "Show more…";
    moreWrap.appendChild(moreLink);


     jakeContent.appendChild(jakeList);
     content.appendChild(ul);
     jakeContent.appendChild(jakeMoreWrap);
     content.appendChild(moreWrap);


     jakePortlet.appendChild(jakeHeading);
     portlet.appendChild(heading);
     jakePortlet.appendChild(jakeContent);
     portlet.appendChild(content);


     var jakeAfter = jakeMenu.querySelector("#p-navigation") || jakeMenu.firstElementChild;
     var discordPortlet = menu.querySelector("#p-Community");
     if (jakeAfter && jakeAfter.parentNode) {
     if (discordPortlet && discordPortlet.parentNode) {
       jakeAfter.parentNode.insertBefore(jakePortlet, jakeAfter.nextSibling);
       discordPortlet.parentNode.insertBefore(portlet, discordPortlet.nextSibling);
     } else {
     } else {
       jakeMenu.appendChild(jakePortlet);
       var navPortlet = menu.querySelector("#p-navigation");
      if (navPortlet && navPortlet.parentNode) {
        navPortlet.parentNode.insertBefore(portlet, navPortlet.nextSibling);
      } else {
        menu.appendChild(portlet);
      }
     }
     }


     return jakeList;
     return ul;
   }
   }


   function jakeLoadRecentChanges(jakeListEl) {
   function jakeLoadRecentChanges(ul) {
     if (!jakeListEl) return;
     if (!ul) return;
 
    var api = new mw.Api();
    api
      .get({
        action: "query",
        list: "recentchanges",
        rcnamespace: "0", /* 4 */
        rclimit: 5,
        rcprop: "title|timestamp|user",
        rcshow: "!bot",
        formatversion: 2
      })
      .then(function (data) {
        var items =
          data && data.query && data.query.recentchanges
            ? data.query.recentchanges
            : [];
 
        ul.textContent = "";
 
        for (var i = 0; i < items.length; i++) {
          var rc = items[i];
 
          var li = document.createElement("li");
          li.className = "mw-list-item jake-rc-item";
 
          var a = document.createElement("a");
          a.href = mw.util.getUrl(rc.title);
          a.textContent = rc.title;


    var jakeApi = new mw.Api();
          var meta = document.createElement("div");
    jakeApi.get({
          meta.className = "jake-rc-meta";
      action: "query",
          meta.textContent = jakeTimeAgo(new Date(rc.timestamp)) + " · " + (rc.user || "");
      list: "recentchanges",
      rcnamespace: 0,
      rclimit: 5,
      rcprop: "title|timestamp|user",
      rcshow: "!bot",
      formatversion: 2
    }).then(function (res) {
      var jakeItems = (res && res.query && res.query.recentchanges) ? res.query.recentchanges : [];
      jakeListEl.textContent = "";


      for (var i = 0; i < jakeItems.length; i++) {
          li.appendChild(a);
         var rc = jakeItems[i];
          li.appendChild(meta);
          ul.appendChild(li);
        }
      })
      .catch(function () {
         ul.textContent = "";


         var li = document.createElement("li");
         var li = document.createElement("li");
         li.className = "mw-list-item jake-rc-item";
         li.className = "mw-list-item jake-rc-item";


         var link = document.createElement("a");
         var a = document.createElement("a");
         link.href = mw.util.getUrl(rc.title);
         a.href = mw.util.getUrl("Special:RecentChanges");
         link.textContent = rc.title;
        a.textContent = "View recent changes";
 
        li.appendChild(a);
         ul.appendChild(li);
      });
  }
 
  function jakeInitRecentChanges() {
    if (!window.mw || !mw.util || !mw.Api) return;
 
    var ul = jakeBuildPortlet();
    if (!ul) ul = document.getElementById("jake-rc-list");
    if (!ul) return;
 
    jakeLoadRecentChanges(ul);
    setInterval(function () {
      jakeLoadRecentChanges(ul);
    }, 60000);
  }
 
  function jakeWaitForMenu() {
    var tries = 0;


        var meta = document.createElement("div");
    var timer = setInterval(function () {
         meta.className = "jake-rc-meta";
      var menu =
         meta.textContent = jakeTimeAgo(new Date(rc.timestamp)) + " · " + (rc.user || "");
         document.getElementById("vector-main-menu") ||
         document.getElementById("mw-panel");


         li.appendChild(link);
      if (menu) {
         li.appendChild(meta);
         clearInterval(timer);
         jakeListEl.appendChild(li);
         jakeInitRecentChanges();
         return;
       }
       }
    }).catch(function () {
      jakeListEl.textContent = "";


       var li = document.createElement("li");
       tries++;
       li.className = "mw-list-item jake-rc-item";
      if (tries > 50) clearInterval(timer);
    }, 200);
  }
 
  jakeWaitForMenu();
})();
/* */
/*
(function () {
  function jakeAddFeedbackToNamespaces() {
    var list = document.querySelector("#p-associated-pages .vector-menu-content-list");
    if (!list) return;
 
    var existing = document.getElementById("jake-feedback-btn");
    if (existing && !existing.closest("#p-associated-pages")) {
      var oldLi = existing.closest("li");
       if (oldLi) oldLi.remove();
      else existing.remove();
    }
 
    if (document.getElementById("ca-jake-feedback")) return;


      var link = document.createElement("a");
    var li = document.createElement("li");
      link.href = mw.util.getUrl("Special:RecentChanges");
    li.id = "ca-jake-feedback";
      link.textContent = "View recent changes";
    li.className = "vector-tab-noicon mw-list-item";


      li.appendChild(link);
    var a = document.createElement("a");
       jakeListEl.appendChild(li);
    a.id = "jake-feedback-btn";
    a.className = "jake-feedback-btn";
    a.href = mw.util.getUrl("Consumer_Rights_Wiki:Feedback", {
       from: mw.config.get("wgPageName")
     });
     });
    a.title = "Give feedback";
    var span = document.createElement("span");
    span.textContent = "Give feedback";
    a.appendChild(span);
    li.appendChild(a);
    list.appendChild(li);
  }
  function jakeInit() {
    if (!window.mw || !mw.util || !mw.config) return;
    jakeAddFeedbackToNamespaces();
   }
   }


   function jakeInitRecentChanges() {
   if (document.readyState === "loading") {
     if (!mw || !mw.util || !mw.Api) return;
    document.addEventListener("DOMContentLoaded", jakeInit);
  } else {
    jakeInit();
  }
})();
*/
/* */
(function () {
  function jakeAddFooterSocialRow() {
    var footer = document.getElementById("footer");
     if (!footer) return;
 
    var places = document.getElementById("footer-places");
    if (!places) return;
 
    if (document.getElementById("footer-social")) return;
 
    var ul = document.createElement("ul");
    ul.id = "footer-social";
    ul.className = "noprint crw-footer-social";
 
    function add(href, label) {
      var li = document.createElement("li");
      var a = document.createElement("a");
      a.href = href;
      a.textContent = label;
      a.setAttribute("aria-label", label);
      a.title = label;
 
      li.appendChild(a);
      ul.appendChild(li);
    }


     var jakeListEl = jakeBuildRecentChangesPortlet();
     // add("https://discord.gg/8w5rSNAXRf", "Discord");
     if (!jakeListEl) jakeListEl = document.getElementById("jake-rc-list");
     add("https://www.linkedin.com/company/consumer-rights-wiki/", "LinkedIn");
     if (!jakeListEl) return;
     add("https://www.reddit.com/user/ConsumerRightsWiki/", "Reddit");


     jakeLoadRecentChanges(jakeListEl);
     places.parentNode.insertBefore(ul, places.nextSibling);
    setInterval(function () {
      jakeLoadRecentChanges(jakeListEl);
    }, 60000);
   }
   }


   if (document.readyState === "loading") {
   if (document.readyState === "loading") {
     document.addEventListener("DOMContentLoaded", jakeInitRecentChanges);
     document.addEventListener("DOMContentLoaded", jakeAddFooterSocialRow);
   } else {
   } else {
     jakeInitRecentChanges();
     jakeAddFooterSocialRow();
   }
   }
})();
})();