Mooeypoo has uploaded a new change for review.
https://gerrit.wikimedia.org/r/298105
Change subject: [wip^2] Add a SeenTimeModel to handle seenTime in sources
......................................................................
[wip^2] Add a SeenTimeModel to handle seenTime in sources
Change-Id: I629ecfc84999be998b45c9c7adb00ea7e3e51742
---
M Resources.php
M modules/controller/mw.echo.Controller.js
M modules/ext.echo.init.js
M modules/model/mw.echo.dm.ModelManager.js
A modules/model/mw.echo.dm.SeenTimeModel.js
5 files changed, 124 insertions(+), 53 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Echo
refs/changes/05/298105/1
diff --git a/Resources.php b/Resources.php
index 42a5c72..c4c693b 100644
--- a/Resources.php
+++ b/Resources.php
@@ -177,6 +177,7 @@
'model/mw.echo.dm.SourcePagesModel.js',
'model/mw.echo.dm.PaginationModel.js',
'model/mw.echo.dm.FiltersModel.js',
+ 'model/mw.echo.dm.SeenTimeModel.js',
'model/mw.echo.dm.ModelManager.js',
'model/mw.echo.dm.SortedList.js',
'model/mw.echo.dm.NotificationItem.js',
diff --git a/modules/controller/mw.echo.Controller.js
b/modules/controller/mw.echo.Controller.js
index f51091b..a74f944 100644
--- a/modules/controller/mw.echo.Controller.js
+++ b/modules/controller/mw.echo.Controller.js
@@ -581,25 +581,7 @@
* seenTime was updated for all given types.
*/
mw.echo.Controller.prototype.updateLocalSeenTime = function () {
- var controller = this,
- promises = [],
- types = this.manager.getTypes();
-
- types.forEach( function ( type ) {
- promises.push( controller.api.updateSeenTime( 'local',
type ) );
- } );
-
- return mw.echo.api.NetworkHandler.static.waitForAllPromises(
promises )
- .then( function ( promises ) {
- var i;
- // Update the seen time object
- // The promises are in the same order as the
types
- // so we can use the same iterator for both
- for ( i = 0; i < promises.length; i++ ) {
- promises[ i ].done(
controller.manager.updateSeenTimeObject.bind( controller.manager, types[ i ] )
);
- }
- } )
- .then( controller.manager.setLocalModelItemsSeen.bind(
controller.manager ) );
+ this.manager.getSeenTimeModel().updateSeenTime( 'local' );
};
/**
diff --git a/modules/ext.echo.init.js b/modules/ext.echo.init.js
index 67422be..28e5a9b 100644
--- a/modules/ext.echo.init.js
+++ b/modules/ext.echo.init.js
@@ -53,6 +53,8 @@
alertModelManager,
unreadMessageCounter,
unreadAlertCounter,
+ alertSeenTimeModel,
+ messageSeenTimeModel,
maxNotificationCount = mw.config.get(
'wgEchoMaxNotificationCount' );
// Overlay
@@ -60,7 +62,8 @@
// Load message button and popup if messages
exist
if ( $existingMessageLink.length ) {
unreadMessageCounter = new
mw.echo.dm.UnreadNotificationCounter( echoApi, 'message', maxNotificationCount
);
- messageModelManager = new
mw.echo.dm.ModelManager( unreadMessageCounter, { type: 'message' } );
+ messageSeenTimeModel = new
mw.echo.dm.SeenTimeModel( echoApi, 'message' );
+ messageModelManager = new
mw.echo.dm.ModelManager( unreadMessageCounter, messageSeenTimeModel, { type:
'message' } );
messageController = new
mw.echo.Controller(
echoApi,
messageModelManager,
@@ -94,7 +97,8 @@
} );
}
unreadAlertCounter = new
mw.echo.dm.UnreadNotificationCounter( echoApi, 'alert', maxNotificationCount );
- alertModelManager = new
mw.echo.dm.ModelManager( unreadAlertCounter, { type: 'alert' } );
+ alertSeenTimeModel = new
mw.echo.dm.SeenTimeModel( echoApi, 'alert' );
+ alertModelManager = new
mw.echo.dm.ModelManager( unreadAlertCounter, alertSeenTimeModel, { type:
'alert' } );
alertController = new mw.echo.Controller(
echoApi,
alertModelManager,
diff --git a/modules/model/mw.echo.dm.ModelManager.js
b/modules/model/mw.echo.dm.ModelManager.js
index f119847..cced211 100644
--- a/modules/model/mw.echo.dm.ModelManager.js
+++ b/modules/model/mw.echo.dm.ModelManager.js
@@ -25,13 +25,14 @@
* @cfg {string|string[]} [type="message"] The type of the
notifications in
* the models that this manager handles.
*/
- mw.echo.dm.ModelManager = function MwEchoDmModelManager( counter,
config ) {
+ mw.echo.dm.ModelManager = function MwEchoDmModelManager( counter,
seenTimeModel, config ) {
config = config || {};
// Mixin constructor
OO.EventEmitter.call( this );
this.counter = counter;
+ this.seenTimeModel = seenTimeModel;
// Keep types in an array
this.types = config.type || 'message';
@@ -43,9 +44,6 @@
this.filtersModel = new mw.echo.dm.FiltersModel( {
selectedSource: 'local'
} );
-
- // Properties
- this.seenTime = mw.config.get( 'wgEchoSeenTime' ) || {};
};
OO.initClass( mw.echo.dm.ModelManager );
@@ -268,25 +266,6 @@
};
/**
- * Update the local version of seenTime object.
- *
- * @private
- * @param {string|string[]} type Type of notifications; could be a
single type
- * or an array of types.
- * @param {string} time Seen time
- */
- mw.echo.dm.ModelManager.prototype.updateSeenTimeObject = function (
type, time ) {
- var i,
- types = Array.isArray( type ) ? type : [ type ];
-
- for ( i = 0; i < types.length; i++ ) {
- if ( this.seenTime.hasOwnProperty( types[ i ] ) ) {
- this.seenTime[ types[ i ] ] = time;
- }
- }
- };
-
- /**
* Set items in the local model as seen
*
* @private
@@ -302,17 +281,11 @@
/**
* Get the system seen time
*
- * @param {string|string[]} [type] Notification types
+ * @param {string} [source='local'] Seen time source
* @return {string} Mediawiki seen timestamp in Mediawiki timestamp
format
*/
- mw.echo.dm.ModelManager.prototype.getSeenTime = function ( type ) {
- var types = type || this.getTypes();
- types = Array.isArray( types ) ? types : [ types ];
-
- // If the type that is set is an array [ 'alert', 'message' ]
- // then the seen time will be the same to both, and we can
- // return the value of the arbitrary first one.
- return this.seenTime[ types[ 0 ] ];
+ mw.echo.dm.ModelManager.prototype.getSeenTime = function ( source ) {
+ return this.getSeenTimeModel().getSeenTime( source );
};
/**
@@ -354,4 +327,8 @@
return notifications;
};
+ mw.echo.dm.ModelManager.prototype.getSeenTimeModel = function () {
+ return this.seenTimeModel;
+ };
+
} )( mediaWiki, jQuery );
diff --git a/modules/model/mw.echo.dm.SeenTimeModel.js
b/modules/model/mw.echo.dm.SeenTimeModel.js
new file mode 100644
index 0000000..8a2271d
--- /dev/null
+++ b/modules/model/mw.echo.dm.SeenTimeModel.js
@@ -0,0 +1,107 @@
+( function ( mw, $ ) {
+ /**
+ * SeenTime model for Echo notifications
+ *
+ * @param {mw.echo.api.EchoApi} echoApi Echo API
+ * @param {mw.echo.dm.ModelManager} manager Model manager
+ * @param {Object} [config] Configuration
+ */
+ mw.echo.dm.SeenTimeModel = function MwEchoSeenTimeModel( echoApi,
types, config ) {
+ config = config || {};
+
+ // Mixin constructor
+ OO.EventEmitter.call( this );
+
+ this.api = echoApi;
+ this.types = Array.isArray( types ) ? types : [ types ];
+
+ this.prioritizer = new mw.echo.api.PromisePrioritizer();
+
+ this.seenTime = {
+ local: mw.config.get( 'wgEchoSeenTime' ) || {}
+ };
+ };
+
+ /* Initialization */
+
+ OO.initClass( mw.echo.dm.SeenTimeModel );
+ OO.mixinClass( mw.echo.dm.SeenTimeModel, OO.EventEmitter );
+
+ /* Events */
+
+ /**
+ * @event update
+ * @param {string} source The source that updated its seenTime
+ * @param {number} time Seen time
+ *
+ * Seen time has been updated for the given source
+ */
+
+ /* Methods */
+
+ /**
+ * Update seen time value from the API, for the given source
+ *
+ * @param {string} [source='local'] Given source
+ * @return {jQuery.Promise} Promise that is resolved when the seen time
is
+ * updated to the new value
+ */
+ mw.echo.dm.SeenTimeModel.prototype.updateSeenTime = function ( source )
{
+ source = source || 'local';
+
+ return this.prioritizer.prioritize(
+ this.api.updateSeenTime( source, this.getTypes() )
+ )
+ .then( this.setSeenTimeForSource.bind( this, source ) );
+ };
+
+ /**
+ * Get the seenTime value for the source
+ *
+ * @param {string} source Source name
+ * @return {number} Seen time
+ */
+ mw.echo.dm.SeenTimeModel.prototype.getSeenTime = function ( source ) {
+ source = source || 'local';
+
+ return ( this.seenTime[ source ] && this.seenTime[ source ][
this.getTypes()[ 0 ] ] ) || 0;
+ };
+
+ /**
+ * Set the seen time value for the source
+ *
+ * @private
+ * @param {string} [source='local'] Given source
+ * @fires update
+ */
+ mw.echo.dm.SeenTimeModel.prototype.setSeenTimeForSource = function (
source, time ) {
+ var model = this,
+ hasChanged = false;
+
+ source = source || 'local';
+
+ this.seenTime[ source ] = this.seenTime[ source ] || {};
+
+ this.getTypes().forEach( function ( type ) {
+ if ( model.seenTime[ source ][ type ] !== time ) {
+ model.seenTime[ source ][ type ] = time;
+ hasChanged = true;
+ }
+ } );
+
+ if ( hasChanged ) {
+ this.emit( 'update', source, time );
+ }
+ };
+
+ /**
+ * Get the types associated with this model
+ *
+ * @private
+ * @return {string[]} Types for this model; an array of 'alert',
'message' or both.
+ */
+ mw.echo.dm.SeenTimeModel.prototype.getTypes = function () {
+ return this.types;
+ };
+
+} )( mediaWiki, jQuery );
--
To view, visit https://gerrit.wikimedia.org/r/298105
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I629ecfc84999be998b45c9c7adb00ea7e3e51742
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Echo
Gerrit-Branch: master
Gerrit-Owner: Mooeypoo <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits