74 lines
2.4 KiB
Rust
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>
|
|
}
|
|
}
|
|
}
|