aboutsummaryrefslogtreecommitdiff
path: root/apps/dreki_web/src/dreki_web_ui.erl
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dreki_web/src/dreki_web_ui.erl')
-rw-r--r--apps/dreki_web/src/dreki_web_ui.erl43
1 files changed, 43 insertions, 0 deletions
diff --git a/apps/dreki_web/src/dreki_web_ui.erl b/apps/dreki_web/src/dreki_web_ui.erl
new file mode 100644
index 0000000..d60cc6e
--- /dev/null
+++ b/apps/dreki_web/src/dreki_web_ui.erl
@@ -0,0 +1,43 @@
+-module(dreki_web_ui).
+-export([render/3, reply_html/3, reply_html/4]).
+
+render(Req, InnerModule, Assigns0) ->
+ Assigns = assigns(Req, Assigns0),
+ {ok, InnerHtml} = InnerModule:render(Assigns),
+ render_layout(Req, InnerHtml, Assigns).
+
+reply_html(Req, Code, Html) ->
+ reply_html(Req, Code, Html, #{}).
+
+reply_html(Req, Code, Html, Headers0) ->
+ Headers = maps:put(<<"content-type">>, <<"text/html">>, Headers0),
+ cowboy_req:reply(Code, Headers, Html, Req).
+
+render_layout(Req, InnerHtml, Assigns) ->
+ {ok, Html} = layout_dtl:render([{"inner", InnerHtml} | Assigns]),
+ Html.
+
+assigns(Req, Assigns0) ->
+ Assigns = clean_assigns(Assigns0),
+ [{"site_title", "Dreki"},
+ {"identity_id", maps:get(identity_id, Req)},
+ {"identity", maps:get(identity, Req)},
+ {"identity_name", dreki_web:identity_name(Req)},
+ {"dreki_node", node()},
+ {"dreki_world", dreki_world:to_map()}
+ | Assigns].
+
+content_types_accepted(Req, State) ->
+ {[
+ {{ <<"multipart">>, <<"form-data">>, '*'}, from_form}
+ ], Req, State}.
+
+content_types_provided(Req, State) ->
+ {[{{ <<"text">>, <<"html">>, '*'}, to_html}], Req, State}.
+
+clean_assigns(Assigns) when is_list(Assigns) ->
+ Assigns;
+clean_assigns(Map) when is_map(Map) ->
+ maps:fold(fun (Key, Value, Acc) -> [{Key, clean_assigns(Value)} | Acc] end, [], Map);
+clean_assigns(Other) ->
+ Other.