werewolves/werewolves/src/app/components/input/number.rs

74 lines
2.4 KiB
Rust

use core::num::NonZeroU8;
use leptos::{
ev::{Event, MouseEvent, SubmitEvent, Targeted},
prelude::*,
web_sys::HtmlInputElement,
};
use crate::app::error::WolfError;
#[component]
pub fn ChangePlayerNumber(
submitted_number: WriteSignal<Option<NonZeroU8>>,
error: WriteSignal<Option<WolfError>>,
) -> impl IntoView {
let number: RwSignal<Option<NonZeroU8>> = RwSignal::new(None);
let update = move |e: Targeted<Event, HtmlInputElement>| {
e.prevent_default();
let value = e.target().value();
if value.trim().is_empty() {
number.set(None);
return;
}
let current = number.get_untracked();
let default = current.map(|c| c.get().to_string()).unwrap_or_default();
let value_u8 = match e.target().value().trim().parse::<u8>() {
Ok(v) => v,
Err(err) => {
log::error!("{err}");
e.target().set_value(default.as_str());
return;
}
};
if let Some(nz) = NonZeroU8::new(value_u8) {
number.set(Some(nz));
} else {
e.target().set_value(default.as_str());
}
};
let submit = move |ev: SubmitEvent| {
ev.prevent_default();
log::warn!("called submit with number: {:?}", number.get());
let Some(num) = number.get() else {
error.set(Some(WolfError::NoSeatNumber));
return;
};
submitted_number.set(Some(num));
};
let submit_click = move |ev: MouseEvent| {
ev.prevent_default();
log::warn!("called submit with number: {:?}", number.get());
let Some(num) = number.get() else {
error.set(Some(WolfError::NoSeatNumber));
return;
};
submitted_number.set(Some(num));
};
move || {
view! {
<form class="number-update" on:submit=submit>
<label for="player-number">"change seat number"</label>
<input
id="player-number"
type="number"
autocomplete="off"
on:input:target=update
value=move || { number.get().map(|n| n.get().to_string()).unwrap_or_default() }
/>
<input value="submit" type="submit" on:click=submit_click />
</form>
}
}
}