use crate::*;
#[derive(Clone, Copy, Data, New)]
pub struct UseForm {
#[get(pub, type(copy))]
#[set(pub)]
pub username: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub email: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub password: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub agree: Signal<bool>,
#[get(pub, type(copy))]
#[set(pub)]
pub submitted: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub errors: Signal<String>,
}
pub fn use_form() -> UseForm {
UseForm::new(
use_signal(|| "".to_string()),
use_signal(|| "".to_string()),
use_signal(|| "".to_string()),
use_signal(|| true),
use_signal(|| "".to_string()),
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("; "));
}
})
}