use crate::*;
#[derive(Clone, Copy, Data, New)]
pub struct UseTodoList {
#[get(pub, type(copy))]
#[set(pub)]
pub items: Signal<Vec<String>>,
#[get(pub, type(copy))]
#[set(pub)]
pub new_item: Signal<String>,
}
pub fn use_todo_list() -> UseTodoList {
UseTodoList::new(
use_signal(|| {
vec![
"Learn Rust".to_string(),
"Build a UI framework".to_string(),
"Write documentation".to_string(),
]
}),
use_signal(|| "".to_string()),
)
}
pub fn todo_list_on_add(state: UseTodoList) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
let text: String = state.new_item.get();
if !text.trim().is_empty() {
let mut current: Vec<String> = state.items.get();
current.push(text.clone());
state.items.set(current);
state.new_item.set("".to_string());
}
})
}
pub fn todo_list_on_remove(items: Signal<Vec<String>>, index: usize) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: NativeEvent| {
let mut current: Vec<String> = items.get();
if index < current.len() {
current.remove(index);
items.set(current);
}
})
}