@@ -20,6 +20,7 @@ and fullState<'action, 'state> = {
20
20
type reducer <'state , 'action > = ('state , 'action ) => update <'action , 'state >
21
21
22
22
let useReducer = (reducer , initialState ) => {
23
+ let cleanupEffects = React .useRef ([])
23
24
let ({state , sideEffects }, send ) = React .useReducer (({state , sideEffects } as fullState , action ) =>
24
25
switch reducer (state , action ) {
25
26
| NoUpdate => fullState
@@ -34,22 +35,26 @@ let useReducer = (reducer, initialState) => {
34
35
}
35
36
}
36
37
, {state : initialState , sideEffects : ref ([])})
37
- React .useEffect1 (() =>
38
+ React .useEffect1 (() => {
38
39
if Array .length (sideEffects .contents ) > 0 {
39
40
let sideEffectsToRun = Js .Array .sliceFrom (0 , sideEffects .contents )
40
41
sideEffects := []
41
42
let cancelFuncs = Array .keepMap (sideEffectsToRun , func =>
42
43
func ({state : state , send : send , dispatch : send })
43
44
)
44
- Array .length (cancelFuncs ) > 0 ? Some (() => cancelFuncs -> Array .forEach (func => func ())) : None
45
- } else {
46
- None
45
+ let _ = cleanupEffects .current -> Js .Array2 .pushMany (cancelFuncs )
47
46
}
48
- , [sideEffects ])
47
+ None
48
+ }, [sideEffects ])
49
+
50
+ React .useEffect0 (() => {
51
+ Some (() => cleanupEffects .current -> Js .Array2 .forEach (cb => cb ()))
52
+ })
49
53
(state , send )
50
54
}
51
55
52
56
let useReducerWithMapState = (reducer , getInitialState ) => {
57
+ let cleanupEffects = React .useRef ([])
53
58
let ({state , sideEffects }, send ) = React .useReducerWithMapState (
54
59
({state , sideEffects } as fullState , action ) =>
55
60
switch reducer (state , action ) {
@@ -67,17 +72,20 @@ let useReducerWithMapState = (reducer, getInitialState) => {
67
72
(),
68
73
() => {state : getInitialState (), sideEffects : ref ([])},
69
74
)
70
- React .useEffect1 (() =>
75
+ React .useEffect1 (() => {
71
76
if Array .length (sideEffects .contents ) > 0 {
72
77
let sideEffectsToRun = Js .Array .sliceFrom (0 , sideEffects .contents )
73
78
sideEffects := []
74
79
let cancelFuncs = Array .keepMap (sideEffectsToRun , func =>
75
80
func ({state : state , send : send , dispatch : send })
76
81
)
77
- Array .length (cancelFuncs ) > 0 ? Some (() => cancelFuncs -> Array .forEach (func => func ())) : None
78
- } else {
79
- None
82
+ let _ = cleanupEffects .current -> Js .Array2 .pushMany (cancelFuncs )
80
83
}
81
- , [sideEffects ])
84
+ None
85
+ }, [sideEffects ])
86
+
87
+ React .useEffect0 (() => {
88
+ Some (() => cleanupEffects .current -> Js .Array2 .forEach (cb => cb ()))
89
+ })
82
90
(state , send )
83
91
}
0 commit comments