User:AnYiLin/js/ConfirmLogout.js

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

/**
 * Copyright (c) 2020-present, 安忆.
 *
 * @author 安忆 [[zh:U:安忆]]
 * @file ConfirmLogout.js
 * @license GPL v3
 */
$(function confirmLogout() {
  var $body = $(document).find('body');
  var $element = $().add($body.find('#ca-cb-logout>a,#topbar>a[href*="UserLogout"],#pt-logout>a')).add($body.find('.minerva-icon--logOut').parent('.minerva-user-menu,.toggle-list-item__anchor').not('[target]'));
  if (!$element.length || !mw.config.get('wgUserName')) {
    return;
  }
  mw.loader.using(['ext.gadget.ding', 'ext.gadget.site-lib', 'mediawiki.api', 'mediawiki.util', 'oojs-ui-windows']).then(function () {
    var clickListener = function clickListener(event) {
      event.preventDefault();
      OO.ui.confirm($('<div>').addClass('oo-ui-window-foot').css({
        border: '.1rem solid #0645ad',
        display: 'flex',
        'justify-content': 'space-evenly'
      }).append($('<span>').css({
        'font-size': '1.2rem',
        'font-weight': '500',
        'line-height': '1.8',
        padding: '.4em 0'
      }).text('您' + wgULS('确', '確') + '定要' + wgULS('退', '登') + '出' + wgULS('吗', '嗎') + '?'))).then(function (isConfirm) {
        if (!isConfirm) {
          return;
        }
        window.bldkDingExposedInterface(mw.message('logging-out-notify'), 'default', 'long');
        new mw.Api().postWithEditToken({
          action: 'logout'
        }).then(function () {
          location.reload();
        });
      });
    };
    var refreshEventListener = function refreshEventListener(_$element) {
      var hoverListener = function hoverListener() {
        _$element.off('click');
        _$element.on('click', clickListener);
      };
      var hoverListenerWithDebounce = mw.util.debounce(hoverListener, 200, true);
      _$element.on('mouseover touchstart', hoverListenerWithDebounce);
    };
    refreshEventListener($element);
    if (mw.config.get('skin') !== 'vector-2022') {
      return;
    }
    var observerCallback = function observerCallback(_mutations, observer) {
      if (!$body.hasClass('vector-sticky-header-visible')) {
        return;
      }
      var SELECTOR = '#pt-logout-sticky-header>a';
      var element = document.querySelector(SELECTOR);
      if (!element) {
        return;
      }
      var elementClone = element.cloneNode(true);
      element.replaceWith(elementClone);
      refreshEventListener($(SELECTOR));
      observer.disconnect();
    };
    var mutationObserver = new MutationObserver(observerCallback);
    mutationObserver.observe(document.body, {
      attributes: true,
      attributeFilter: ['class']
    });
  });
});