From 70ce364a497579f73a09c4723af7619674f568dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuli=20Sillanp=C3=A4=C3=A4?= Date: Fri, 23 Nov 2018 20:07:30 +0200 Subject: [PATCH 1/2] Support initing application to pre-rendered DOM. --- src-ocaml/tea_app.ml | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src-ocaml/tea_app.ml b/src-ocaml/tea_app.ml index 636dc86..45a1682 100644 --- a/src-ocaml/tea_app.ml +++ b/src-ocaml/tea_app.ml @@ -70,8 +70,7 @@ external makeProgramInterface : getHtmlString:(unit -> string) -> 'msg programInterface = "" [@@bs.obj] - - + (* TODO: Need to refactor the program layers to layer everything properly, things are a bit mixed up right now... *) @@ -132,7 +131,7 @@ let programStateWrapper initModel pump shutdown = ~getHtmlString:render_string -let programLoop update view subscriptions initModel initCmd = function +let programLoop update view subscriptions initModel initCmd hydrate = function | None -> fun callbacks -> let oldSub = ref Tea_sub.none in let handleSubscriptionChange model = @@ -166,8 +165,13 @@ let programLoop update view subscriptions initModel initCmd = function ) } | Some parentNode -> fun callbacks -> - (* let priorRenderedVdom = ref [view initModel] in *) - let priorRenderedVdom = ref [] in + let priorRenderedVdom = + if hydrate = true then + ref [view initModel] + else + ref [] + in + (* let lastVdom = ref (!priorRenderedVdom) in *) let latestModel = ref initModel in let nextFrameID = ref None in @@ -211,7 +215,11 @@ let programLoop update view subscriptions initModel initCmd = function let newSub = subscriptions model in oldSub := (Tea_sub.run callbacks callbacks !oldSub newSub) in let handlerStartup () = - let () = clearPnode () in + let () = + if hydrate = false then + clearPnode () + in + let () = Tea_cmd.run callbacks initCmd in let () = handleSubscriptionChange !latestModel in let () = nextFrameID := Some (-1) in @@ -255,34 +263,34 @@ let programLoop update view subscriptions initModel initCmd = function } -let program : ('flags, 'model, 'msg) program -> Web.Node.t Js.null_undefined -> 'flags -> 'msg programInterface = - fun {init; update; view; subscriptions; shutdown} pnode flags -> +let program : ('flags, 'model, 'msg) program -> Web.Node.t Js.null_undefined -> 'flags -> bool -> 'msg programInterface = + fun {init; update; view; subscriptions; shutdown} pnode flags hydrate -> let () = Web.polyfills () in let initModel, initCmd = init flags in let opnode = Js.Nullable.toOption pnode in - let pumpInterface = programLoop update view subscriptions initModel initCmd opnode in + let pumpInterface = programLoop update view subscriptions initModel initCmd hydrate opnode in programStateWrapper initModel pumpInterface shutdown -let standardProgram : ('flags, 'model, 'msg) standardProgram -> Web.Node.t Js.null_undefined -> 'flags -> 'msg programInterface = - fun {init; update; view; subscriptions} pnode args -> +let standardProgram : ('flags, 'model, 'msg) standardProgram -> Web.Node.t Js.null_undefined -> 'flags -> bool -> 'msg programInterface = + fun {init; update; view; subscriptions} pnode args hydrate -> program { init = init; update = update; view = view; subscriptions = subscriptions; shutdown = fun _model -> Tea_cmd.none - } pnode args - + } pnode args hydrate -let beginnerProgram : ('model, 'msg) beginnerProgram -> Web.Node.t Js.null_undefined -> unit -> 'msg programInterface = - fun {model; update; view} pnode () -> + +let beginnerProgram : ('model, 'msg) beginnerProgram -> Web.Node.t Js.null_undefined -> unit -> bool -> 'msg programInterface = + fun {model; update; view} pnode () hydrate -> standardProgram { init = (fun () -> (model, Tea_cmd.none)); update = (fun model msg -> (update model msg, Tea_cmd.none)); view = view; subscriptions = (fun _model -> Tea_sub.none) - } pnode () + } pnode () hydrate let map func vnode = From 68d434d7eb7ad91662ed7678d4703019b323c49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuli=20Sillanp=C3=A4=C3=A4?= Date: Fri, 23 Nov 2018 20:24:39 +0200 Subject: [PATCH 2/2] Update debug --- src-ocaml/tea_debug.ml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src-ocaml/tea_debug.ml b/src-ocaml/tea_debug.ml index 8479d3d..7299718 100644 --- a/src-ocaml/tea_debug.ml +++ b/src-ocaml/tea_debug.ml @@ -267,8 +267,9 @@ let beginnerProgram : ('msg -> string) -> Web.Node.t Js.null_undefined -> unit -> + bool -> 'msg debug_msg Tea_app.programInterface - = fun { model; update; view; } string_of_msg pnode flags -> + = fun { model; update; view; } string_of_msg pnode flags hydrate -> let debugged = debug string_of_msg { @@ -278,7 +279,7 @@ let beginnerProgram : subscriptions = (fun _model -> Tea_sub.none); shutdown = (fun _model -> Tea_cmd.none); } - in Tea_app.program debugged pnode flags + in Tea_app.program debugged pnode flags hydrate let standardProgram : @@ -286,8 +287,9 @@ let standardProgram : ('msg -> string) -> Web.Node.t Js.null_undefined -> 'flags -> + bool -> 'msg debug_msg Tea_app.programInterface - = fun { init; update; view; subscriptions } string_of_msg pnode flags -> + = fun { init; update; view; subscriptions } string_of_msg pnode flags hydrate -> let debugged = debug string_of_msg { @@ -297,7 +299,7 @@ let standardProgram : subscriptions; shutdown = (fun _model -> Tea_cmd.none); } - in Tea_app.program debugged pnode flags + in Tea_app.program debugged pnode flags hydrate let program : @@ -305,8 +307,9 @@ let program : ('msg -> string) -> Web.Node.t Js.null_undefined -> 'flags -> + bool -> 'msg debug_msg Tea_app.programInterface - = fun { init; update; view; subscriptions; shutdown } string_of_msg pnode flags -> + = fun { init; update; view; subscriptions; shutdown } string_of_msg pnode flags hydrate -> let debugged = debug string_of_msg { @@ -316,4 +319,4 @@ let program : subscriptions; shutdown; } - in Tea_app.program debugged pnode flags + in Tea_app.program debugged pnode flags hydrate