#[cfg(any(client, doc))]
use sycamore::utils::render::insert;
#[cfg(all(not(feature = "hydrate"), any(client, doc)))]
use sycamore::web::DomNode;
#[cfg(engine)]
use sycamore::web::SsrNode;
use sycamore::{prelude::Scope, view::View};
#[cfg(any(client, doc))]
#[allow(unused_variables)]
pub(crate) fn render_or_hydrate(
cx: Scope,
view: View<crate::template::BrowserNodeType>,
parent: web_sys::Element,
force_render: bool,
) {
use sycamore::utils::hydrate::{with_hydration_context, with_no_hydration_context};
#[cfg(feature = "hydrate")]
{
use sycamore::web::HydrateNode;
if force_render {
parent.set_inner_html("");
}
let mut children = Vec::new();
let child_nodes = parent.child_nodes();
for i in 0..child_nodes.length() {
children.push(child_nodes.get(i).unwrap());
}
let children = children
.into_iter()
.map(|x| View::new_node(HydrateNode::from_web_sys(x)))
.collect::<Vec<_>>();
insert(
cx,
&HydrateNode::from_web_sys(parent.into()),
if force_render {
with_no_hydration_context(|| view)
} else {
with_hydration_context(|| view)
},
if force_render {
None
} else {
Some(View::new_fragment(children))
},
None,
false,
);
}
#[cfg(not(feature = "hydrate"))]
{
parent.set_inner_html("");
insert(
cx,
&DomNode::from_web_sys(parent.into()),
view,
None,
None,
false,
);
}
}
#[cfg(engine)]
pub(crate) fn ssr_fallible<E>(
view_fn: impl FnOnce(Scope) -> Result<View<SsrNode>, E>,
) -> Result<String, E> {
use sycamore::web::WriteToString;
use sycamore::{prelude::create_scope_immediate, utils::hydrate::with_hydration_context};
let mut ret = Ok(String::new());
create_scope_immediate(|cx| {
let view_res = with_hydration_context(|| view_fn(cx));
match view_res {
Ok(view) => {
let mut view_str = String::new();
for node in view.flatten() {
node.write_to_string(&mut view_str);
}
ret = Ok(view_str);
}
Err(err) => {
ret = Err(err);
}
}
});
ret
}