@@ -7,12 +7,16 @@ export type PersistNSyncOptionsType = {
77 include ?: ( string | RegExp ) [ ] ;
88 exclude ?: ( string | RegExp ) [ ] ;
99 storage ?: "localStorage" | "sessionStorage" | "cookies" ;
10+ /** @defaultValue 100 */
11+ initDelay ?: number ;
1012} ;
1113type PersistNSyncType = < T > (
1214 f : StateCreator < T , [ ] , [ ] > ,
1315 options : PersistNSyncOptionsType ,
1416) => StateCreator < T , [ ] , [ ] > ;
1517
18+ const DEFAULT_INIT_DELAY = 100 ;
19+
1620function getItem ( options : PersistNSyncOptionsType ) {
1721 const { storage } = options ;
1822 if ( storage === "cookies" ) {
@@ -46,7 +50,8 @@ export const persistNSync: PersistNSyncType = (stateCreator, options) => (set, g
4650 const { name } = options ;
4751 const savedState = getItem ( options ) ;
4852 /** timeout 0 is enough. timeout 100 is added to avoid server and client render content mismatch error */
49- if ( savedState ) setTimeout ( ( ) => set ( { ...get ( ) , ...JSON . parse ( savedState ) } ) , 100 ) ;
53+ const delay = options . initDelay === undefined ? DEFAULT_INIT_DELAY : options . initDelay ;
54+ if ( savedState ) setTimeout ( ( ) => set ( { ...get ( ) , ...JSON . parse ( savedState ) } ) , delay ) ;
5055
5156 const set_ : typeof set = ( newStateOrPartialOrFunction , replace ) => {
5257 set ( newStateOrPartialOrFunction , replace ) ;
@@ -55,10 +60,7 @@ export const persistNSync: PersistNSyncType = (stateCreator, options) => (set, g
5560 } ;
5661
5762 window . addEventListener ( "storage" , e => {
58- if ( e . key === name ) {
59- const newState = JSON . parse ( e . newValue || "{}" ) ;
60- set ( { ...get ( ) , ...newState } ) ;
61- }
63+ if ( e . key === name ) set ( { ...get ( ) , ...JSON . parse ( e . newValue || "{}" ) } ) ;
6264 } ) ;
6365 return stateCreator ( set_ , get , store ) ;
6466} ;
@@ -76,22 +78,12 @@ const getKeysToPersistAndSyncMemoised = (() => {
7678 const { exclude, include } = options ;
7779
7880 const keysToInlcude = include ?. length
79- ? keys . filter ( key => {
80- for ( const patternOrKey of include ) {
81- if ( typeof patternOrKey === "string" && key === patternOrKey ) return true ;
82- else if ( patternOrKey instanceof RegExp && patternOrKey . test ( key ) ) return true ;
83- }
84- return false ;
85- } )
81+ ? keys . filter ( key => matchPatternOrKey ( key , include ) )
8682 : keys ;
8783
88- const keysToPersistAndSync = keysToInlcude . filter ( key => {
89- for ( const patternOrKey of exclude || [ ] ) {
90- if ( typeof patternOrKey === "string" && key === patternOrKey ) return false ;
91- else if ( patternOrKey instanceof RegExp && patternOrKey . test ( key ) ) return false ;
92- }
93- return true ;
94- } ) ;
84+ const keysToPersistAndSync = keysToInlcude . filter (
85+ key => ! matchPatternOrKey ( key , exclude || [ ] ) ,
86+ ) ;
9587 return keysToPersistAndSync ;
9688 } ;
9789
@@ -103,6 +95,14 @@ const getKeysToPersistAndSyncMemoised = (() => {
10395 } ;
10496} ) ( ) ;
10597
98+ function matchPatternOrKey ( key : string , patterns : ( string | RegExp ) [ ] ) {
99+ for ( const patternOrKey of patterns ) {
100+ if ( typeof patternOrKey === "string" && key === patternOrKey ) return true ;
101+ else if ( patternOrKey instanceof RegExp && patternOrKey . test ( key ) ) return true ;
102+ }
103+ return false ;
104+ }
105+
106106function saveAndSync ( { newState, options } : SaveAndSyncProps ) {
107107 const keysToPersistAndSync = getKeysToPersistAndSyncMemoised ( Object . keys ( newState ) , options ) ;
108108
0 commit comments