wikimedia/mediawiki-extensions-UniversalLanguageSelector

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

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * ULS preferences system for MediaWiki.
 * Localstorage for anonymous users, preferences for logged in users.
 *
 * Copyright (C) 2012 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 ULSPreferences, instance;

    ULSPreferences = function () {
        // This violates coding conventions for localstorage:
        // https://www.mediawiki.org/wiki/Manual:Coding_conventions/JavaScript#Keys
        this.preferenceName = 'uls-preferences';
        this.username = mw.user.getName();
        this.isNamed = mw.user.isNamed();
        this.preferences = null;
        this.init();
    };

    ULSPreferences.prototype = {
        init: function () {
            if ( this.isNamed ) {
                try {
                    this.preferences = JSON.parse( mw.user.options.get( this.preferenceName ) );
                } catch ( e ) {
                }

            } else {
                this.preferences = mw.storage.getObject( this.preferenceName );
            }

            if ( !$.isPlainObject( this.preferences ) ) {
                this.preferences = {};
            }
        },

        /**
         * Set the preference
         *
         * @param {string} key
         * @param {Mixed} value
         */
        set: function ( key, value ) {
            this.preferences[ key ] = value;
        },

        /**
         * Get a preference value for the given preference name
         *
         * @param {string} key
         * @return {Mixed}
         */
        get: function ( key ) {
            return this.preferences[ key ];
        },

        /**
         * Save the preferences
         *
         * @param {Function} callback
         */
        save: function ( callback ) {
            var self = this;

            callback = callback || function () {};
            if ( this.isNamed ) {
                // Registered user. Use MW APIs to change preferences
                new mw.Api().saveOption(
                    this.preferenceName,
                    JSON.stringify( this.preferences )
                ).done( function () {
                    callback.call( self, true );
                } ).fail( function () {
                    callback.call( self, false );
                } );
            } else {
                // Anonymous user. Save preferences in local storage
                mw.storage.setObject( this.preferenceName, this.preferences );
                callback.call( this, true );
            }
        }
    };

    module.exports = function () {
        instance = instance || new ULSPreferences();
        return instance;
    };
}() );