Skip to content

Commit 607eb58

Browse files
committed
refactor(with-storage-sync): integrate with-indexeddb into with-storage-sync(wip)
1 parent 9b624f9 commit 607eb58

File tree

8 files changed

+441
-538
lines changed

8 files changed

+441
-538
lines changed

apps/demo/src/app/todo-storage-sync/synced-todo-store.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,17 @@ import {
66
updateEntity,
77
} from '@ngrx/signals/entities';
88
import { AddTodo, Todo } from '../devtools/todo-store';
9-
import {
10-
withIndexedDB,
11-
withStorageSync,
12-
} from '@angular-architects/ngrx-toolkit';
9+
import { withStorageSync } from '@angular-architects/ngrx-toolkit';
1310

1411
export const SyncedTodoStore = signalStore(
1512
{ providedIn: 'root' },
1613
withEntities<Todo>(),
17-
withStorageSync(
18-
{
19-
dbName: 'ngrx-toolkit',
20-
storeName: 'todos',
21-
},
22-
withIndexedDB()
23-
),
14+
withStorageSync({
15+
key: 'todos',
16+
storage: 'indexedDB',
17+
dbName: 'ngrx-toolkit',
18+
storeName: 'todos',
19+
}),
2420
withMethods((store) => {
2521
let currentId = 0;
2622
return {

libs/ngrx-toolkit/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,3 @@ export {
2323
withStorageSync,
2424
SyncConfig,
2525
} from './lib/storageSync/with-storage-sync';
26-
export { withIndexedDB } from './lib/storageSync/with-indexeddb';

libs/ngrx-toolkit/src/lib/storageSync/internal/indexeddb.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export class IndexedDBService {
8484
return new Promise((resolve, reject) => {
8585
request.onsuccess = (): void => {
8686
db.close();
87-
resolve(request.result);
87+
resolve(request.result?.['value']);
8888
};
8989

9090
request.onerror = (): void => {
Lines changed: 68 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { inject, Injectable } from '@angular/core';
22
import { IndexedDBService } from './indexeddb.service';
33

4-
export type StorageType = 'localStorage' | 'sessionStorage';
5-
6-
export type StorageOptions = {
7-
dbName: string;
8-
storeName: string;
4+
export type IndexedDBConfig = {
5+
storage: 'localStorage' | 'sessionStorage' | 'indexedDB';
6+
key?: string;
7+
dbName?: string;
8+
storeName?: string;
99
};
1010

1111
@Injectable({
@@ -14,50 +14,84 @@ export type StorageOptions = {
1414
export class StorageService {
1515
private readonly indexedDB = inject(IndexedDBService);
1616

17+
private storage: Storage | null = null;
18+
19+
setStorage(storage: Storage): void {
20+
this.storage = storage;
21+
}
22+
1723
// get item from storage(localStorage, sessionStorage, indexedDB)
18-
async getItem(type: StorageType): Promise<string | null>;
19-
async getItem(options: StorageOptions): Promise<string | null>;
24+
async getItem(config: IndexedDBConfig): Promise<string | null>;
25+
26+
async getItem(config: IndexedDBConfig): Promise<string | null> {
27+
if (config.storage === 'indexedDB') {
28+
const { dbName, storeName } = config;
2029

21-
async getItem(
22-
configOrKey: StorageOptions | StorageType
23-
): Promise<string | null> {
24-
if (typeof configOrKey === 'string') {
25-
return window[configOrKey].getItem(configOrKey);
30+
if (dbName === undefined || storeName === undefined) {
31+
throw new Error('dbName and storeName must be set');
32+
}
33+
34+
return await this.indexedDB.read(dbName, storeName);
2635
}
2736

28-
const { dbName, storeName } = configOrKey;
37+
if (this.storage === null) {
38+
throw new Error('Storage not set');
39+
}
2940

30-
return await this.indexedDB.read(dbName, storeName);
41+
if (config.key === undefined) {
42+
throw new Error('key is undefined');
43+
}
44+
45+
return this.storage.getItem(config.key);
3146
}
3247

3348
// set item in storage(localStorage, sessionStorage, indexedDB)
34-
async setItem(type: StorageType, value: string): Promise<void>;
35-
async setItem(options: StorageOptions, value: string): Promise<void>;
49+
async setItem(config: IndexedDBConfig, value: string): Promise<void>;
50+
51+
async setItem(config: IndexedDBConfig, value: string): Promise<void> {
52+
if (config.storage === 'indexedDB') {
53+
const { dbName, storeName } = config;
3654

37-
async setItem(
38-
configOrKey: StorageOptions | StorageType,
39-
value: string
40-
): Promise<void> {
41-
if (typeof configOrKey === 'string') {
42-
window[configOrKey].setItem(configOrKey, value);
43-
return;
55+
if (dbName === undefined || storeName === undefined) {
56+
throw new Error('dbName and storeName must be set');
57+
}
58+
59+
return await this.indexedDB.write(dbName, storeName, value);
60+
}
61+
62+
if (this.storage === null) {
63+
throw new Error('Storage not set');
64+
}
65+
66+
if (config.key === undefined) {
67+
throw new Error('key is undefined');
4468
}
4569

46-
const { dbName, storeName } = configOrKey;
47-
await this.indexedDB.write(dbName, storeName, value);
70+
return this.storage.setItem(config.key, value);
4871
}
72+
//
73+
// // remove item from storage(localStorage, sessionStorage, indexedDB)
74+
async removeItem(config: IndexedDBConfig): Promise<void>;
4975

50-
// remove item from storage(localStorage, sessionStorage, indexedDB)
51-
async removeItem(type: StorageType): Promise<void>;
52-
async removeItem(options: StorageOptions): Promise<void>;
76+
async removeItem(config: IndexedDBConfig): Promise<void> {
77+
if (config.storage === 'indexedDB') {
78+
const { dbName, storeName } = config;
79+
80+
if (dbName === undefined || storeName === undefined) {
81+
throw new Error('dbName and storeName must be set');
82+
}
83+
84+
return await this.indexedDB.clear(dbName, storeName);
85+
}
86+
87+
if (this.storage === null) {
88+
throw new Error('Storage not set');
89+
}
5390

54-
async removeItem(configOrKey: StorageOptions | StorageType): Promise<void> {
55-
if (typeof configOrKey === 'string') {
56-
window[configOrKey].removeItem(configOrKey);
57-
return;
91+
if (config.key === undefined) {
92+
throw new Error('key is undefined');
5893
}
5994

60-
const { dbName, storeName } = configOrKey;
61-
return await this.indexedDB.clear(dbName, storeName);
95+
return this.storage.removeItem(config.key);
6296
}
6397
}

libs/ngrx-toolkit/src/lib/storageSync/tests/indexeddb.service.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('IndexedDBService', () => {
2626

2727
const receivedData = await indexedDBService.read(dbName, storeName);
2828

29-
expect(receivedData).toEqual(expectedData);
29+
expect(receivedData).toEqual(expectedData.value);
3030
});
3131

3232
it('It should be possible to delete data using clear()', async (): Promise<void> => {
@@ -50,7 +50,7 @@ describe('IndexedDBService', () => {
5050

5151
const receivedData = await indexedDBService.read(dbName, storeName);
5252

53-
expect(receivedData).toEqual({ [keyPath]: keyPath, value: null });
53+
expect(receivedData).toBeNull();
5454
});
5555

5656
it('write() should handle empty object data', async (): Promise<void> => {
@@ -61,7 +61,7 @@ describe('IndexedDBService', () => {
6161

6262
const receivedData = await indexedDBService.read(dbName, storeName);
6363

64-
expect(receivedData).toEqual(expectedData);
64+
expect(receivedData).toEqual(expectedData.value);
6565
});
6666

6767
it('write() should handle large data objects', async (): Promise<void> => {
@@ -72,7 +72,7 @@ describe('IndexedDBService', () => {
7272

7373
const receivedData = await indexedDBService.read(dbName, storeName);
7474

75-
expect(receivedData).toEqual(expectedData);
75+
expect(receivedData).toEqual(expectedData.value);
7676
});
7777

7878
it('write() should handle special characters in data', async (): Promise<void> => {
@@ -83,6 +83,6 @@ describe('IndexedDBService', () => {
8383

8484
const receivedData = await indexedDBService.read(dbName, storeName);
8585

86-
expect(receivedData).toEqual(expectedData);
86+
expect(receivedData).toEqual(expectedData.value);
8787
});
8888
});

0 commit comments

Comments
 (0)