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([model/0, msg/0, sidebar_props/0, link_props/0]).
-type model() :: {model, gleam@option:option(binary())}.
-type msg() :: no_op | {set_search_filter, gleam@option:option(binary())}.
-type sidebar_props() :: {sidebar_props,
sprocket@internal@utils@ordered_map:ordered_map(docs@page_route:page_route(), docs@page_route: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@context:context(), link_props()) -> {sprocket@context:context(),
list(sprocket@element:element())}.
link(Ctx, Props) ->
{link_props, Title, Href, Is_active} = Props,
sprocket@component:render(
Ctx,
[sprocket@html:a(
[sprocket@html@attributes:classes(
[{some,
<<"block p-2 text-blue-500 hover:text-blue-700"/utf8>>},
docs@utils@common:maybe(
Is_active,
<<"font-bold"/utf8>>
)]
),
sprocket@html@attributes:href(Href)],
[sprocket@html:text(Title)]
)]
).
-spec sidebar(sprocket@context:context(), sidebar_props()) -> {sprocket@context:context(),
list(sprocket@element:element())}.
sidebar(Ctx, Props) ->
{sidebar_props, Pages, Active} = Props,
sprocket@hooks@reducer:reducer(
Ctx,
initial(),
fun update/2,
fun(Ctx@1, _use1) ->
{state, {model, Search_filter}, Dispatch} = _use1,
sprocket@component:render(
Ctx@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@attributes:class(
<<"font-bold italic my-1"/utf8>>
)],
[sprocket@html:text(
<<"No results for: "/utf8>>
)]
),
sprocket@html:'div'(
[],
[sprocket@html:text(Query@1)]
)]
)];
none ->
sprocket@internal@utils@ordered_map:index_map(
Pages,
fun(I, Item) ->
{keyed_item, _, Page} = Item,
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
).