Ir para o conteúdo

MediaWiki:Gadget-FixEcho.js

De Undertale Wiki

Nota: Após publicar, você pode ter que limpar o "cache" do seu navegador para ver as alterações.

  • Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
  • Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
  • Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5.
  • Opera: Pressione Ctrl-F5.
const ECHO_GET_ACTIONS = ['notifications', 'unreadnotificationpages'];
const ECHO_POST_ACTIONS = ['echomarkread'];

function inferWikiUrl(wikiId) {
    if (typeof wikiId !== 'string') {
        return;
    }
    const [lang, wiki] = wikiId.split('_');
    if (!lang || !wiki) {
        return;
    }
    if (window.location.host.includes('dev')) {
        if (lang === 'en') {
            return `https://dev.${wiki}.wiki`;
        }
        return `https://dev-${lang}.${wiki}.wiki`;
    }
    if (lang === 'en') {
        return `https://${wiki}.wiki`;
    }
    return `https://${lang}.${wiki}.wiki`;
}

let circuitBreaker = false;

const originalAjax = mw.Api.prototype.ajax;
mw.Api.prototype.ajax = function(parameters, ajaxOptions) {
    // OVERRIDEN BY THE FixEcho GADGET!
    if (circuitBreaker) {
        circuitBreaker = false;
        return originalAjax.call(this, parameters, ajaxOptions);
    }
    if (typeof parameters !== 'object') {
        return originalAjax.call(this, parameters, ajaxOptions);
    }
    const isGet = ajaxOptions.type === 'GET' &&
                  parameters.action === 'query' &&
                  ECHO_GET_ACTIONS.includes(parameters.meta);
    const isPost = ajaxOptions.type === 'POST' &&
                   ECHO_POST_ACTIONS.includes(parameters.action);
    if (!isGet && !isPost) {
        return originalAjax.call(this, parameters, ajaxOptions);
    }
    const wikiParam = isGet ?
        (parameters.notwikis || parameters.unpwikis) :
        parameters.wikis;
    if (!wikiParam) {
        return originalAjax.call(this, parameters, ajaxOptions);
    }
    const wikiId = Array.isArray(wikiParam) ? wikiParam[0] : wikiParam;
    const wikiUrl = inferWikiUrl(wikiId);
    if (!wikiUrl) {
        return originalAjax.call(this, parameters, ajaxOptions);
    }
    const newApi = new mw.ForeignApi(`${wikiUrl}/api.php`);
    circuitBreaker = true;
    return newApi.getToken('csrf').then(token => newApi.ajax(
        Object.assign(parameters, {token}),
        ajaxOptions
    ));
};

document.addEventListener('click', event => {
    const target = event.target
        .closest('a.mw-echo-ui-notificationItemWidget-unread');
    if (
        !target ||
        event.ctrlKey ||
        event.shiftKey ||
        event.metaKey ||
        event.altKey
    ) {
        return;
    }
    const url = new URL(target.href);
    if (url.pathname.startsWith('/d/')) {
        const api = new mw.echo.api.EchoApi();
        api.markItemsRead(
            [Number(url.searchParams.get('markasread'))],
            url.searchParams.get('markasreadwiki'),
            true
        );
    }
});