%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/resources/mobile.watchstar/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/resources/mobile.watchstar/Watchstar.js |
( function ( M ) {
var View = M.require( 'mobile.startup/View' ),
WatchstarGateway = M.require( 'mobile.watchstar/WatchstarGateway' ),
Icon = M.require( 'mobile.startup/Icon' ),
watchIcon = new Icon( {
name: 'watch',
additionalClassNames: 'watch-this-article'
} ),
watchedIcon = new Icon( {
name: 'watched',
additionalClassNames: 'watch-this-article watched'
} ),
toast = M.require( 'mobile.startup/toast' ),
user = M.require( 'mobile.startup/user' ),
CtaDrawer = M.require( 'mobile.startup/CtaDrawer' );
/**
* A clickable watchstar
* @class Watchstar
* @extends View
* @uses CtaDrawer
* @uses Icon
* @uses WatchstarGateway
* @uses Toast
* @fires Watchstar#unwatch
* @fires Watchstar#watch
*
* @param {Object} options Configuration options
*/
function Watchstar() {
View.apply( this, arguments );
}
OO.mfExtend( Watchstar, View, {
/**
* @inheritdoc
* @memberof Watchstar
* @instance
*/
events: {
// Disable clicks on original link
'click a': 'onLinksClick',
click: 'onStatusToggle'
},
/**
* @memberof Watchstar
* @instance
* @mixes View#defaults
* @property {Object} defaults Default options hash.
* @property {mw.Api} defaults.api
* @property {Page} defaults.page Current page.
* @property {string} defaults.funnel to log events with
*/
defaults: {
page: undefined,
funnel: 'unknown'
},
/**
* @memberof Watchstar
* @instance
* @property {Object} ctaDrawerOptions Default options hash for the anonymous CtaDrawer.
*/
ctaDrawerOptions: {
content: mw.msg( 'mobile-frontend-watchlist-cta' ),
queryParams: {
warning: 'mobile-frontend-watchlist-purpose',
campaign: 'mobile_watchPageActionCta',
returntoquery: 'article_action=watch'
},
signupQueryParams: {
warning: 'mobile-frontend-watchlist-signup-action'
}
},
/**
* @memberof Watchstar
* @instance
*/
tagName: 'div',
/**
* @memberof Watchstar
* @instance
*/
className: watchIcon.getClassName(),
/**
* @memberof Watchstar
* @instance
*/
template: mw.template.compile( '<a role="button">{{tooltip}}</a>', 'hogan' ),
/**
* @inheritdoc
* @memberof Watchstar
* @instance
*/
initialize: function ( options ) {
var self = this,
_super = View.prototype.initialize;
this._watched = options.isWatched;
this.gateway = new WatchstarGateway( options.api );
_super.call( self, options );
},
/**
* @inheritdoc
* @memberof Watchstar
* @instance
*/
preRender: function () {
this.options.tooltip = this._watched ? mw.msg( 'unwatchthispage' ) : mw.msg( 'watchthispage' );
},
/**
* @inheritdoc
* @memberof Watchstar
* @instance
*/
postRender: function () {
var unwatchedClass = watchIcon.getGlyphClassName(),
watchedClass = watchedIcon.getGlyphClassName() + ' watched';
// add tooltip to the div, not the <a> inside
// because that <a> has zero width/height so cannot be hovered
this.$el.attr( 'title', this.options.tooltip );
// Add watched class if necessary
if ( !user.isAnon() && this._watched ) {
this.$el.addClass( watchedClass ).removeClass( unwatchedClass );
} else {
this.$el.addClass( unwatchedClass ).removeClass( watchedClass );
}
this.$el.removeClass( 'hidden' );
},
/**
* Prevent default on incoming events
* @memberof Watchstar
* @instance
* @param {jQuery.Event} ev
*/
onLinksClick: function ( ev ) {
ev.preventDefault();
},
/**
* Triggered when a user anonymously clicks on the watchstar.
* @memberof Watchstar
* @instance
*/
onStatusToggleAnon: function () {
if ( !this.drawer ) {
this.drawer = new CtaDrawer( this.ctaDrawerOptions );
}
this.drawer.show();
},
/**
* Triggered when a logged in user clicks on the watchstar.
* @memberof Watchstar
* @instance
*/
onStatusToggleUser: function () {
var
self = this,
gateway = this.gateway,
page = this.options.page,
checker,
postWatched = !this._watched;
checker = setInterval( function () {
toast.show( mw.msg( 'mobile-frontend-watchlist-please-wait' ) );
}, 1000 );
function stopInterval() {
clearInterval( checker );
}
gateway.postStatusesByTitle( [ page.getTitle() ], postWatched ).then( function () {
stopInterval();
self._watched = postWatched;
if ( postWatched ) {
self.render();
/**
* Fired when the watch star is changed to watched status
* @event Watchstar#watch
*/
self.emit( 'watch' );
toast.show( mw.msg( 'mobile-frontend-watchlist-add', page.title ) );
} else {
/**
* Fired when the watch star is changed to unwatched status
* @event Watchstar#unwatch
*/
self.emit( 'unwatch' );
self.render();
toast.show( mw.msg( 'mobile-frontend-watchlist-removed', page.title ) );
}
}, function () {
stopInterval();
toast.show( mw.msg( 'mobile-frontend-watchlist-error' ), 'error' );
} );
},
/**
* Event handler for clicking on watch star.
* Make an API request if user is not anonymous.
* @memberof Watchstar
* @instance
*/
onStatusToggle: function () {
if ( user.isAnon() ) {
this.onStatusToggleAnon.apply( this, arguments );
} else {
this.onStatusToggleUser.apply( this, arguments );
}
}
} );
M.define( 'mobile.watchstar/Watchstar', Watchstar );
}( mw.mobileFrontend ) );