From 46c0adb62cfee710cb9cf2ce6c01bf8a162f97ad Mon Sep 17 00:00:00 2001 From: Yohan Robert Date: Fri, 21 Oct 2016 19:36:55 +0200 Subject: [PATCH] #77 - Allow claySettings to be modified from app.js (#150) * .setSettings(key, value) to set a single setting * .setSettings(object) to set multiple settings at once --- index.js | 33 +++++++++++++++++++++++++++++++ test/spec/index.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/index.js b/index.js index ef633e5..d02f6d7 100755 --- a/index.js +++ b/index.js @@ -213,6 +213,39 @@ Clay.prototype.getSettings = function(response, convert) { return convert === false ? settings : Clay.prepareSettingsForAppMessage(settings); }; +/** + * Updates the settings with the given value(s). + * + * @signature `clay.setSettings(key, value)` + * @param {String} key the property to set. + * @param {String} value the value assigned to _key_. + * @return {undefined} + * + * @signature `clay.setSettings(setting)` + * @param {Object} setting an object containing the key/value pairs to be set. + * @return {undefined} + */ +Clay.prototype.setSettings = function(key, value) { + var settingsStorage = {}; + + try { + settingsStorage = JSON.parse(localStorage.getItem('clay-settings')) || {}; + } catch (e) { + console.error(e.toString()); + } + + if (typeof key === 'object') { + var settings = key; + Object.keys(settings).forEach(function(key) { + settingsStorage[key] = settings[key]; + }); + } else { + settingsStorage[key] = value; + } + + localStorage.setItem('clay-settings', JSON.stringify(settingsStorage)); +}; + /** * @param {string} input * @param {string} [prefix='data:text/html;charset=utf-8,'] diff --git a/test/spec/index.js b/test/spec/index.js index b2b22c6..0088eb9 100644 --- a/test/spec/index.js +++ b/test/spec/index.js @@ -386,6 +386,54 @@ describe('Clay', function() { }); }); + describe('.setSettings', function() { + it('it writes to localStorage when passing an object', + function() { + var clay = fixture.clay([]); + var settings = { + key1: 'value1', + key2: 'value2' + }; + var expected = { + key1: 'value1', + key2: 'value2' + }; + + clay.setSettings(settings); + assert.equal( + localStorage.getItem('clay-settings'), + JSON.stringify(expected) + ); + }); + + it('it writes to localStorage when passing a key and a value', + function() { + var clay = fixture.clay([]); + var expected = { + key1: 'value1', + key2: 'value2%7Dbreaks' + }; + + clay.setSettings('key1', 'value1'); + clay.setSettings('key2', 'value2%7Dbreaks'); + assert.equal(localStorage.getItem('clay-settings'), + JSON.stringify(expected) + ); + }); + + it('doesn\'t throw and logs an error if settings in localStorage are broken', + function() { + var clay = fixture.clay([]); + var errorStub = sinon.stub(console, 'error'); + localStorage.setItem('clay-settings', 'not valid JSON'); + assert.doesNotThrow(function() { + clay.setSettings('key', 'value'); + }); + assert(errorStub.calledWithMatch(/SyntaxError/i)); + errorStub.restore(); + }); + }); + describe('.meta', function() { var emptyMeta = { activeWatchInfo: null,