MediaWiki:Gadget-PurgeButton.js

From Cosmoteer Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*
 * made by aliser
 * repo: https://github.com/murolem/cosmoteer-wiki-purge-page-button-gadget
*/

$(function() {
  var logPrefix = "purge-button";
  var className = "purge-btn";
  var actionResultDisplayDurationMs = 1e3;
  function purgeCurrentPage() {
    var pageUrlWithoutParams = window.location.href.split("?")[0];
    var purgeUrl = "".concat(pageUrlWithoutParams, "?action=purge");
    setPurgeButtonProgressState("in-progress");
    fetch(purgeUrl, {
      "method": "POST"
      // "credentials": "include"
    }).catch(function(err) {
      console.error("[".concat(logPrefix, "] purge failed (request error)!"));
      console.log(err);
      setPurgeButtonProgressState("done--failure");
    }).then(function(res) {
      if (res && res.ok) {
        console.log("[".concat(logPrefix, "] purge successful!"));
        setPurgeButtonProgressState("done--success");
      } else {
        console.error("[".concat(logPrefix, "] purge failed (no response/non-ok code)"));
        console.log(res);
        setPurgeButtonProgressState("done--failure");
      }
    });
  }
  var classByProgressState = {
    "none": "".concat(className, "--progress-state-none"),
    "in-progress": "".concat(className, "--progress-state-in-progress"),
    "done--success": "".concat(className, "--progress-state-success"),
    "done--failure": "".concat(className, "--progress-state-failure")
  };
  var navbarMoreButton = $("#p-cactions");
  var buttonList = navbarMoreButton.find("ul.vector-menu-content-list");
  var existingPurgeButtons = buttonList.children().toArray().filter(function(el) {
    var _a;
    return (_a = el.textContent) == null ? void 0 : _a.toLocaleLowerCase().includes("purge cache");
  });
  if (existingPurgeButtons.length > 0) {
    console.log("[".concat(logPrefix, "] found existing purge buttons (").concat(existingPurgeButtons.length, "), they will be removed: "), existingPurgeButtons);
    existingPurgeButtons.forEach(function(btn) {
      return btn.remove();
    });
  }
  var purgeButton = $('\n    <li class="'.concat(className, '--btn mw-list-item" style="\n    ">\n        <a title="Purge the page\'s cache. This will force all the page visitors to load the most recent version of the page.">\n            <span>Purge Cache</span>\n        </a>\n    </li>\n    '));
  purgeButton.find("a")[0].addEventListener("click", purgeCurrentPage);
  buttonList.append(purgeButton);
  var resultDisplayTimeoutHandle = void 0;
  var setPurgeButtonProgressState = function(state) {
    var setProgressStateClass = function(stateToAdd) {
      var classToAdd = classByProgressState[stateToAdd];
      var classesToRemove = Object.entries(classByProgressState).filter(function(entry) {
        return entry[0] !== stateToAdd;
      }).map(
        function(entry) {
          return entry[1];
        }
        /* class name */
      );
      purgeButton.addClass(classToAdd);
      purgeButton.removeClass(classesToRemove);
    };
    switch (state) {
      case "none":
        clearTimeout(resultDisplayTimeoutHandle);
        setProgressStateClass("none");
        break;
      case "in-progress":
        clearTimeout(resultDisplayTimeoutHandle);
        setProgressStateClass("in-progress");
        break;
      case "done--success":
        clearTimeout(resultDisplayTimeoutHandle);
        setProgressStateClass("done--success");
        resultDisplayTimeoutHandle = window.setTimeout(function() {
          return setPurgeButtonProgressState("none");
        }, actionResultDisplayDurationMs);
        break;
      case "done--failure":
        setProgressStateClass("done--failure");
        resultDisplayTimeoutHandle = window.setTimeout(function() {
          return setPurgeButtonProgressState("none");
        }, actionResultDisplayDurationMs);
        break;
      default:
        throw new Error("[".concat(logPrefix, "]unsupported progress state: ") + state);
    }
  };
});