/** * localStorage can throw browser exceptions, for example if it is full We don't * use localStorage for anything critical, so in that case just fail gracefully. */ /** * Catch, log and otherwise ignore errors. * * @param {function} fn localStorage function to call * @param {string?} key Key passed to the localStorage function (if any) * @param {any?} value Value passed to the localStorage function (if any) */ const callSafe = function (fn, key, value) { try { return fn(key, value) } catch (e) { console.error('localStorage exception', e) return null } } const getItem = function (key) { return JSON.parse(localStorage.getItem(key)) } const setItem = function (key, value) { localStorage.setItem(key, JSON.stringify(value)) } const clear = function () { localStorage.clear() } const removeItem = function (key) { return localStorage.removeItem(key) } const customLocalStorage = { getItem: key => callSafe(getItem, key), setItem: (key, value) => callSafe(setItem, key, value), clear: () => callSafe(clear), removeItem: key => callSafe(removeItem, key), } export default customLocalStorage