@@ -40,6 +40,10 @@ function throttle(cb, ms) {
40
40
} ;
41
41
}
42
42
43
+ const dispatchStorageEvent = ( key , newValue ) => {
44
+ window . dispatchEvent ( new StorageEvent ( "storage" , { key, newValue } ) ) ;
45
+ } ;
46
+
43
47
export function useBattery ( ) {
44
48
const [ state , setState ] = React . useState ( {
45
49
supported : true ,
@@ -1431,6 +1435,68 @@ export function useScript(src, options = {}) {
1431
1435
return status ;
1432
1436
}
1433
1437
1438
+ const setSessionStorageItem = ( key , value ) => {
1439
+ const stringifiedValue = JSON . stringify ( value ) ;
1440
+ window . sessionStorage . setItem ( key , stringifiedValue ) ;
1441
+ dispatchStorageEvent ( key , stringifiedValue ) ;
1442
+ } ;
1443
+
1444
+ const removeSessionStorageItem = ( key ) => {
1445
+ window . sessionStorage . removeItem ( key ) ;
1446
+ dispatchStorageEvent ( key , null ) ;
1447
+ } ;
1448
+
1449
+ const getSessionStorageItem = ( key ) => {
1450
+ return window . sessionStorage . getItem ( key ) ;
1451
+ } ;
1452
+
1453
+ const useSessionStorageSubscribe = ( callback ) => {
1454
+ window . addEventListener ( "storage" , callback ) ;
1455
+ return ( ) => window . removeEventListener ( "storage" , callback ) ;
1456
+ } ;
1457
+
1458
+ const getSessionStorageServerSnapshot = ( ) => {
1459
+ throw Error ( "useSessionStorage is a client-only hook" ) ;
1460
+ } ;
1461
+
1462
+ export function useSessionStorage ( key , initialValue ) {
1463
+ const getSnapshot = ( ) => getSessionStorageItem ( key ) ;
1464
+
1465
+ const store = React . useSyncExternalStore (
1466
+ useSessionStorageSubscribe ,
1467
+ getSnapshot ,
1468
+ getSessionStorageServerSnapshot
1469
+ ) ;
1470
+
1471
+ const setState = React . useCallback (
1472
+ ( v ) => {
1473
+ try {
1474
+ const nextState = typeof v === "function" ? v ( JSON . parse ( store ) ) : v ;
1475
+
1476
+ if ( nextState === undefined || nextState === null ) {
1477
+ removeSessionStorageItem ( key ) ;
1478
+ } else {
1479
+ setSessionStorageItem ( key , nextState ) ;
1480
+ }
1481
+ } catch ( e ) {
1482
+ console . warn ( e ) ;
1483
+ }
1484
+ } ,
1485
+ [ key , store ]
1486
+ ) ;
1487
+
1488
+ React . useEffect ( ( ) => {
1489
+ if (
1490
+ getSessionStorageItem ( key ) === null &&
1491
+ typeof initialValue !== "undefined"
1492
+ ) {
1493
+ setSessionStorageItem ( key , initialValue ) ;
1494
+ }
1495
+ } , [ key , initialValue ] ) ;
1496
+
1497
+ return [ store ? JSON . parse ( store ) : initialValue , setState ] ;
1498
+ }
1499
+
1434
1500
export function useSet ( values ) {
1435
1501
const setRef = React . useRef ( new Set ( values ) ) ;
1436
1502
const [ , reRender ] = React . useReducer ( ( x ) => x + 1 , 0 ) ;
0 commit comments