use crate::*;
#[derive(Clone, Copy)]
pub struct UseForm {
pub username: Signal<String>,
pub email: Signal<String>,
pub password: Signal<String>,
pub agree: Signal<bool>,
pub submitted: Signal<String>,
pub errors: Signal<String>,
}
pub fn use_form() -> UseForm {
UseForm {
username: use_signal(|| "".to_string()),
email: use_signal(|| "".to_string()),
password: use_signal(|| "".to_string()),
agree: use_signal(|| true),
submitted: use_signal(|| "".to_string()),
errors: use_signal(|| "".to_string()),
}
}
pub fn form_on_submit(state: UseForm) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
let mut validation_errors: Vec<String> = Vec::new();
if state.username.get().trim().is_empty() {
validation_errors.push("Username is required".to_string());
}
if state.email.get().trim().is_empty() {
validation_errors.push("Email is required".to_string());
}
if state.password.get().len() < 6 {
validation_errors.push("Password must be at least 6 characters".to_string());
}
if !state.agree.get() {
validation_errors.push("You must agree to the terms".to_string());
}
if validation_errors.is_empty() {
state.errors.set("".to_string());
state.submitted.set(format!(
"Submitted: username={}, email={}",
state.username.get(),
state.email.get()
));
} else {
state.errors.set(validation_errors.join("; "));
}
})
}