-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@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@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@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@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 ).