( function ( mw, M, $, OO ) {
var Drawer = M.require( 'mobile.drawers/Drawer' ),
Button = M.require( 'mobile.startup/Button' ),
icons = M.require( 'mobile.startup/icons' );
/**
* Drawer for the link preview feature on a mobile device
*
* @class LinkPreviewDrawer
* @extends Drawer
*/
function LinkPreviewDrawer() {
Drawer.apply( this, arguments );
}
OO.mfExtend( LinkPreviewDrawer, Drawer, {
/**
* @cfg {Object} defaults Default options hash.
* @cfg {string} defaults.spinner html of spinner icon
* @cfg {Object} defaults.continueButton HTML of the continue button.
*/
defaults: {
spinner: icons.spinner().toHtmlString(),
continueButton: new Button( {
progressive: true,
label: mw.msg( 'popups-mobile-continue-to-page' ),
additionalClassNames: 'linkpreview-continue'
} ).options,
dismissButton: new Button( {
label: mw.msg( 'popups-mobile-dismiss' ),
additionalClassNames: 'linkpreview-dismiss'
} ).options
},
/**
* @inheritdoc
*/
template: mw.template.get( 'ext.popups.renderer.mobileRenderer', 'LinkPreviewDrawer.hogan' ),
/**
* @inheritdoc
*/
templatePartials: {
Button: Button.prototype.template
},
/**
* @inheritdoc
*/
events: $.extend( {}, Drawer.prototype.events, {
'click .linkpreview-continue, .linkpreview-title': 'onContinueClick',
'click .linkpreview-dismiss': 'hide'
} ),
/**
* @inheritdoc
*/
className: 'drawer linkpreview',
/**
* @inheritdoc
*/
closeOnScroll: false,
/**
* Cache for the api queries.
*
* @property {Object}
*/
cache: {},
/**
* @inheritdoc
*/
postRender: function () {
var $linkpreviewOverlay;
Drawer.prototype.postRender.apply( this, arguments );
$linkpreviewOverlay = $( '
' )
.addClass( 'linkpreview-overlay hidden' );
this.$el.before( $linkpreviewOverlay );
this.$linkpreview = this.$( '.linkpreview' );
this.$spinner = this.$( '.spinner' );
},
/**
* @inheritdoc
*/
show: function () {
$( '.linkpreview-overlay' ).removeClass( 'hidden' );
Drawer.prototype.show.apply( this, arguments );
},
/**
* @inheritdoc
*/
hide: function () {
Drawer.prototype.hide.apply( this, arguments );
$( '.linkpreview-overlay' ).addClass( 'hidden' );
},
/**
* Show the drawer with the initial spinner (and hide the content,
* that was (maybe) already added.
*
* @return {Object} this
*/
showWithSpinner: function () {
this.$spinner.removeClass( 'hidden' );
this.$el.addClass( 'loading' );
this.$linkpreview.addClass( 'hidden' );
this.show();
return this;
},
/**
* Hide the spinner (if any) and show the content of the drawer.
*
* @return {Object} this
*/
showContent: function () {
this.$spinner.addClass( 'hidden' );
this.$el.removeClass( 'loading' );
this.$linkpreview.removeClass( 'hidden' );
return this;
},
/**
* Load content from a given title, show it or redirect to this
* title if something went wrong.
*
* @param {string} title The target title
*/
loadNew: function ( title ) {
var self = this;
this.showWithSpinner();
this.title = title;
if ( !this.cache[ title ] ) {
mw.popups.api.get( {
action: 'query',
titles: title,
prop: 'extracts',
explaintext: true,
exintro: true,
exchars: 140,
formatversion: 2
}, {
headers: {
'X-Analytics': 'preview=1'
}
} ).done( function ( result ) {
var data;
if ( result.query.pages[ 0 ] ) {
data = result.query.pages[ 0 ];
self
.setTitle( data.title )
.setContent( data.extract )
.showContent();
self.cache[ title ] = data;
} else {
self.onContinueClick();
}
} ).fail( function () {
self.onContinueClick();
} );
} else {
self
.setTitle( this.cache[ title ].title )
.setContent( this.cache[ title ].extract )
.showContent();
}
},
/**
* Replace the current visible title with the given one.
*
* @param {string} title The new title (HTML isn't supported)
* @return {Object} this
*/
setTitle: function ( title ) {
this.$( '.linkpreview-title' ).text( title );
return this;
},
/**
* Replace the current visible content with the given one.
*
* @param {string} content The new content (HTML isn't supported)
* @return {Object} this
*/
setContent: function ( content ) {
this.$( '.linkpreview-content' ).text( content );
return this;
},
/**
* Handle the click on the "continue to article" button and redirect to the
* title (this.title).
*/
onContinueClick: function () {
window.location.href = mw.util.getUrl( this.title );
}
} );
M.define( 'ext.popups.mobilelinkpreview/LinkPreviewDrawer', LinkPreviewDrawer );
}( mediaWiki, mediaWiki.mobileFrontend, jQuery, OO ) );