use std::{
cell::RefCell,
rc::{Rc, Weak},
};
use cacao::input::TextFieldDelegate;
use crate::{app::AppState, state::Handler};
pub struct InputDelegate {
pub app: Rc<RefCell<Option<Weak<RefCell<AppState>>>>>,
pub on_change: RefCell<Option<Handler>>,
}
impl TextFieldDelegate for InputDelegate {
const NAME: &'static str = "InputDelegate";
fn text_did_change(&self, value: &str) {
let Some(app) = self.app.borrow().as_ref().and_then(Weak::upgrade) else {
return;
};
let Some(Handler::Change(handler)) = self.on_change.borrow().clone() else {
return;
};
if let Ok(app) = app.try_borrow() {
handler(&app.state, value.to_string());
} else {
return;
}
app.borrow_mut().render();
}
}