Current section
Files
Jump to
Current section
Files
src/docs@components@sidebar.erl
-module(docs@components@sidebar).
-compile([no_auto_import, nowarn_unused_vars]).
-export([sidebar/2]).
-export_type([page/0, model/0, msg/0, sidebar_props/0, link_props/0]).
-type page() :: {page, binary(), docs@page_route:page_route()}.
-type model() :: {model, gleam@option:option(binary())}.
-type msg() :: no_op | {set_search_filter, gleam@option:option(binary())}.
-type sidebar_props() :: {sidebar_props,
list(page()),
docs@page_route:page_route()}.
-type link_props() :: {link_props, binary(), binary(), boolean()}.
-spec update(model(), msg()) -> model().
update(Model, Msg) ->
case Msg of
no_op ->
Model;
{set_search_filter, Search_filter} ->
{model, Search_filter}
end.
-spec initial() -> model().
initial() ->
{model, none}.
-spec link(sprocket@socket:socket(), link_props()) -> {sprocket@socket:socket(),
list(sprocket@element:element())}.
link(Socket, Props) ->
{link_props, Title, Href, Is_active} = Props,
sprocket@component:render(
Socket,
[sprocket@html:a(
[sprocket@html@attribute:classes(
[{some,
<<"block p-2 text-blue-500 hover:text-blue-700"/utf8>>},
docs@utils@common:maybe(
Is_active,
<<"font-bold"/utf8>>
)]
),
sprocket@html@attribute:href(Href)],
[sprocket@html:text(Title)]
)]
).
-spec sidebar(sprocket@socket:socket(), sidebar_props()) -> {sprocket@socket:socket(),
list(sprocket@element:element())}.
sidebar(Socket, Props) ->
{sidebar_props, Pages, Active} = Props,
sprocket@hooks@reducer:reducer(
Socket,
initial(),
fun update/2,
fun(Socket@1, _use1) ->
{state, {model, Search_filter}, Dispatch} = _use1,
sprocket@component:render(
Socket@1,
[sprocket@component:component(
fun docs@components@search_bar:search_bar/2,
{search_bar_props, fun(Query) -> case Query of
<<""/utf8>> ->
Dispatch({set_search_filter, none});
_ ->
Dispatch(
{set_search_filter, {some, Query}}
)
end end}
) |
case Search_filter of
{some, Query@1} ->
[sprocket@html:'div'(
[],
[sprocket@html:'div'(
[sprocket@html@attribute:class(
<<"font-bold italic my-1"/utf8>>
)],
[sprocket@html:text(
<<"No results for: "/utf8>>
)]
),
sprocket@html:'div'(
[],
[sprocket@html:text(Query@1)]
)]
)];
none ->
gleam@list:index_map(
Pages,
fun(I, Page) ->
sprocket@html:keyed(
erlang:element(2, Page),
sprocket@component:component(
fun link/2,
{link_props,
<<<<(gleam@int:to_string(I + 1))/binary,
". "/utf8>>/binary,
(erlang:element(2, Page))/binary>>,
docs@page_route:href(
erlang:element(3, Page)
),
erlang:element(3, Page) =:= Active}
)
)
end
)
end]
)
end
).