Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experiment of initializing to pre-rendered DOM #104

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 24 additions & 16 deletions src-ocaml/tea_app.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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... *)


Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 =
Expand Down
15 changes: 9 additions & 6 deletions src-ocaml/tea_debug.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -278,16 +279,17 @@ 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 :
('flags, 'model, 'msg) Tea_app.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
{
Expand All @@ -297,16 +299,17 @@ 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 :
('flags, 'model, 'msg) Tea_app.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
{
Expand All @@ -316,4 +319,4 @@ let program :
subscriptions;
shutdown;
}
in Tea_app.program debugged pnode flags
in Tea_app.program debugged pnode flags hydrate