use web_sys::Element;
use super::lifecycle::LifecycleState;
pub struct RuntimeContext {
pub root: Element,
pub uid: String,
pub group: String,
}
impl RuntimeContext {
pub fn new(root: Element, uid: String, group: String) -> Self {
Self { root, uid, group }
}
pub fn from_element(el: Element) -> Option<Self> {
let uid = el.get_attribute("data-rs-uid")?;
let group = el.get_attribute("data-rs-interaction").unwrap_or_default();
Some(Self::new(el, uid, group))
}
pub fn listen<F>(&self, event: &str, cb: F) -> usize
where F: FnMut(web_sys::Event) + 'static
{
let id = super::listeners::listen(&self.uid, &self.root, event, cb);
super::ownership::track_listener(&self.uid);
id
}
pub fn listen_document<F>(&self, event: &str, cb: F) -> usize
where F: FnMut(web_sys::Event) + 'static
{
let id = super::listeners::listen_document(&self.uid, event, cb);
super::ownership::track_listener(&self.uid);
id
}
pub fn listen_window<F>(&self, event: &str, cb: F) -> usize
where F: FnMut(web_sys::Event) + 'static
{
let id = super::listeners::listen_window(&self.uid, event, cb);
super::ownership::track_listener(&self.uid);
id
}
pub fn raf<F>(&self, key: &str, work: F)
where F: FnOnce() + 'static
{
let raf_key = format!("{}:{}", self.uid, key);
super::scheduler::raf(&raf_key, work);
}
pub fn batch<F>(&self, key: &str, work: F)
where F: FnOnce() + 'static
{
let batch_key = format!("{}:{}", self.uid, key);
super::scheduler::batch(&batch_key, work);
}
pub fn cleanup(&self) {
super::cleanup::cleanup_uid(&self.uid);
super::lifecycle::set_state(&self.uid, LifecycleState::Destroy);
super::ownership::release(&self.uid);
}
pub fn transition(&self, state: LifecycleState) -> bool {
super::lifecycle::transition(&self.uid, state)
}
pub fn state(&self) -> Option<LifecycleState> {
super::lifecycle::state(&self.uid)
}
}