use sycamore_macro::{component, view, Props};
use crate::*;
#[derive(Props)]
pub struct ShowProps {
#[prop(setter(into))]
pub when: MaybeDyn<bool>,
pub children: Children,
}
#[component]
pub fn Show(props: ShowProps) -> View {
let mut children = props.children.call();
let when = create_selector(move || props.when.get());
if is_ssr!() {
View::from_dynamic(move || {
if when.get() {
std::mem::take(&mut children)
} else {
view! {}
}
})
} else {
View::from_dynamic(move || {
let cloned = utils::clone_nodes_via_web_sys(&children);
if when.get() {
children = utils::unwrap_from_document_fragment(cloned);
utils::clone_nodes_via_web_sys(&children)
} else {
children = utils::wrap_in_document_fragment(cloned);
view! {}
}
})
}
}
#[component(inline_props)]
pub fn NoSsr(children: Children) -> View {
if is_ssr!() {
view! { no-ssr() }
} else {
let marker = create_node_ref();
let view = view! { no-ssr(r#ref=marker) };
on_mount(move || {
let marker = marker.get();
let parent = marker.parent_node().unwrap();
let children = children.call();
for node in children.as_web_sys() {
parent.insert_before(&node, Some(&marker)).unwrap();
}
parent.remove_child(&marker).unwrap();
});
view
}
}
#[component(inline_props)]
pub fn NoHydrate(children: Children) -> View {
if is_ssr!() {
let is_hydrating = IS_HYDRATING.replace(false);
let children = children.call();
IS_HYDRATING.set(is_hydrating);
children
} else if IS_HYDRATING.get() {
view! {}
} else {
children.call()
}
}
pub fn generate_hydration_script(mode: SsrMode) -> &'static str {
match mode {
SsrMode::Sync => "",
SsrMode::Blocking => "window.__sycamore_ssr_mode='blocking'",
SsrMode::Streaming => "window.__sycamore_ssr_mode='streaming'",
}
}
#[component]
pub fn HydrationScript() -> View {
is_ssr! {
let mode = use_context::<SsrMode>();
let script = generate_hydration_script(mode);
view! {
NoHydrate {
script(dangerously_set_inner_html=script)
}
}
}
is_not_ssr! {
view! {}
}
}