wikimedia/mediawiki-extensions-MobileFrontend

View on GitHub
src/mobile.editor.overlay/blockMessageDrawer.js

Summary

Maintainability
A
1 hr
Test Coverage
const
    Drawer = require( '../mobile.startup/Drawer' ),
    BlockMessageDetails = require( './BlockMessageDetails' );

/**
 * @private
 * @typedef {Object} BlockMessageOptions
 * @property {number} blockId representing the block
 * @property {boolean} partial is this a partial block?
 * @property {Object} creator
 * @property {string} creator.name of the blocker
 * @property {string} creator.url associated with the block
 * @property {string} reason for block
 * @property {string} [duration] of block e.g. "1 week"
 * @property {string} [expiry] of block, wrapped in parentheses
 *  e.g. "(1st September 2019)"
 */

/**
 * This creates the drawer at the bottom of the screen that appears when a
 * blocked user tries to edit.
 *
 * @private
 * @param {BlockMessageOptions} props
 * @return {module:mobile.startup/Drawer}
 */
module.exports = function blockMessageDrawer( props ) {
    const blockDrawer = new Drawer( {
        className: 'drawer block-message',
        onBeforeHide: function ( drawer ) {
            drawer.$el.remove();
        },
        onShow: function () {
            const $drawer = blockDrawer.$el.find( '.drawer.block-message' ),
                drawerTop = $drawer.offset().top - 100,
                creatorTop = blockDrawer.$el.find( '.block-message-creator' ).offset().top - 100,
                buttonsTop = blockDrawer.$el.find( '.block-message-buttons' ).offset().top - 100,
                $seeMore = blockDrawer.$el.find( '.block-message-see-more' ),
                wiki = mw.config.get( 'wgDBname' );

            $drawer.css( 'top', drawerTop + ( buttonsTop - creatorTop ) );
            $seeMore.on(
                'click',
                function () {
                    const $container = blockDrawer.$el.find( '.block-message-container' );
                    $drawer.css( 'top', 0 );
                    $container.css( 'overflow-y', 'auto' );
                    $container.css( 'height', buttonsTop - $container.offset().top );
                    $seeMore.hide();

                    if ( mw.config.get( 'wgMFTrackBlockNotices' ) ) {
                        mw.track( 'counter.MediaWiki.BlockNotices.' + wiki + '.MobileFrontend.reasonShown', 1 );
                    }
                }
            );

            if ( mw.config.get( 'wgMFTrackBlockNotices' ) ) {
                mw.track( 'counter.MediaWiki.BlockNotices.' + wiki + '.MobileFrontend.shown', 1 );
            }
        },
        children: [
            ( new BlockMessageDetails( props ) ).$el
        ]
    } );
    return blockDrawer;
};