Skip to content

Commit 46c0adb

Browse files
Yohan Robertkeegan-lillo
authored andcommitted
pebble#77 - Allow claySettings to be modified from app.js (pebble#150)
* .setSettings(key, value) to set a single setting * .setSettings(object) to set multiple settings at once
1 parent d181703 commit 46c0adb

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

index.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,39 @@ Clay.prototype.getSettings = function(response, convert) {
213213
return convert === false ? settings : Clay.prepareSettingsForAppMessage(settings);
214214
};
215215

216+
/**
217+
* Updates the settings with the given value(s).
218+
*
219+
* @signature `clay.setSettings(key, value)`
220+
* @param {String} key the property to set.
221+
* @param {String} value the value assigned to _key_.
222+
* @return {undefined}
223+
*
224+
* @signature `clay.setSettings(setting)`
225+
* @param {Object} setting an object containing the key/value pairs to be set.
226+
* @return {undefined}
227+
*/
228+
Clay.prototype.setSettings = function(key, value) {
229+
var settingsStorage = {};
230+
231+
try {
232+
settingsStorage = JSON.parse(localStorage.getItem('clay-settings')) || {};
233+
} catch (e) {
234+
console.error(e.toString());
235+
}
236+
237+
if (typeof key === 'object') {
238+
var settings = key;
239+
Object.keys(settings).forEach(function(key) {
240+
settingsStorage[key] = settings[key];
241+
});
242+
} else {
243+
settingsStorage[key] = value;
244+
}
245+
246+
localStorage.setItem('clay-settings', JSON.stringify(settingsStorage));
247+
};
248+
216249
/**
217250
* @param {string} input
218251
* @param {string} [prefix='data:text/html;charset=utf-8,']

test/spec/index.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,54 @@ describe('Clay', function() {
386386
});
387387
});
388388

389+
describe('.setSettings', function() {
390+
it('it writes to localStorage when passing an object',
391+
function() {
392+
var clay = fixture.clay([]);
393+
var settings = {
394+
key1: 'value1',
395+
key2: 'value2'
396+
};
397+
var expected = {
398+
key1: 'value1',
399+
key2: 'value2'
400+
};
401+
402+
clay.setSettings(settings);
403+
assert.equal(
404+
localStorage.getItem('clay-settings'),
405+
JSON.stringify(expected)
406+
);
407+
});
408+
409+
it('it writes to localStorage when passing a key and a value',
410+
function() {
411+
var clay = fixture.clay([]);
412+
var expected = {
413+
key1: 'value1',
414+
key2: 'value2%7Dbreaks'
415+
};
416+
417+
clay.setSettings('key1', 'value1');
418+
clay.setSettings('key2', 'value2%7Dbreaks');
419+
assert.equal(localStorage.getItem('clay-settings'),
420+
JSON.stringify(expected)
421+
);
422+
});
423+
424+
it('doesn\'t throw and logs an error if settings in localStorage are broken',
425+
function() {
426+
var clay = fixture.clay([]);
427+
var errorStub = sinon.stub(console, 'error');
428+
localStorage.setItem('clay-settings', 'not valid JSON');
429+
assert.doesNotThrow(function() {
430+
clay.setSettings('key', 'value');
431+
});
432+
assert(errorStub.calledWithMatch(/SyntaxError/i));
433+
errorStub.restore();
434+
});
435+
});
436+
389437
describe('.meta', function() {
390438
var emptyMeta = {
391439
activeWatchInfo: null,

0 commit comments

Comments
 (0)