|
1 | 1 | module Feliz.UseElmish |
2 | 2 |
|
| 3 | +open System |
3 | 4 | open Fable.Core |
4 | 5 | open Elmish |
5 | 6 |
|
6 | 7 | module private Util = |
7 | | - type UseSyncExternalStoreSubscribe = delegate of (unit -> unit) -> (unit -> unit) |
8 | | - |
9 | | - [<ImportMember("react")>] |
10 | | - let useSyncExternalStore(subscribe: UseSyncExternalStoreSubscribe, getSnapshot: unit -> 'Model, getServerSnapshot: (unit -> 'Model) option): 'Model = jsNative |
11 | | - |
12 | | - [<ImportMember("react")>] |
13 | | - let useState(init: unit -> 'State): 'State * ('State -> unit) = jsNative |
14 | | - |
15 | | - [<ImportMember "react">] |
16 | | - let useEffect(effect: unit -> unit, dependencies: obj array) : unit = jsNative |
17 | 8 |
|
18 | 9 | [<Emit "setTimeout($0)">] |
19 | 10 | let setTimeout(callback: unit -> unit) : unit = jsNative |
@@ -105,21 +96,22 @@ module private Util = |
105 | 96 | member _.IsOutdated(arg', dependencies') = arg <> arg' || dependencies <> dependencies' |
106 | 97 |
|
107 | 98 | open Util |
| 99 | +open Feliz |
108 | 100 |
|
109 | 101 | [<Erase>] |
110 | 102 | type React = |
111 | 103 | static member useElmish(program: unit -> Program<'Arg, 'Model, 'Msg, unit>, arg: 'Arg, ?dependencies: obj array): 'Model * ('Msg -> unit) = |
112 | | - let state, setState = useState(fun () -> ElmishState(program, arg, dependencies)) |
| 104 | + let state, setState = React.useState(fun () -> ElmishState(program, arg, dependencies)) |
113 | 105 | if state.IsOutdated(arg, dependencies) then |
114 | 106 | ElmishState(program, arg, dependencies) |> setState |
115 | | - let finalState, dispatch, subscribed, queuedMessages = useSyncExternalStore(state.Subscribe, (fun () -> state.State), None) |
| 107 | + let finalState, dispatch, subscribed, queuedMessages = React.useSyncExternalStore(state.Subscribe, UseSyncExternalStoreSnapshot(fun () -> state.State), UseSyncExternalStoreSnapshot(fun () -> state.State)) |
116 | 108 | // Run any queued messages that were dispatched before the Elmish program finished subscribing |
117 | | - useEffect((fun () -> |
| 109 | + React.useEffect((fun () -> |
118 | 110 | if subscribed && queuedMessages.Count > 0 then |
119 | 111 | for msg in queuedMessages do |
120 | 112 | setTimeout(fun () -> dispatch msg) |
121 | 113 | queuedMessages.Clear() |
122 | | - ), [| subscribed; queuedMessages |]) |
| 114 | + ), [| box subscribed; box queuedMessages |]) |
123 | 115 | finalState, dispatch |
124 | 116 |
|
125 | 117 | static member inline useElmish(program: unit -> Program<unit, 'Model, 'Msg, unit>, ?dependencies: obj array) = |
|
0 commit comments