wikimedia/mediawiki-extensions-UniversalLanguageSelector

View on GitHub
resources/js/ext.uls.setlang.js

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * Loaded when setlang query parameter is set on the page.
 *
 * @private
 * @since 2020.01
 *
 * Copyright (C) 2019-2020 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
 * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
 * contributors. See CREDITS for a list.
 *
 * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
 * have to do anything special to choose one license or the other and you don't
 * have to notify anyone which license you are using. You are free to use
 * UniversalLanguageSelector in commercial projects as long as the copyright
 * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
 *
 * @file
 * @ingroup Extensions
 * @licence GNU General Public Licence 2.0 or later
 * @licence MIT License
 */

( function () {
    'use strict';
    var $cancelBtn, $acceptBtn;

    function getHeading( languageName ) {
        return $( '<h4>' ).text(
            mw.msg( 'ext-uls-setlang-heading', languageName )
        );
    }

    function getMessage( languageName, languageCode ) {
        return $( '<p>' ).append(
            mw.message(
                'ext-uls-setlang-message',
                languageName,
                languageCode
            ).parseDom()
        );
    }

    function getButtons() {
        $cancelBtn = $( '<button>' )
            .addClass( 'cdx-button uls-setlang-cancel' )
            .text( mw.msg( 'ext-uls-setlang-cancel' ) );

        $acceptBtn = $( '<button>' )
            .addClass( 'cdx-button cdx-button--type-primary cdx-button--action-progressive active uls-setlang-apply' )
            .text( mw.msg( 'ext-uls-setlang-accept' ) );

        return $( '<div>' )
            .addClass( 'language-setlang-buttons' )
            .append(
                $cancelBtn,
                $acceptBtn
            );
    }

    function toggleLoading( $btnSubmit, isLoading ) {
        $btnSubmit
            .text( mw.msg( isLoading ? 'ext-uls-setlang-loading' : 'ext-uls-setlang-accept' ) )
            .prop( 'disabled', isLoading );
    }

    /**
     * @return {string}
     */
    function currentUrlWithoutSetLang() {
        var uri = new mw.Uri();
        delete uri.query.setlang;
        return uri.toString();
    }

    function removeSetLangFromHistory() {
        if ( 'setlang' in mw.Uri().query ) {
            history.replaceState( null, '', currentUrlWithoutSetLang() );
        }
    }

    function updateLanguage( langCode ) {
        var api = new mw.Api();
        return api.postWithToken( 'csrf', {
            action: 'ulssetlang',
            languagecode: langCode,
            formatversion: 2
        } ).done( function () {
            location.replace( currentUrlWithoutSetLang() );
        } ).fail( function ( code, result ) {
            var apiErrorInfo = result.error && result.error.info ||
                mw.msg( 'ext-uls-setlang-unknown-error' );
            mw.notify(
                mw.msg( 'ext-uls-setlang-error', apiErrorInfo ),
                {
                    type: 'error',
                    tag: 'uls-setlang-error'
                }
            );
        } );
    }

    function createSetLangDialog( languageName, languageCode ) {
        return $( '<div>' )
            .addClass( 'uls-setlang-dialog' )
            .append(
                getHeading( languageName ),
                getMessage( languageName, languageCode ),
                getButtons()
            ).appendTo( document.body );
    }

    function addSetLangDialogEvents( ulsDialog ) {
        $acceptBtn.on( 'click', function () {
            toggleLoading( $acceptBtn, true );
            updateLanguage( mw.config.get( 'wgULSSetLangCode' ) ).fail( function () {
                toggleLoading( $acceptBtn, false );
            } );
        } );

        $cancelBtn.on( 'click', function () {
            ulsDialog.close();
        } );
    }

    $( function () {
        var setLangCode = mw.config.get( 'wgULSSetLangCode' ),
            setLangName = mw.config.get( 'wgULSSetLangName' ),
            currentLangCode = mw.config.get( 'wgULSCurrentLangCode' ),
            $ulsDialog, ulsSetLangDialog;

        if ( currentLangCode === setLangCode ) {
            removeSetLangFromHistory();
            return;
        }

        // Setup and show the dialog
        $ulsDialog = createSetLangDialog( setLangName, setLangCode );
        ulsSetLangDialog = new mw.uls.Dialog( {
            container: $ulsDialog,
            hasOverlay: true,
            afterClose: removeSetLangFromHistory
        } );

        addSetLangDialogEvents( ulsSetLangDialog );

        setTimeout( ulsSetLangDialog.open );
    } );

}() );