yewlish-utils 0.1.12

Common utils for yewlish component set
Documentation
use web_sys::wasm_bindgen::JsCast;
use web_sys::{wasm_bindgen::prelude::Closure, Element, ResizeObserver};
use yew::prelude::*;

use crate::hooks::use_observe_move;

#[hook]
pub fn use_viewport_move(element_ref: &NodeRef, on_move: Callback<()>) {
    let (refresh, cleanup) = use_observe_move(element_ref, on_move);

    use_effect_with(
        (refresh.clone(), cleanup.clone(), element_ref.clone()),
        |(refresh, cleanup, element_ref)| {
            refresh.emit(true);

            let refresh = refresh.clone();

            let callback = Closure::wrap(Box::new(move || {
                refresh.emit(true);
            }) as Box<dyn FnMut()>);

            let el_resize_observer = ResizeObserver::new(callback.as_ref().unchecked_ref());

            if let Ok(ref resize_observer) = el_resize_observer {
                if let Some(element) = element_ref.cast::<Element>() {
                    resize_observer.observe(&element);
                }
            }

            let root_resize_observer = ResizeObserver::new(callback.as_ref().unchecked_ref());

            if let Ok(ref resize_observer) = root_resize_observer {
                if let Some(window) = web_sys::window() {
                    if let Some(root) = window.document().and_then(|doc| doc.document_element()) {
                        resize_observer.observe(&root);
                    }
                }
            }

            callback.forget();

            let cleanup = cleanup.clone();

            move || {
                cleanup.emit(());

                if let Ok(ref resize_observer) = el_resize_observer {
                    resize_observer.disconnect();
                }
            }
        },
    );
}