use crate::util::document;
use std::{cell::RefCell, marker::PhantomData, rc::Rc};
use wasm_bindgen::JsCast;
pub fn el_ref<E: Clone>(reference: &ElRef<E>) -> ElRef<E> {
reference.clone()
}
#[derive(Debug, Clone)]
pub struct ElRef<E> {
pub shared_node_ws: SharedNodeWs,
phantom: PhantomData<E>,
}
impl<E: Clone + JsCast> ElRef<E> {
pub fn new() -> Self {
Self {
shared_node_ws: SharedNodeWs::new(),
phantom: PhantomData,
}
}
pub fn get(&self) -> Option<E> {
let Some(node_ws) = self.shared_node_ws.clone_inner() else { return None };
if !document().contains(Some(&node_ws)) {
return None;
}
node_ws.dyn_into::<E>().ok()
}
pub fn map_type<T>(&self) -> ElRef<T> {
ElRef {
shared_node_ws: self.shared_node_ws.clone(),
phantom: PhantomData,
}
}
}
impl<E> Default for ElRef<E> {
fn default() -> Self {
Self {
shared_node_ws: SharedNodeWs::new(),
phantom: PhantomData,
}
}
}
#[derive(Debug, Default, Clone)]
pub struct SharedNodeWs(Rc<RefCell<Option<web_sys::Node>>>);
impl SharedNodeWs {
pub fn new() -> Self {
Self(Rc::new(RefCell::new(None)))
}
pub fn set(&mut self, node_ws: web_sys::Node) {
self.0.replace(Some(node_ws));
}
pub fn clone_inner(&self) -> Option<web_sys::Node> {
self.0.borrow().clone()
}
}