use crate::diff::diff;
use crate::event::VirtualEvents;
use crate::patch::patch;
use std::collections::HashMap;
use virtual_node::VirtualNode;
use wasm_bindgen::JsValue;
use web_sys::{Element, Node};
mod events;
pub struct PercyDom {
current_vdom: VirtualNode,
pub events: VirtualEvents,
root_node: Node,
event_delegation_listeners: HashMap<&'static str, Box<dyn AsRef<JsValue>>>,
}
impl PercyDom {
pub fn new(current_vdom: VirtualNode) -> PercyDom {
let mut events = VirtualEvents::new();
let (created_node, events_node) = current_vdom.create_dom_node(&mut events);
events.set_root(events_node);
let mut pdom = PercyDom {
current_vdom,
root_node: created_node,
events,
event_delegation_listeners: HashMap::new(),
};
pdom.attach_event_listeners();
pdom
}
pub fn new_append_to_mount(current_vdom: VirtualNode, mount: &Element) -> PercyDom {
let pdom = Self::new(current_vdom);
mount
.append_child(&pdom.root_node)
.expect("Could not append child to mount");
pdom
}
pub fn new_replace_mount(current_vdom: VirtualNode, mount: Element) -> PercyDom {
let pdom = Self::new(current_vdom);
mount
.replace_with_with_node_1(&pdom.root_node)
.expect("Could not replace mount element");
pdom
}
pub fn update(&mut self, new_vdom: VirtualNode) {
let patches = diff(&self.current_vdom, &new_vdom);
patch(
self.root_node.clone(),
&new_vdom,
&mut self.events,
&patches,
)
.unwrap();
self.current_vdom = new_vdom;
}
pub fn root_node(&self) -> Node {
self.root_node.clone()
}
}