mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-11-24 07:54:13 +00:00
5943b13b5b
The text for 'type' in the documentation of the parent describes the notification type can be 'all', following 'message' and 'alert'. That is actually used, for instance inside of mw.echo.Controller.markLocalNotificationsRead() function. The gap between doc and implementation results in bugs. This resolves the gap. Bug: T270879 Change-Id: I546aa42e927a05a5426db90153901ae632b97e36
145 lines
3.9 KiB
JavaScript
145 lines
3.9 KiB
JavaScript
( function () {
|
|
/**
|
|
* Notification API handler
|
|
*
|
|
* @class
|
|
* @extends mw.echo.api.APIHandler
|
|
*
|
|
* @constructor
|
|
* @param {Object} [config] Configuration object
|
|
*/
|
|
mw.echo.api.LocalAPIHandler = function MwEchoApiLocalAPIHandler( config ) {
|
|
// Parent constructor
|
|
mw.echo.api.LocalAPIHandler.super.call( this,
|
|
new mw.Api( { ajax: { cache: false } } ),
|
|
config
|
|
);
|
|
};
|
|
|
|
/* Setup */
|
|
|
|
OO.inheritClass( mw.echo.api.LocalAPIHandler, mw.echo.api.APIHandler );
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
mw.echo.api.LocalAPIHandler.prototype.fetchNotifications = function ( type, source, isForced, overrideParams ) {
|
|
if ( overrideParams ) {
|
|
return this.createNewFetchNotificationPromise( type, source, overrideParams );
|
|
} else if ( isForced || this.isFetchingErrorState( type, source ) ) {
|
|
// Force new promise
|
|
return this.createNewFetchNotificationPromise( type, source, overrideParams );
|
|
}
|
|
|
|
return this.getFetchNotificationPromise( type, source, overrideParams );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
mw.echo.api.LocalAPIHandler.prototype.updateSeenTime = function ( type ) {
|
|
type = Array.isArray( type ) ? type : [ type ];
|
|
|
|
// This is a GET request, not a POST request, for multi-DC support (see T222851)
|
|
return this.api.get( {
|
|
action: 'echomarkseen',
|
|
type: type.length === 1 ? type[ 0 ] : 'all',
|
|
timestampFormat: 'ISO_8601'
|
|
} )
|
|
.then( function ( data ) {
|
|
return data.query.echomarkseen.timestamp;
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
mw.echo.api.LocalAPIHandler.prototype.markAllRead = function ( source, type ) {
|
|
var data = {
|
|
action: 'echomarkread'
|
|
};
|
|
type = Array.isArray( type ) ? type : [ type ];
|
|
if ( type.indexOf( 'all' ) !== -1 ) {
|
|
// As specified in the documentation of the parent function, the type parameter can be
|
|
// 'all'. We especially handle that case here to match the PHP API. Note: Other values
|
|
// of the array will be ignored.
|
|
data.all = true;
|
|
} else {
|
|
data.sections = type.join( '|' );
|
|
}
|
|
if ( !this.isSourceLocal( source ) ) {
|
|
data.wikis = source;
|
|
}
|
|
|
|
return this.api.postWithToken( 'csrf', data )
|
|
.then( function ( result ) {
|
|
return OO.getProp( result.query, 'echomarkread', type, 'rawcount' ) || 0;
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
mw.echo.api.LocalAPIHandler.prototype.markItemsRead = function ( source, itemIdArray, isRead ) {
|
|
var data = {
|
|
action: 'echomarkread'
|
|
};
|
|
|
|
if ( !this.isSourceLocal( source ) ) {
|
|
data.wikis = source;
|
|
}
|
|
|
|
if ( isRead ) {
|
|
data.list = itemIdArray.join( '|' );
|
|
} else {
|
|
data.unreadlist = itemIdArray.join( '|' );
|
|
}
|
|
|
|
return this.api.postWithToken( 'csrf', data );
|
|
};
|
|
|
|
/**
|
|
* Fetch the number of unread notifications.
|
|
*
|
|
* @param {string} type Notification type, 'alert', 'message' or 'all'
|
|
* @param {boolean} [ignoreCrossWiki] Ignore cross-wiki notifications when fetching the count.
|
|
* If set to false (by default) it counts notifications across all wikis.
|
|
* @return {jQuery.Promise} Promise which resolves with the unread count
|
|
*/
|
|
mw.echo.api.LocalAPIHandler.prototype.fetchUnreadCount = function ( type, ignoreCrossWiki ) {
|
|
var normalizedType = this.normalizedType[ type ],
|
|
apiData = {
|
|
action: 'query',
|
|
meta: 'notifications',
|
|
notsections: normalizedType,
|
|
notgroupbysection: 1,
|
|
notmessageunreadfirst: 1,
|
|
notlimit: this.limit,
|
|
notprop: 'count',
|
|
uselang: this.userLang
|
|
};
|
|
|
|
if ( !ignoreCrossWiki ) {
|
|
apiData.notcrosswikisummary = 1;
|
|
}
|
|
|
|
return this.api.get( apiData )
|
|
.then( function ( result ) {
|
|
if ( type === 'message' || type === 'alert' ) {
|
|
return OO.getProp( result.query, 'notifications', normalizedType, 'rawcount' ) || 0;
|
|
} else {
|
|
return OO.getProp( result.query, 'notifications', 'rawcount' ) || 0;
|
|
}
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
mw.echo.api.LocalAPIHandler.prototype.getTypeParams = function ( type ) {
|
|
return $.extend( {}, this.typeParams[ type ], {
|
|
notcrosswikisummary: 1
|
|
} );
|
|
};
|
|
}() );
|