diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-10-26 19:07:31 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-11 18:15:27 +0100 |
| commit | 795b92cc1a168c48c7710ca6e0e1ef5974013d95 (patch) | |
| tree | 8f57204b0ffe7c8acb3203a24292f375377b6369 /src/services | |
| parent | 9aeb82269d7c74c4566b7ca254782a4dfbd69a6e (diff) | |
refactor(hooks): rewrite useLocalStorage hook
* return a tuple instead of an object
* add a validator function as parameter (if the stored value
is manually changed, it is not safe to cast its type)
* add tests
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/local-storage/index.ts | 27 | ||||
| -rw-r--r-- | src/services/local-storage/local-storage.test.ts | 92 | ||||
| -rw-r--r-- | src/services/local-storage/local-storage.ts | 26 |
3 files changed, 119 insertions, 26 deletions
diff --git a/src/services/local-storage/index.ts b/src/services/local-storage/index.ts index 65235a7..72dd18f 100644 --- a/src/services/local-storage/index.ts +++ b/src/services/local-storage/index.ts @@ -1,26 +1 @@ -export const LocalStorage = { - get<T>(key: string): T | undefined { - try { - const serialItem = localStorage.getItem(key); - if (!serialItem) return undefined; - return JSON.parse(serialItem) as T; - } catch (e) { - console.log(e); - return undefined; - } - }, - set<T>(key: string, value: T) { - try { - const serialItem = JSON.stringify(value); - localStorage.setItem(key, serialItem); - } catch (e) { - console.log(e); - } - }, - remove(key: string) { - localStorage.removeItem(key); - }, - clear() { - localStorage.clear(); - }, -}; +export * from './local-storage'; diff --git a/src/services/local-storage/local-storage.test.ts b/src/services/local-storage/local-storage.test.ts new file mode 100644 index 0000000..df3c646 --- /dev/null +++ b/src/services/local-storage/local-storage.test.ts @@ -0,0 +1,92 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { LocalStorage } from './local-storage'; + +describe('LocalStorage', () => { + it('should return an undefined value when the key is not set', () => { + localStorage.clear(); + + expect(LocalStorage.get('et')).toBeUndefined(); + }); + + it('can set a new key and return its value', () => { + localStorage.clear(); + + const key = 'laudantium'; + const value = 'laborum'; + + LocalStorage.set(key, value); + + expect(LocalStorage.get(key)).toBe(value); + }); + + it('can update an existing key', () => { + localStorage.clear(); + + const key = 'officiis'; + const value = 'saepe'; + + LocalStorage.set(key, value); + + const newValue = 'itaque'; + + LocalStorage.set(key, newValue); + + expect(LocalStorage.get(key)).toBe(newValue); + }); + + it('can remove a key from the storage', () => { + localStorage.clear(); + + const key1 = 'ab'; + const value1 = 'ipsum'; + const key2 = 'suscipit'; + const value2 = 'autem'; + + LocalStorage.set(key1, value1); + LocalStorage.set(key2, value2); + LocalStorage.remove(key1); + + expect(LocalStorage.get(key1)).toBeUndefined(); + expect(LocalStorage.get(key2)).toBe(value2); + }); + + it('can clear the storage', () => { + localStorage.clear(); + + const key1 = 'velit'; + const value1 = 'rerum'; + const key2 = 'enim'; + const value2 = 'consequatur'; + + LocalStorage.set(key1, value1); + LocalStorage.set(key2, value2); + LocalStorage.clear(); + + expect(LocalStorage.get(key1)).toBeUndefined(); + expect(LocalStorage.get(key2)).toBeUndefined(); + }); + + it('return undefined and log and error when the value is invalid', () => { + const spy = jest.spyOn(console, 'error'); + const key = 'dolor'; + const value = 'possimus'; + + // The value is not stringified + localStorage.setItem(key, value); + + expect(LocalStorage.get(key)).toBeUndefined(); + expect(spy).toHaveBeenCalled(); + }); + + it('does not set invalid value and log the error', () => { + const spy = jest.spyOn(console, 'error'); + const key = 'voluptatibus'; + // eslint-disable-next-line @typescript-eslint/no-magic-numbers + const value = BigInt(1234567890); + + LocalStorage.set(key, value); + + expect(LocalStorage.get(key)).toBeUndefined(); + expect(spy).toHaveBeenCalled(); + }); +}); diff --git a/src/services/local-storage/local-storage.ts b/src/services/local-storage/local-storage.ts new file mode 100644 index 0000000..e9a50a5 --- /dev/null +++ b/src/services/local-storage/local-storage.ts @@ -0,0 +1,26 @@ +export const LocalStorage = { + get<T>(key: string): T | undefined { + try { + const serialItem = localStorage.getItem(key); + if (!serialItem) return undefined; + return JSON.parse(serialItem) as T; + } catch (e) { + console.error(e); + return undefined; + } + }, + set<T>(key: string, value: T) { + try { + const serialItem = JSON.stringify(value); + localStorage.setItem(key, serialItem); + } catch (e) { + console.error(e); + } + }, + remove(key: string) { + localStorage.removeItem(key); + }, + clear() { + localStorage.clear(); + }, +}; |
