Source: userSettings.js

import { previewTypes } from './preview/model';

/**
 * @module userSettings
 */

/**
 * @interface UserSettings
 *
 * @global
 */

const PAGE_PREVIEWS_ENABLED_KEY = 'mwe-popups-enabled',
	REFERENCE_PREVIEWS_ENABLED_KEY = 'mwe-popups-referencePreviews-enabled',
	PAGE_PREVIEWS_CHANGE_SETTING_EVENT = 'Popups.SettingChange';

/**
 * Creates an object whose methods encapsulate all interactions with the UA's
 * storage.
 *
 * @param {mw.storage} storage The `mw.storage` singleton instance
 *
 * @return {UserSettings}
 */
export default function createUserSettings( storage ) {
	return {
		migrateOldPreferences() {
			const isDisabled = !!storage.get( PAGE_PREVIEWS_ENABLED_KEY );
			if ( isDisabled ) {
				storage.remove( PAGE_PREVIEWS_ENABLED_KEY );
				this.storePreviewTypeEnabled( previewTypes.TYPE_PAGE, false );
			}
			const TYPE_REFERENCE = 'reference';
			const isRefsDisabled = !!storage.get( REFERENCE_PREVIEWS_ENABLED_KEY );
			if ( isRefsDisabled ) {
				storage.remove( REFERENCE_PREVIEWS_ENABLED_KEY );
				this.storePreviewTypeEnabled( TYPE_REFERENCE, false );
			}
		},
		/**
		 * Check whether the preview type is enabled.
		 *
		 * @method
		 * @param {string} previewType
		 *
		 * @return {boolean}
		 */
		isPreviewTypeEnabled( previewType ) {
			const storageKey = `mwe-popups-${ previewType }-enabled`;
			const value = storage.get( storageKey );
			return value === null;
		},

		/**
		 * Permanently persists (typically in localStorage) whether the user has enabled
		 * the preview type.
		 *
		 * @method
		 * @name UserSettings#storePreviewTypeEnabled
		 * @param {string} previewType
		 * @param {boolean} enabled
		 */
		storePreviewTypeEnabled( previewType, enabled ) {
			const storageKey = `mwe-popups-${ previewType }-enabled`;
			if ( enabled ) {
				storage.remove( storageKey );
			} else {
				storage.set( storageKey, '0' );
			}
			/**
			 * @stable for use in MediaWiki extensions.
			 */
			mw.track( PAGE_PREVIEWS_CHANGE_SETTING_EVENT, {
				previewType,
				action: enabled ? 'anonymousEnabled' : 'anonymousDisabled'
			} );
		}
	};
}