aboutsummaryrefslogtreecommitdiffstats
path: root/src/services
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-10-26 19:07:31 +0200
committerArmand Philippot <git@armandphilippot.com>2023-11-11 18:15:27 +0100
commit795b92cc1a168c48c7710ca6e0e1ef5974013d95 (patch)
tree8f57204b0ffe7c8acb3203a24292f375377b6369 /src/services
parent9aeb82269d7c74c4566b7ca254782a4dfbd69a6e (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.ts27
-rw-r--r--src/services/local-storage/local-storage.test.ts92
-rw-r--r--src/services/local-storage/local-storage.ts26
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();
+ },
+};