use crate::core::traits::Form;
use crate::core::FormHandle;
use leptos::prelude::*;
pub fn use_field_dirty<T: Form + PartialEq + Clone + Send + Sync>(
form_handle: &FormHandle<T>,
) -> Memo<bool> {
form_handle.is_dirty()
}
pub fn use_field_touched<T: Form + PartialEq + Clone + Send + Sync>(
form_handle: &FormHandle<T>,
field_name: &str,
) -> Memo<bool> {
let form_handle = form_handle.clone();
let field_name = field_name.to_string();
Memo::new(move |_| {
let current_values = form_handle.get_current_values();
let field_metadata = form_handle.get_field_metadata(&field_name);
if let Some(metadata) = field_metadata {
match metadata.field_type {
crate::core::types::FieldType::Text
| crate::core::types::FieldType::Email
| crate::core::types::FieldType::Password => {
let value = current_values.get_field_value(&field_name);
match value {
crate::core::types::FieldValue::String(s) => !s.is_empty(),
_ => false,
}
}
crate::core::types::FieldType::Boolean => {
let value = current_values.get_field_value(&field_name);
match value {
crate::core::types::FieldValue::Boolean(b) => {
let default_bool = metadata
.default_value
.as_ref()
.and_then(|v| v.as_boolean())
.unwrap_or(false);
b != default_bool
}
_ => false,
}
}
_ => {
let value = current_values.get_field_value(&field_name);
!matches!(value, crate::core::types::FieldValue::String(s) if s.is_empty())
}
}
} else {
false
}
})
}