diff --git a/extension.json b/extension.json index aa0735ed..1c18a9a2 100644 --- a/extension.json +++ b/extension.json @@ -323,8 +323,9 @@ "ext.uls.preferences": { "scripts": "js/ext.uls.preferences.js", "dependencies": [ + "mediawiki.api", "mediawiki.user", - "mediawiki.api" + "mediawiki.storage" ], "localBasePath": "resources", "remoteExtPath": "UniversalLanguageSelector/resources" diff --git a/resources/js/ext.uls.preferences.js b/resources/js/ext.uls.preferences.js index 09123994..7892161e 100644 --- a/resources/js/ext.uls.preferences.js +++ b/resources/js/ext.uls.preferences.js @@ -21,51 +21,11 @@ ( function () { 'use strict'; - var ULSPreferences; - - /** - * Wrapper for localStorage, falls back to cookie - * when localStorage not supported by browser. - * - * @return {Object} - */ - function preferenceStore() { - - // If value is detected, set new or modify store - return { - /* - * Set the value to the given key - * @param {string} key - * @param {Object} value value to be set - */ - set: function ( key, value ) { - // Convert object values to JSON - if ( typeof value === 'object' ) { - value = JSON.stringify( value ); - } - - try { - localStorage.setItem( key, value ); - } catch ( e ) {} - }, - /* - * Returns the value of the given key - * @param {string} key - * @return {Object} value of the key - */ - get: function ( key ) { - var data; - - try { - data = JSON.parse( localStorage.getItem( key ) ); - } catch ( e ) {} - - return data; - } - }; - } + 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.isAnon = mw.user.isAnon(); @@ -74,28 +34,19 @@ }; ULSPreferences.prototype = { - /** - * Initialize - */ init: function () { - var options; - if ( this.isAnon ) { - this.preferences = preferenceStore().get( this.preferenceName ); + this.preferences = mw.storage.getObject( this.preferenceName ); } else { - options = mw.user.options.get( this.preferenceName ); - if ( !options ) { - options = '{}'; - } - // Try to parse JSON try { - this.preferences = JSON.parse( options ); + this.preferences = JSON.parse( mw.user.options.get( this.preferenceName ) ); } catch ( e ) { - this.preferences = {}; } } - this.preferences = this.preferences || {}; + if ( !$.isPlainObject( this.preferences ) ) { + this.preferences = {}; + } }, /** @@ -124,22 +75,22 @@ * @param {Function} callback */ save: function ( callback ) { - var ulsPreferences = this; + var self = this; callback = callback || function () {}; if ( this.isAnon ) { // Anonymous user. Save preferences in local storage - preferenceStore().set( this.preferenceName, this.preferences ); + mw.storage.setObject( this.preferenceName, this.preferences ); callback.call( this, true ); } else { // Logged in user. Use MW APIs to change preferences new mw.Api().saveOption( - ulsPreferences.preferenceName, - JSON.stringify( ulsPreferences.preferences ) + this.preferenceName, + JSON.stringify( this.preferences ) ).done( function () { - callback.call( this, true ); + callback.call( self, true ); } ).fail( function () { - callback.call( this, false ); + callback.call( self, false ); } ); } } @@ -147,12 +98,8 @@ mw.uls = mw.uls || {}; mw.uls.preferences = function () { - var data = $( document.body ).data( 'preferences' ); - - if ( !data ) { - $( document.body ).data( 'preferences', ( data = new ULSPreferences() ) ); - } - return data; + instance = instance || new ULSPreferences(); + return instance; }; }() );