Current section
Files
Jump to
Current section
Files
src/docs@components@events_counter.erl
-module(docs@components@events_counter).
-compile([no_auto_import, nowarn_unused_vars]).
-export([button/2, display/2, counter/2]).
-export_type([msg/0, counter_props/0, button_props/0, display_props/0]).
-type msg() :: {update_counter, integer()}.
-type counter_props() :: {counter_props, boolean()}.
-type button_props() :: {button_props,
gleam@option:option(binary()),
binary(),
fun(() -> nil)}.
-type display_props() :: {display_props,
integer(),
gleam@option:option(fun(() -> nil))}.
-spec update(integer(), msg()) -> integer().
update(_, Msg) ->
case Msg of
{update_counter, Count} ->
Count
end.
-spec button(sprocket@context:context(), button_props()) -> {sprocket@context:context(),
list(sprocket@element:element())}.
button(Ctx, Props) ->
{button_props, Class, Label, _} = Props,
sprocket@hooks@callback:callback(
Ctx,
{callback_fn, erlang:element(4, Props)},
{with_deps, [sprocket@hooks:dep(erlang:element(4, Props))]},
fun(Ctx@1, On_click) ->
sprocket@component:render(
Ctx@1,
[sprocket@html:button_text(
[sprocket@html@attributes:on_click(On_click),
sprocket@html@attributes:classes(
[Class,
{some,
<<"p-1 px-2 border dark:border-gray-500 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 active:bg-gray-300 dark:active:bg-gray-600"/utf8>>}]
)],
Label
)]
)
end
).
-spec display(sprocket@context:context(), display_props()) -> {sprocket@context:context(),
list(sprocket@element:element())}.
display(Ctx, Props) ->
{display_props, Count, On_reset} = Props,
sprocket@hooks@callback:callback(
Ctx,
{callback_fn, gleam@option:unwrap(On_reset, fun() -> nil end)},
{with_deps, []},
fun(Ctx@1, On_reset@1) ->
sprocket@component:render(
Ctx@1,
[sprocket@html:span(
[sprocket@html@attributes:on_doubleclick(On_reset@1),
sprocket@html@attributes:class(
<<"p-1 px-2 w-10 bg-white dark:bg-gray-900 border-t border-b dark:border-gray-500 align-center text-center select-none"/utf8>>
)],
[sprocket@html:text(gleam@int:to_string(Count))]
)]
)
end
).
-spec counter(sprocket@context:context(), counter_props()) -> {sprocket@context:context(),
list(sprocket@element:element())}.
counter(Ctx, Props) ->
{counter_props, Enable_reset} = Props,
sprocket@hooks@reducer:reducer(
Ctx,
0,
fun update/2,
fun(Ctx@1, _use1) ->
{state, Count, Dispatch} = _use1,
sprocket@component:render(
Ctx@1,
[sprocket@html:'div'(
[sprocket@html@attributes:class(
<<"flex flex-row m-4"/utf8>>
)],
[sprocket@component:component(
fun button/2,
{button_props,
{some, <<"rounded-l"/utf8>>},
<<"-"/utf8>>,
fun() ->
Dispatch({update_counter, Count - 1})
end}
),
sprocket@component:component(
fun display/2,
{display_props,
Count,
{some, fun() -> case Enable_reset of
true ->
Dispatch(
{update_counter, 0}
);
false ->
nil
end end}}
),
sprocket@component:component(
fun button/2,
{button_props,
{some, <<"rounded-r"/utf8>>},
<<"+"/utf8>>,
fun() ->
Dispatch({update_counter, Count + 1})
end}
)]
)]
)
end
).