Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit06d0c69

Browse files
committed
refactor: Clean up whitespace and improve error handling in useSuspenseIndexedDBState hook
- Removed unnecessary whitespace in the `useSuspenseIndexedDBState` implementation for better readability.- Enhanced error handling in the `broadcastChange` function to log specific errors when the BroadcastChannel is closed.
1 parent0ba5ac3 commit06d0c69

File tree

2 files changed

+55
-41
lines changed

2 files changed

+55
-41
lines changed

‎.changeset/fair-parents-smash.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"rooks":patch
3+
---
4+
5+
add useSuspenseIndexedDBState hook

‎packages/rooks/src/hooks/useSuspenseIndexedDBState.ts‎

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ function openDatabase(dbName: string, version: number, storeName: string): Promi
5555
}
5656

5757
constrequest=indexedDB.open(dbName,version);
58-
58+
5959
request.onerror=()=>{
6060
reject(newError(`Failed to open database "${dbName}":${request.error?.message}`));
6161
};
62-
62+
6363
request.onsuccess=()=>{
6464
resolve(request.result);
6565
};
66-
66+
6767
request.onupgradeneeded=()=>{
6868
constdb=request.result;
6969
if(!db.objectStoreNames.contains(storeName)){
@@ -82,27 +82,27 @@ function openDatabase(dbName: string, version: number, storeName: string): Promi
8282
*@returns Promise that resolves to the value or null if not found
8383
*/
8484
asyncfunctiongetValueFromIndexedDB<T>(
85-
dbName:string,
86-
storeName:string,
87-
key:string,
85+
dbName:string,
86+
storeName:string,
87+
key:string,
8888
version:number
8989
):Promise<T|null>{
9090
try{
9191
constdb=awaitopenDatabase(dbName,version,storeName);
92-
92+
9393
returnnewPromise((resolve,reject)=>{
9494
consttransaction=db.transaction([storeName],'readonly');
9595
conststore=transaction.objectStore(storeName);
9696
constrequest=store.get(key);
97-
97+
9898
request.onerror=()=>{
9999
reject(newError(`Failed to get value for key "${key}":${request.error?.message}`));
100100
};
101-
101+
102102
request.onsuccess=()=>{
103103
resolve(request.result??null);
104104
};
105-
105+
106106
transaction.oncomplete=()=>{
107107
db.close();
108108
};
@@ -122,28 +122,28 @@ async function getValueFromIndexedDB<T>(
122122
*@param version - The database version
123123
*/
124124
asyncfunctionsaveValueToIndexedDB<T>(
125-
dbName:string,
126-
storeName:string,
127-
key:string,
128-
value:T,
125+
dbName:string,
126+
storeName:string,
127+
key:string,
128+
value:T,
129129
version:number
130130
):Promise<void>{
131131
try{
132132
constdb=awaitopenDatabase(dbName,version,storeName);
133-
133+
134134
returnnewPromise((resolve,reject)=>{
135135
consttransaction=db.transaction([storeName],'readwrite');
136136
conststore=transaction.objectStore(storeName);
137137
constrequest=store.put(value,key);
138-
138+
139139
request.onerror=()=>{
140140
reject(newError(`Failed to save value for key "${key}":${request.error?.message}`));
141141
};
142-
142+
143143
request.onsuccess=()=>{
144144
resolve();
145145
};
146-
146+
147147
transaction.oncomplete=()=>{
148148
db.close();
149149
};
@@ -162,27 +162,27 @@ async function saveValueToIndexedDB<T>(
162162
*@param version - The database version
163163
*/
164164
asyncfunctionremoveValueFromIndexedDB(
165-
dbName:string,
166-
storeName:string,
167-
key:string,
165+
dbName:string,
166+
storeName:string,
167+
key:string,
168168
version:number
169169
):Promise<void>{
170170
try{
171171
constdb=awaitopenDatabase(dbName,version,storeName);
172-
172+
173173
returnnewPromise((resolve,reject)=>{
174174
consttransaction=db.transaction([storeName],'readwrite');
175175
conststore=transaction.objectStore(storeName);
176176
constrequest=store.delete(key);
177-
177+
178178
request.onerror=()=>{
179179
reject(newError(`Failed to remove value for key "${key}":${request.error?.message}`));
180180
};
181-
181+
182182
request.onsuccess=()=>{
183183
resolve();
184184
};
185-
185+
186186
transaction.oncomplete=()=>{
187187
db.close();
188188
};
@@ -234,13 +234,13 @@ interface UseSuspenseIndexedDBStateControls<T> {
234234
*@returns The current state value
235235
*/
236236
getItem:()=>T;
237-
237+
238238
/**
239239
* Set a new value in IndexedDB and update state
240240
*@param value - The new value to set
241241
*/
242242
setItem:(value:T)=>Promise<void>;
243-
243+
244244
/**
245245
* Delete the item from IndexedDB and reset to initial value
246246
*/
@@ -275,13 +275,13 @@ interface IndexedDBConfig {
275275
*@default "rooks-db"
276276
*/
277277
dbName?:string;
278-
278+
279279
/**
280280
* The object store name within the database
281281
*@default "state"
282282
*/
283283
storeName?:string;
284-
284+
285285
/**
286286
* The database version
287287
*@default 1
@@ -345,7 +345,7 @@ function useSuspenseIndexedDBState<T>(
345345

346346
// Create a unique cache key combining database info and key
347347
constcacheKey=`${dbName}:${storeName}:${key}:${version}`;
348-
348+
349349
// Check if we already have a cache entry for this key
350350
letcacheEntry=cache.get(cacheKey)asCacheEntry<T>|undefined;
351351

@@ -410,7 +410,7 @@ function useSuspenseIndexedDBState<T>(
410410
consthandleBroadcastMessage=useCallback(
411411
(event:MessageEvent<BroadcastMessage<T>>)=>{
412412
const{ type,key:messageKey,value:messageValue,dbName:msgDbName,storeName:msgStoreName}=event.data;
413-
413+
414414
// Only handle messages for the same database, store, and key
415415
if(msgDbName===dbName&&msgStoreName===storeName&&messageKey===key){
416416
try{
@@ -452,14 +452,23 @@ function useSuspenseIndexedDBState<T>(
452452
constbroadcastChange=useCallback(
453453
(type:'SET'|'DELETE',newValue?:T)=>{
454454
if(broadcastChannel){
455-
constmessage:BroadcastMessage<T>={
456-
type,
457-
key,
458-
value:newValue,
459-
dbName,
460-
storeName
461-
};
462-
broadcastChannel.postMessage(message);
455+
try{
456+
constmessage:BroadcastMessage<T>={
457+
type,
458+
key,
459+
value:newValue,
460+
dbName,
461+
storeName
462+
};
463+
broadcastChannel.postMessage(message);
464+
}catch(error){
465+
// Channel might be closed, ignore the error
466+
if(errorinstanceofError&&error.name==='InvalidStateError'){
467+
console.warn(`BroadcastChannel is closed, cannot send message for key "${key}"`);
468+
}else{
469+
console.error(`Failed to broadcast message for key "${key}":`,error);
470+
}
471+
}
463472
}
464473
},
465474
[broadcastChannel,key,dbName,storeName]
@@ -468,7 +477,7 @@ function useSuspenseIndexedDBState<T>(
468477
// Control methods
469478
constcontrols=useMemo<UseSuspenseIndexedDBStateControls<T>>(()=>({
470479
getItem:()=>value,
471-
480+
472481
setItem:async(newValue:T)=>{
473482
try{
474483
awaitsaveValueToIndexedDB(dbName,storeName,key,newValue,version);
@@ -479,7 +488,7 @@ function useSuspenseIndexedDBState<T>(
479488
throwerror;
480489
}
481490
},
482-
491+
483492
deleteItem:async()=>{
484493
try{
485494
awaitremoveValueFromIndexedDB(dbName,storeName,key,version);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp