mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 17:23:02 +00:00
52 lines
1.3 KiB
JavaScript
52 lines
1.3 KiB
JavaScript
|
|
// https://github.com/openstreetmap/iD/issues/772
|
|
// http://mathiasbynens.be/notes/localstorage-pattern#comment-9
|
|
let _storage;
|
|
try { _storage = localStorage; } catch {} // eslint-disable-line no-empty
|
|
_storage = _storage || (() => {
|
|
let s = {};
|
|
return {
|
|
getItem: (k) => s[k],
|
|
setItem: (k, v) => s[k] = v,
|
|
removeItem: (k) => delete s[k]
|
|
};
|
|
})();
|
|
|
|
const _listeners = {};
|
|
|
|
//
|
|
// corePreferences is an interface for persisting basic key-value strings
|
|
// within and between iD sessions on the same site.
|
|
//
|
|
/**
|
|
* @param {string} k
|
|
* @param {string?} v
|
|
* @returns {boolean} true if the action succeeded
|
|
*/
|
|
function corePreferences(k, v) {
|
|
try {
|
|
if (v === undefined) return _storage.getItem(k);
|
|
else if (v === null) _storage.removeItem(k);
|
|
else _storage.setItem(k, v);
|
|
if (_listeners[k]) {
|
|
_listeners[k].forEach(handler => handler(v));
|
|
}
|
|
return true;
|
|
} catch {
|
|
/* eslint-disable no-console */
|
|
if (typeof console !== 'undefined') {
|
|
console.error('localStorage quota exceeded');
|
|
}
|
|
/* eslint-enable no-console */
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// adds an event listener which is triggered whenever
|
|
corePreferences.onChange = function(k, handler) {
|
|
_listeners[k] = _listeners[k] || [];
|
|
_listeners[k].push(handler);
|
|
};
|
|
|
|
export { corePreferences as prefs };
|