Skip to content

Commit 8a4af61

Browse files
authored
Apply usecCallback hook (#30)
1 parent 04faef7 commit 8a4af61

File tree

4 files changed

+185
-101
lines changed

4 files changed

+185
-101
lines changed

src/createDatabaseTransaction.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {
2+
createTransaction as defaultCreateTransaction,
3+
optionsGenerator as defaultOptionsBuilder,
4+
} from './Utils';
5+
import { DBMode } from './indexed-db';
6+
7+
export function createDatabaseTransaction(
8+
database: IDBDatabase,
9+
mode: DBMode,
10+
storeName: string,
11+
resolve: Function,
12+
reject: Function,
13+
createTransaction: typeof defaultCreateTransaction = defaultCreateTransaction,
14+
buildOptions: typeof defaultOptionsBuilder = defaultOptionsBuilder,
15+
) {
16+
const options = buildOptions(mode, storeName, reject, resolve);
17+
const transaction: IDBTransaction = createTransaction(database, options);
18+
const store = transaction.objectStore(storeName);
19+
20+
return {
21+
store,
22+
transaction,
23+
};
24+
};

src/createReadonlyTransaction.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { DBMode } from './indexed-db';
2+
import { createDatabaseTransaction } from './createDatabaseTransaction';
3+
4+
5+
export function createReadonlyTransaction(
6+
database: IDBDatabase,
7+
store: string,
8+
resolve: Function,
9+
reject: Function
10+
) {
11+
return createDatabaseTransaction(
12+
database,
13+
DBMode.readonly,
14+
store,
15+
resolve,
16+
reject
17+
);
18+
};

src/createReadwriteTransaction.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { DBMode } from './indexed-db';
2+
import { createDatabaseTransaction } from './createDatabaseTransaction';
3+
4+
export function createReadwriteTransaction(
5+
database: IDBDatabase,
6+
store: string,
7+
resolve: Function,
8+
reject: Function
9+
) {
10+
return createDatabaseTransaction(
11+
database,
12+
DBMode.readwrite,
13+
store,
14+
resolve,
15+
reject
16+
);
17+
};

src/indexed-db.ts

Lines changed: 126 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import { validateBeforeTransaction, createTransaction, optionsGenerator } from './Utils';
1+
import { useCallback } from 'react';
2+
import { validateBeforeTransaction } from './Utils';
23
import { ObjectStoreMeta, ObjectStoreSchema } from './indexed-hooks';
4+
import { createReadwriteTransaction } from './createReadwriteTransaction';
5+
import { createReadonlyTransaction } from './createReadonlyTransaction';
36

47
export type Key = string | number | Date | ArrayBufferView | ArrayBuffer | IDBArrayKey | IDBKeyRange;
58
export interface IndexDetails {
@@ -49,100 +52,46 @@ export function CreateObjectStore(dbName: string, version: number, storeSchemas:
4952
}
5053

5154
export function DBOperations(dbName: string, version: number, currentStore: string) {
52-
return {
53-
add<T>(value: T, key?: any) {
54-
return new Promise<number>((resolve, reject) => {
55-
openDatabase(dbName, version).then((db: IDBDatabase) => {
56-
let transaction = createTransaction(db, optionsGenerator(DBMode.readwrite, currentStore, reject, resolve)),
57-
objectStore = transaction.objectStore(currentStore);
58-
let request = objectStore.add(value, key);
59-
request.onsuccess = (evt: any) => {
60-
key = evt.target.result;
61-
resolve(key);
62-
};
63-
});
64-
});
65-
},
66-
getByID<T>(id: string | number) {
67-
return new Promise<T>((resolve, reject) => {
68-
openDatabase(dbName, version).then((db: IDBDatabase) => {
69-
validateBeforeTransaction(db, currentStore, reject);
70-
let transaction = createTransaction(db, optionsGenerator(DBMode.readonly, currentStore, reject, resolve)),
71-
objectStore = transaction.objectStore(currentStore),
72-
request: IDBRequest;
73-
request = objectStore.get(+id);
74-
request.onsuccess = function(event: Event) {
75-
resolve((event.target as any).result as T);
76-
};
77-
});
78-
});
79-
},
80-
getAll<T>() {
81-
return new Promise<T[]>((resolve, reject) => {
82-
openDatabase(dbName, version).then(db => {
83-
validateBeforeTransaction(db, currentStore, reject);
84-
let transaction = createTransaction(db, optionsGenerator(DBMode.readonly, currentStore, reject, resolve)),
85-
objectStore = transaction.objectStore(currentStore),
86-
result: Array<any> = [];
55+
// Readonly operations
56+
const getAll = useCallback(
57+
<T>() => new Promise<T[]>((resolve, reject) => {
58+
openDatabase(dbName, version).then(db => {
59+
validateBeforeTransaction(db, currentStore, reject);
60+
const { store } = createReadonlyTransaction(db, currentStore, resolve, reject);
61+
const request = store.getAll();
8762

88-
const request: IDBRequest = objectStore.getAll();
63+
request.onerror = error => reject(error);
8964

90-
request.onerror = function(e) {
91-
reject(e);
92-
};
93-
94-
request.onsuccess = function({ target: { result } }: any) {
95-
resolve(result as T[]);
96-
};
97-
});
65+
request.onsuccess = function({ target: { result } }: any) {
66+
resolve(result as T[]);
67+
};
9868
});
99-
},
100-
update<T>(value: T, key?: any) {
101-
return new Promise<any>((resolve, reject) => {
102-
openDatabase(dbName, version).then(db => {
103-
validateBeforeTransaction(db, currentStore, reject);
104-
let transaction = createTransaction(db, optionsGenerator(DBMode.readwrite, currentStore, reject, resolve)),
105-
objectStore = transaction.objectStore(currentStore);
106-
transaction.oncomplete = event => {
107-
resolve(event);
108-
};
109-
objectStore.put(value, key);
110-
});
111-
});
112-
},
113-
deleteRecord(key: Key) {
114-
return new Promise<any>((resolve, reject) => {
115-
openDatabase(dbName, version).then(db => {
116-
validateBeforeTransaction(db, currentStore, reject);
117-
let transaction = createTransaction(db, optionsGenerator(DBMode.readwrite, currentStore, reject, resolve)),
118-
objectStore = transaction.objectStore(currentStore);
119-
let request = objectStore.delete(key);
120-
request.onsuccess = event => {
121-
resolve(event);
122-
};
123-
});
124-
});
125-
},
126-
clear() {
127-
return new Promise<any>((resolve, reject) => {
128-
openDatabase(dbName, version).then(db => {
129-
validateBeforeTransaction(db, currentStore, reject);
130-
let transaction = createTransaction(db, optionsGenerator(DBMode.readwrite, currentStore, reject, resolve)),
131-
objectStore = transaction.objectStore(currentStore);
132-
objectStore.clear();
133-
transaction.oncomplete = event => {
134-
resolve();
135-
};
136-
});
69+
}),
70+
[dbName, version, currentStore]
71+
);
72+
73+
const getByID = useCallback(
74+
<T>(id: string | number) => new Promise<T>((resolve, reject) => {
75+
openDatabase(dbName, version).then((db: IDBDatabase) => {
76+
validateBeforeTransaction(db, currentStore, reject);
77+
const { store } = createReadonlyTransaction(db, currentStore, resolve, reject);
78+
const request = store.get(+id);
79+
80+
request.onsuccess = function(event: Event) {
81+
resolve((event.target as any).result as T);
82+
};
13783
});
138-
},
139-
openCursor(cursorCallback: (event: Event) => void, keyRange?: IDBKeyRange) {
84+
}),
85+
[dbName, version, currentStore],
86+
);
87+
88+
const openCursor = useCallback(
89+
(cursorCallback: (event: Event) => void, keyRange?: IDBKeyRange) => {
14090
return new Promise<void>((resolve, reject) => {
14191
openDatabase(dbName, version).then(db => {
14292
validateBeforeTransaction(db, currentStore, reject);
143-
let transaction = createTransaction(db, optionsGenerator(DBMode.readonly, currentStore, reject, resolve)),
144-
objectStore = transaction.objectStore(currentStore),
145-
request = objectStore.openCursor(keyRange);
93+
const { store } = createReadonlyTransaction(db, currentStore, resolve, reject);
94+
const request = store.openCursor(keyRange);
14695

14796
request.onsuccess = (event: Event) => {
14897
cursorCallback(event);
@@ -151,20 +100,96 @@ export function DBOperations(dbName: string, version: number, currentStore: stri
151100
});
152101
});
153102
},
154-
getByIndex(indexName: string, key: any) {
155-
return new Promise<any>((resolve, reject) => {
156-
openDatabase(dbName, version).then(db => {
157-
validateBeforeTransaction(db, currentStore, reject);
158-
let transaction = createTransaction(db, optionsGenerator(DBMode.readonly, currentStore, reject, resolve)),
159-
objectStore = transaction.objectStore(currentStore),
160-
index = objectStore.index(indexName),
161-
request = index.get(key);
162-
request.onsuccess = (event: Event) => {
163-
resolve((<IDBOpenDBRequest>event.target).result);
164-
};
165-
});
103+
[dbName, version, currentStore],
104+
);
105+
106+
const getByIndex = useCallback(
107+
(indexName: string, key: any) => new Promise<any>((resolve, reject) => {
108+
openDatabase(dbName, version).then(db => {
109+
validateBeforeTransaction(db, currentStore, reject);
110+
const { store } = createReadonlyTransaction(db, currentStore, resolve, reject);
111+
const index = store.index(indexName);
112+
const request = index.get(key);
113+
114+
request.onsuccess = (event: Event) => {
115+
resolve((<IDBOpenDBRequest>event.target).result);
116+
};
166117
});
167-
}
118+
}),
119+
[dbName, version, currentStore],
120+
);
121+
122+
// Readwrite operations
123+
const add = useCallback(
124+
<T>(value: T, key?: any) => new Promise<number>((resolve, reject) => {
125+
openDatabase(dbName, version).then((db: IDBDatabase) => {
126+
const { store } = createReadwriteTransaction(db, currentStore, resolve, reject);
127+
const request = store.add(value, key);
128+
129+
request.onsuccess = (evt: any) => {
130+
key = evt.target.result;
131+
resolve(key);
132+
};
133+
134+
request.onerror = error => reject(error);
135+
});
136+
}),
137+
[dbName, version, currentStore],
138+
);
139+
140+
const update = useCallback(
141+
<T>(value: T, key?: any) => new Promise<any>((resolve, reject) => {
142+
openDatabase(dbName, version).then(db => {
143+
validateBeforeTransaction(db, currentStore, reject);
144+
const {
145+
transaction,
146+
store,
147+
} = createReadwriteTransaction(db, currentStore, resolve, reject);
148+
149+
transaction.oncomplete = event => resolve(event);
150+
151+
store.put(value, key);
152+
});
153+
}),
154+
[dbName, version, currentStore],
155+
);
156+
157+
const deleteRecord = useCallback(
158+
(key: Key) => new Promise<any>((resolve, reject) => {
159+
openDatabase(dbName, version).then(db => {
160+
validateBeforeTransaction(db, currentStore, reject);
161+
const { store } = createReadwriteTransaction(db, currentStore, resolve, reject);
162+
const request = store.delete(key);
163+
164+
request.onsuccess = event => resolve(event);
165+
});
166+
}),
167+
[dbName, version, currentStore],
168+
);
169+
170+
const clear = useCallback(
171+
() => new Promise<any>((resolve, reject) => {
172+
openDatabase(dbName, version).then(db => {
173+
validateBeforeTransaction(db, currentStore, reject);
174+
const { store, transaction } = createReadwriteTransaction(db, currentStore, resolve, reject);
175+
176+
transaction.oncomplete = () => resolve();
177+
178+
store.clear();
179+
});
180+
}),
181+
[dbName, version, currentStore],
182+
);
183+
184+
return {
185+
add,
186+
getByID,
187+
getAll,
188+
update,
189+
deleteRecord,
190+
clear,
191+
openCursor,
192+
getByIndex,
168193
};
169194
}
170195

0 commit comments

Comments
 (0)