Skip to content

Commit 5336051

Browse files
committed
Fix cleanup effects
Fixes #15
1 parent 6a6f839 commit 5336051

File tree

2 files changed

+5398
-20
lines changed

2 files changed

+5398
-20
lines changed

src/ReactUpdate.res

+18-10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ and fullState<'action, 'state> = {
2020
type reducer<'state, 'action> = ('state, 'action) => update<'action, 'state>
2121

2222
let useReducer = (reducer, initialState) => {
23+
let cleanupEffects = React.useRef([])
2324
let ({state, sideEffects}, send) = React.useReducer(({state, sideEffects} as fullState, action) =>
2425
switch reducer(state, action) {
2526
| NoUpdate => fullState
@@ -34,22 +35,26 @@ let useReducer = (reducer, initialState) => {
3435
}
3536
}
3637
, {state: initialState, sideEffects: ref([])})
37-
React.useEffect1(() =>
38+
React.useEffect1(() => {
3839
if Array.length(sideEffects.contents) > 0 {
3940
let sideEffectsToRun = Js.Array.sliceFrom(0, sideEffects.contents)
4041
sideEffects := []
4142
let cancelFuncs = Array.keepMap(sideEffectsToRun, func =>
4243
func({state: state, send: send, dispatch: send})
4344
)
44-
Array.length(cancelFuncs) > 0 ? Some(() => cancelFuncs->Array.forEach(func => func())) : None
45-
} else {
46-
None
45+
let _ = cleanupEffects.current->Js.Array2.pushMany(cancelFuncs)
4746
}
48-
, [sideEffects])
47+
None
48+
}, [sideEffects])
49+
50+
React.useEffect0(() => {
51+
Some(() => cleanupEffects.current->Js.Array2.forEach(cb => cb()))
52+
})
4953
(state, send)
5054
}
5155

5256
let useReducerWithMapState = (reducer, getInitialState) => {
57+
let cleanupEffects = React.useRef([])
5358
let ({state, sideEffects}, send) = React.useReducerWithMapState(
5459
({state, sideEffects} as fullState, action) =>
5560
switch reducer(state, action) {
@@ -67,17 +72,20 @@ let useReducerWithMapState = (reducer, getInitialState) => {
6772
(),
6873
() => {state: getInitialState(), sideEffects: ref([])},
6974
)
70-
React.useEffect1(() =>
75+
React.useEffect1(() => {
7176
if Array.length(sideEffects.contents) > 0 {
7277
let sideEffectsToRun = Js.Array.sliceFrom(0, sideEffects.contents)
7378
sideEffects := []
7479
let cancelFuncs = Array.keepMap(sideEffectsToRun, func =>
7580
func({state: state, send: send, dispatch: send})
7681
)
77-
Array.length(cancelFuncs) > 0 ? Some(() => cancelFuncs->Array.forEach(func => func())) : None
78-
} else {
79-
None
82+
let _ = cleanupEffects.current->Js.Array2.pushMany(cancelFuncs)
8083
}
81-
, [sideEffects])
84+
None
85+
}, [sideEffects])
86+
87+
React.useEffect0(() => {
88+
Some(() => cleanupEffects.current->Js.Array2.forEach(cb => cb()))
89+
})
8290
(state, send)
8391
}

0 commit comments

Comments
 (0)