wikimedia/mediawiki-extensions-MobileFrontend

View on GitHub
src/mobile.startup/Skin.js

Summary

Maintainability
A
1 hr
Test Coverage
const browser = require( './Browser' ).getSingleton(),
    View = require( './View' ),
    util = require( './util' ),
    currentPage = require( './currentPage' ),
    eventBus = require( './eventBusSingleton' ),
    mfExtend = require( './mfExtend' );

let skin;

/**
 * Representation of the current skin being rendered.
 *
 * @class Skin
 * @extends module:mobile.startup/View
 * @uses Browser
 * @uses Page
 * @fires Skin#click
 * @param {Object} params Configuration options
 * @param {OO.EventEmitter} params.eventBus Object used to listen for
 * @param {Page} params.page
 * scroll:throttled, resize:throttled, and section-toggled events
 */
function Skin( params ) {
    const options = util.extend( {}, params );

    this.page = options.page;
    this.name = options.name;
    this.eventBus = options.eventBus;
    options.isBorderBox = false;
    View.call( this, options );
}

mfExtend( Skin, View, {
    /**
     * @memberof Skin
     * @instance
     * @mixes module:mobile.startup/View#defaults
     * @property {Object} defaults Default options hash.
     * @property {Page} defaults.page page the skin is currently rendering
     */
    defaults: {
        page: undefined
    },

    /**
     * @inheritdoc
     * @memberof Skin
     * @instance
     */
    postRender() {
        const $el = this.$el;

        if ( browser.supportsTouchEvents() ) {
            $el.addClass( 'touch-events' );
        }

        /**
         * Fired when the skin is clicked.
         *
         * @event Skin#click
         */
        this.$el.find( '#mw-mf-page-center' ).on( 'click', ( ev ) => {
            this.emit( 'click', ev );
        } );
    },

    /**
     * @memberof Skin
     * @throws {Error} if mediawiki message is in unexpected format.
     * @return {jQuery.Object} a list of links
     */
    getLicenseLinks() {
        const mobileLicense = mw.message( 'mobile-frontend-license-links' );
        const mobileMsgExists = mobileLicense.exists() && mobileLicense.text();
        const userLanguage = mw.config.get( 'wgUserLanguage' );
        if ( userLanguage === 'qqx' ) {
            // Special handling for qqx code so we can easily debug what's going on here.
            return mobileLicense.parseDom();
        } else {
            return mobileMsgExists ? mobileLicense.parseDom() : this.$el.find( '#footer-info-copyright a' ).clone();
        }
    },
    /**
     * Returns the appropriate license message including links/name to
     * terms of use (if any) and license page
     *
     * @memberof Skin
     * @instance
     * @return {string|undefined}
     */
    getLicenseMsg() {
        const $licenseLinks = this.getLicenseLinks();

        let licenseMsg;
        if ( $licenseLinks.length ) {
            const licensePlural = mw.language.convertNumber(
                $licenseLinks.filter( 'a' ).length
            );

            if ( this.$el.find( '#footer-places-terms-use' ).length > 0 ) {

                const $termsLink = mw.message(
                    'mobile-frontend-editor-terms-link',
                    this.$el.find( '#footer-places-terms-use a' ).attr( 'href' )
                ).parseDom();
                licenseMsg = mw.message(
                    'mobile-frontend-editor-licensing-with-terms',
                    $termsLink,
                    $licenseLinks,
                    licensePlural
                ).parse();
            } else {
                licenseMsg = mw.message(
                    'mobile-frontend-editor-licensing',
                    $licenseLinks,
                    licensePlural
                ).parse();
            }
        }

        return licenseMsg;
    }
} );

/**
 * Get a skin singleton
 *
 * @return {Skin}
 */
Skin.getSingleton = function () {
    if ( !skin ) {
        skin = new Skin( {
            el: 'body',
            page: currentPage(),
            eventBus
        } );
    }
    return skin;
};
module.exports = Skin;