MediaWiki:Gadget-FixEcho.js
Not: Yayımladıktan sonra değişiklikleri görmeniz için tarayıcınızın önbelleğini temizlemeniz gerekebilir.
- Firefox / Safari: Shift tuşuna basılıyken Yeniden Yükle'ye tıklayın ya da Ctrl-F5 ya da Ctrl-R tıklayın (Mac için ⌘-R)
- Google Chrome: Ctrl-Shift-R'ye basın. (Mac için ⌘-Shift-R)
- Edge: Ctrl basılıyken Yenile'ye tıklayın ya da Ctrl-F5'e basın.
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;
}
const devPrefix = window.location.host.includes('dev') ? 'dev.' : '';
const langPrefix = (lang === 'en') ? '' : `${lang}.`;
// <nowiki>
return `https://${devPrefix}${langPrefix}${wiki}.wiki`;
// </nowiki>
}
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 ||
!target.href ||
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
);
}
});