1
- import { useState } from 'react '
2
- import { ContextableStates } from 'packages /create'
1
+ import useStateRef from './use-state-ref '
2
+ import { ContextableStates } from '. /create'
3
3
4
4
const pickTrackedValues = < T extends ContextableStates > ( values : T , keys : Array < keyof T > ) => {
5
5
return Object . keys ( values ) . reduce ( ( pre , key ) => {
@@ -13,16 +13,15 @@ const pickTrackedValues = <T extends ContextableStates>(values: T, keys: Array<k
13
13
14
14
const makeUseTracked = < T extends ContextableStates > ( initialValues : T , eventName : string ) => {
15
15
return ( trackingKeys : Array < keyof T > ) => {
16
- const [ selected , setSelected ] = useState < { [ key in typeof trackingKeys [ number ] ] : T [ key ] } > ( ( ) =>
17
- pickTrackedValues ( initialValues , trackingKeys ) ,
18
- )
16
+ const [ selected , setSelected , selectedRef ] = useStateRef <
17
+ { [ key in typeof trackingKeys [ number ] ] : T [ key ] }
18
+ > ( ( ) => pickTrackedValues ( initialValues , trackingKeys ) )
19
19
20
20
if ( typeof window !== 'undefined' ) {
21
21
window . addEventListener ( eventName , ( event : CustomEvent < T > ) => {
22
22
const nextValue = event . detail
23
- const hasChanged = trackingKeys . some ( key => {
24
- return selected [ key ] !== nextValue [ key ]
25
- } )
23
+
24
+ const hasChanged = trackingKeys . some ( key => selectedRef . current [ key ] !== nextValue [ key ] )
26
25
if ( hasChanged ) {
27
26
setSelected ( pickTrackedValues ( nextValue , trackingKeys ) )
28
27
}
0 commit comments