use crate::*;
#[derive(Clone, Copy, Data, New)]
pub struct UseSelect {
#[get(pub, type(copy))]
#[set(pub)]
pub selected_fruit: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub selected_country: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub selected_city: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub feedback: Signal<String>,
#[get(pub, type(copy))]
#[set(pub)]
pub textarea_content: Signal<String>,
}
pub fn use_select() -> UseSelect {
UseSelect::new(
use_signal(|| "apple".to_string()),
use_signal(|| "".to_string()),
use_signal(|| "".to_string()),
use_signal(|| "".to_string()),
use_signal(|| "".to_string()),
)
}
pub fn select_on_country_change(state: UseSelect) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Change, move |event: NativeEvent| {
if let NativeEvent::Change(change_event) = event {
state.selected_country.set(change_event.get_value().clone());
state.selected_city.set("".to_string());
}
})
}
pub fn select_on_submit_feedback(state: UseSelect) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
let content: String = state.textarea_content.get();
if content.trim().is_empty() {
state
.feedback
.set("Please enter some feedback.".to_string());
} else if content.len() > 200 {
state
.feedback
.set("Feedback is too long (max 200 chars).".to_string());
} else {
state
.feedback
.set(format!("Thank you for your feedback: \"{}\"", content));
state.textarea_content.set("".to_string());
}
})
}