UNPKG

safe-localstorage

Version:

localStorage wrapper that fails gracefully when it's not available, like in Safari private mode

45 lines (40 loc) 1.3 kB
const localStorageAvailable = () => { const inWindow = typeof window.localStorage === 'object' && typeof window.localStorage.setItem === 'function'; if (!inWindow) { return false; } // Safari private mode has localStorage in the window, but throws when `setItem` is called const key = 'safeLocalStorageTest'; try { window.localStorage.setItem(key, 'succeeds'); window.localStorage.removeItem(key); return true; } catch (e) { return false; } }; const noop = () => {}; const useStorageWhenAvailable = (nativeMethod, args, callback = noop) => { if (localStorageAvailable()) { return window.localStorage[nativeMethod](...args); } else { callback(); } }; const safeLocalStorage = { get: (key, onLocalStorageNotAvailable) => { return useStorageWhenAvailable('getItem', [key], onLocalStorageNotAvailable); }, set: (key, value, onLocalStorageNotAvailable) => { useStorageWhenAvailable('setItem', [key, value], onLocalStorageNotAvailable); }, remove: (key, onLocalStorageNotAvailable) => { useStorageWhenAvailable('removeItem', [key], onLocalStorageNotAvailable); }, removeAll: (onLocalStorageNotAvailable) => { useStorageWhenAvailable('clear', [], onLocalStorageNotAvailable); }, }; export default safeLocalStorage;