use sycamore_core::hydrate::{get_next_id, hydration_completed};
use sycamore_core::view::View;
use wasm_bindgen::JsCast;
use web_sys::{window, Comment, Element, Node};
use crate::hydrate_node::HydrateNode;
use crate::Html;
const COMMENT_NODE_TYPE: u16 = 8;
pub fn get_next_element() -> Option<Element> {
if let Some(hk) = get_next_id() {
window()
.unwrap()
.document()
.unwrap()
.query_selector(&format!("[data-hk=\"{}.{}\"]", hk.0, hk.1))
.unwrap()
} else {
None
}
}
pub fn get_next_marker(parent: &Node) -> Option<View<HydrateNode>> {
if hydration_completed() {
None
} else {
let mut buf: Vec<View<HydrateNode>> = Vec::new();
let mut start = false;
let mut start_marker = None;
let children = parent.child_nodes();
for child in (0..children.length()).filter_map(|i| children.get(i)) {
if child.node_type() == COMMENT_NODE_TYPE {
let v = child.node_value();
if v.as_deref() == Some("#") {
start = true; start_marker = Some(child);
} else if v.as_deref() == Some("/") {
if start {
start_marker.unwrap().unchecked_into::<Comment>().remove();
return Some(View::new_fragment(buf));
} else {
buf.push(View::new_node(HydrateNode::from_web_sys(child)));
}
}
} else if start {
buf.push(View::new_node(HydrateNode::from_web_sys(child)));
}
}
None
}
}