-
-
Save MichalZalecki/70a831304b0e83afbc0fbad3e8577068 to your computer and use it in GitHub Desktop.
| import storageFactory from "./storageFactory"; | |
| export const localStore = storageFactory(localStorage); | |
| export const sessionStore = storageFactory(sessionStorage); |
| /* ISC License (ISC). Copyright 2017 Michal Zalecki */ | |
| export function storageFactory(storage: Storage): Storage { | |
| let inMemoryStorage: { [key: string]: string } = {}; | |
| const length = 0; | |
| function isSupported() { | |
| try { | |
| const testKey = "__some_random_key_you_are_not_going_to_use__"; | |
| storage.setItem(testKey, testKey); | |
| storage.removeItem(testKey); | |
| return true; | |
| } catch (e) { | |
| return false; | |
| } | |
| } | |
| function clear(): void { | |
| if (isSupported()) { | |
| storage.clear(); | |
| } else { | |
| inMemoryStorage = {}; | |
| } | |
| } | |
| function getItem(name: string): string | null { | |
| if (isSupported()) { | |
| return storage.getItem(name); | |
| } | |
| if (inMemoryStorage.hasOwnProperty(name)) { | |
| return inMemoryStorage[name]; | |
| } | |
| return null; | |
| } | |
| function key(index: number): string | null { | |
| if (isSupported()) { | |
| return storage.key(index); | |
| } else { | |
| return Object.keys(inMemoryStorage)[index] || null; | |
| } | |
| } | |
| function removeItem(name: string): void { | |
| if (isSupported()) { | |
| storage.removeItem(name); | |
| } else { | |
| delete inMemoryStorage[name]; | |
| } | |
| } | |
| function setItem(name: string, value: string): void { | |
| if (isSupported()) { | |
| storage.setItem(name, value); | |
| } else { | |
| inMemoryStorage[name] = String(value); // not everyone uses TypeScript | |
| } | |
| } | |
| return { | |
| getItem, | |
| setItem, | |
| removeItem, | |
| clear, | |
| key, | |
| length, | |
| }; | |
| } |
@ZaLiTHkA Maybe, but I like function better than a "helper" variables.
@ZaLiTHkA Maybe, but I like function better than a "helper" variables.
You can make isSupported function as closure and encapsulate that "helper' variable. In this way you won't write "some_random_key_you_are_not_going_to_use" key everytime when a function is called. Localstorage is synchronous and blocks the main thread.
To be strict, it's already in a closure, just not using variables outside its own function scope. Make it yours, adjust to your needs, if you have many reads/writes act accordingly. This was never my case and I don’t want to assume that if it worked once it’s going to work for each subsequent call. I imagine how the user can change settings during his visit.
It's a library now: https://github.com/MichalZalecki/storage-factory