This commit is contained in:
2025-03-05 11:55:44 +01:00
parent 415cca4ebe
commit 196610f8f7

View File

@@ -43,6 +43,7 @@ use crate::models::HoldRole;
use leptos::Params; use leptos::Params;
use leptos::prelude::*; use leptos::prelude::*;
use leptos_router::params::Params; use leptos_router::params::Params;
use web_sys::MouseEvent;
#[derive(Params, PartialEq, Clone)] #[derive(Params, PartialEq, Clone)]
struct RouteParams { struct RouteParams {
@@ -91,9 +92,11 @@ pub fn Wall() -> impl IntoView {
None => {} None => {}
}); });
let ui_is_flash = RwSignal::new(false); let (attempt_today, set_attempt_today) = signal(None);
let ui_is_send = RwSignal::new(false);
let ui_is_attempt = RwSignal::new(false); let ui_is_flash = Signal::derive(move || matches!(attempt_today.get(), Some(models::Attempt::Flash)));
let ui_is_send = Signal::derive(move || matches!(attempt_today.get(), Some(models::Attempt::Send)));
let ui_is_attempt = Signal::derive(move || matches!(attempt_today.get(), Some(models::Attempt::Attempt)));
let ui_is_favorite = RwSignal::new(false); let ui_is_favorite = RwSignal::new(false);
// On reception of user interaction state, set UI signals // On reception of user interaction state, set UI signals
@@ -127,6 +130,27 @@ pub fn Wall() -> impl IntoView {
], ],
}; };
// onclick handler helper
let set_or_deselect = |s: WriteSignal<Option<models::Attempt>>, v: models::Attempt| {
s.update(|s| match s {
Some(x) if *x == v => {
*s = None;
}
_ => {
*s = Some(v);
}
});
};
let onclick_flash = move |_| {
set_or_deselect(set_attempt_today, models::Attempt::Flash);
};
let onclick_send = move |_| {
set_or_deselect(set_attempt_today, models::Attempt::Send);
};
let onclick_attempt = move |_| {
set_or_deselect(set_attempt_today, models::Attempt::Attempt);
};
leptos::view! { leptos::view! {
<div class="min-h-screen min-w-screen bg-neutral-950"> <div class="min-h-screen min-w-screen bg-neutral-950">
<StyledHeader items=Signal::derive(header_items) /> <StyledHeader items=Signal::derive(header_items) />
@@ -176,6 +200,9 @@ pub fn Wall() -> impl IntoView {
flash=ui_is_flash flash=ui_is_flash
send=ui_is_send send=ui_is_send
attempt=ui_is_attempt attempt=ui_is_attempt
onclick_flash
onclick_send
onclick_attempt
/> />
<Separator /> <Separator />
@@ -236,18 +263,20 @@ pub fn Wall() -> impl IntoView {
#[component] #[component]
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
fn AttemptRadio(#[prop(into)] flash: RwSignal<bool>, #[prop(into)] send: RwSignal<bool>, #[prop(into)] attempt: RwSignal<bool>) -> impl IntoView { fn AttemptRadio(
#[prop(into)] flash: Signal<bool>,
#[prop(into)] send: Signal<bool>,
#[prop(into)] attempt: Signal<bool>,
onclick_flash: impl FnMut(MouseEvent) + 'static,
onclick_send: impl FnMut(MouseEvent) + 'static,
onclick_attempt: impl FnMut(MouseEvent) + 'static,
) -> impl IntoView {
tracing::debug!("Enter"); tracing::debug!("Enter");
view! { view! {
<div class="flex flex-row justify-evenly md:flex-col 2xl:flex-row"> <div class="flex flex-row justify-evenly md:flex-col 2xl:flex-row">
<Button <Button
onclick=move |_| { onclick=onclick_flash
flash
.update(|x| {
*x = !*x;
});
}
text="Flash" text="Flash"
icon=Icon::BoltSolid icon=Icon::BoltSolid
color=Gradient::CyanBlue color=Gradient::CyanBlue
@@ -255,11 +284,7 @@ fn AttemptRadio(#[prop(into)] flash: RwSignal<bool>, #[prop(into)] send: RwSigna
/> />
<Button <Button
onclick=move |_| { onclick=onclick_send
send.update(|x| {
*x = !*x;
});
}
text="Send" text="Send"
icon=Icon::Trophy icon=Icon::Trophy
color=Gradient::TealLime color=Gradient::TealLime
@@ -267,12 +292,7 @@ fn AttemptRadio(#[prop(into)] flash: RwSignal<bool>, #[prop(into)] send: RwSigna
/> />
<Button <Button
onclick=move |_| { onclick=onclick_attempt
attempt
.update(|x| {
*x = !*x;
});
}
text="Attempt" text="Attempt"
icon=Icon::ArrowTrendingUp icon=Icon::ArrowTrendingUp
color=Gradient::PinkOrange color=Gradient::PinkOrange