Skip to content

Commit

Permalink
add support for preferencesStorage.js for 3 voicing response levels, #…
Browse files Browse the repository at this point in the history
  • Loading branch information
zepumph committed Aug 11, 2021
1 parent 1725a8c commit 1be2c26
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
86 changes: 86 additions & 0 deletions js/preferences/PreferencesStorage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// Copyright 2021, University of Colorado Boulder

/**
* Singleton that can save and load a Property's value to localStorage, and keep it in sync for the next runtime.
* Must be used with ?preferencesStorage.
*
* NOTE: Property values are stringified, so don't try using this with something like `new StringProperty( 'true' )`
*
* author
*/

import joist from '../joist.js';

let preferencesStorage = null;

const PREFERENCES_KEY = 'PREFERENCES:';

class PreferencesStorage {

/**
* @param {Object} [options]
*/
constructor( options ) {

// @private
this.enabled = true;

// @private - for debugging
this.registedProperties = [];

try {

// Always store the line indices just in case they want to be used by the next run.
window.localStorage.setItem( 'test', 'test' );
}
catch( e ) {
this.enabled = false; // can't use localStorage with browser settings
const safari = navigator.userAgent.indexOf( 'Safari' ) !== -1 && navigator.userAgent.indexOf( 'Chrome' ) === -1;
if ( safari && e.toString().indexOf( 'QuotaExceededError' ) >= 0 ) {
console.log( 'It looks like you are browsing with private mode in Safari. ' +
'Please turn that setting off if you want to use PreferencesStorage' );
}
else {
throw e;
}
}
}

/**
* @private
* @param {Property} property
* @param {string} name
*/
registerToLocalStorage( property, name ) {
const key = `${PREFERENCES_KEY}${name}`;
if ( window.localStorage.getItem( key ) ) {
property.value = JSON.parse( window.localStorage.getItem( key ) );
}
property.lazyLink( value => {
window.localStorage.setItem( key, JSON.stringify( value ) );
} );
this.registedProperties.push( property );
}

/**
* @public
* @param {Property} property
* @param {string} name
*/
static register( property, name ) {
if ( !phet.chipper.queryParameters.preferencesStorage ) {
return;
}

if ( !preferencesStorage ) {
preferencesStorage = new PreferencesStorage();
}

if ( preferencesStorage.enabled ) {
preferencesStorage.registerToLocalStorage( property, name );
}
}
}

joist.register( 'PreferencesStorage', PreferencesStorage );
export default PreferencesStorage;
6 changes: 6 additions & 0 deletions js/preferences/VoicingPanelSection.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import joist from '../joist.js';
import joistStrings from '../joistStrings.js';
import PreferencesDialog from './PreferencesDialog.js';
import PreferencesPanelSection from './PreferencesPanelSection.js';
import PreferencesStorage from './PreferencesStorage.js';
import PreferencesToggleSwitch from './PreferencesToggleSwitch.js';

// constants
Expand Down Expand Up @@ -141,6 +142,11 @@ class VoicingPanelSection extends PreferencesPanelSection {
]
} );

// Register these to be stored when PreferencesStorage is enabled
PreferencesStorage.register( responseCollector.objectResponsesEnabledProperty, 'objectResponsesEnabledProperty' );
PreferencesStorage.register( responseCollector.contextResponsesEnabledProperty, 'contextResponsesEnabledProperty' );
PreferencesStorage.register( responseCollector.hintResponsesEnabledProperty, 'hintResponsesEnabledProperty' );

const speechOutputContent = new Node( {
children: [ speechOutputLabel, speechOutputDescription, speechOutputCheckboxes ]
} );
Expand Down

0 comments on commit 1be2c26

Please sign in to comment.