use leptos::html;
use leptos::prelude::*;
use leptos::wasm_bindgen::closure::Closure;
use leptos::wasm_bindgen::JsCast;
use leptos::web_sys;
use web_sys::js_sys;
#[component]
pub fn ChartVisibility(children: ChildrenFn) -> impl IntoView {
let has_been_visible = RwSignal::new(false);
let container_ref = NodeRef::<html::Div>::new();
Effect::new(move |_| {
let Some(el) = container_ref.get() else {
return;
};
let on_intersect =
Closure::<dyn FnMut(js_sys::Array, web_sys::IntersectionObserver)>::wrap(Box::new(
move |entries: js_sys::Array, _observer: web_sys::IntersectionObserver| {
if has_been_visible.get_untracked() {
return; }
if let Ok(entry) = entries
.get(0)
.dyn_into::<web_sys::IntersectionObserverEntry>()
{
if entry.is_intersecting() {
has_been_visible.set(true);
}
}
},
));
let observer = web_sys::IntersectionObserver::new(on_intersect.as_ref().unchecked_ref())
.expect("IntersectionObserver::new failed");
observer.observe(&el);
on_intersect.forget();
std::mem::forget(observer);
});
view! {
<div node_ref=container_ref class="flex flex-col flex-1 min-h-0 w-full h-full">
<Show when=move || has_been_visible.get()>{children()}</Show>
</div>
}
}