thaw_utils 0.1.2

Shared Thaw utility functions
Documentation
use leptos::prelude::Signal;

pub fn use_lock_html_scroll(is_lock: Signal<bool>) {
    #[cfg(any(feature = "csr", feature = "hydrate"))]
    {
        use leptos::prelude::{document, on_cleanup, Get, RenderEffect, StoredValue, UpdateValue};
        use send_wrapper::SendWrapper;

        let style_el = StoredValue::new(SendWrapper::new(None::<web_sys::Element>));
        let remove_style_el = move || {
            style_el.update_value(move |el| {
                if let Some(el) = Option::take(el) {
                    el.remove();
                }
            });
        };

        let effect = RenderEffect::new(move |prev| {
            let is_lock = is_lock.get();
            let prev: bool = prev.unwrap_or_default();

            if is_lock && !prev {
                let head = document().head().expect("head no exist");
                let style = document()
                    .create_element("style")
                    .expect("create style element error");
                _ = style.set_attribute("data-id", &format!("thaw-lock-html-scroll"));
                style.set_text_content(Some("html { overflow: hidden; }"));
                _ = head.append_child(&style);
                style_el.update_value(move |el| {
                    *el = SendWrapper::new(Some(style));
                });
            } else if !is_lock && prev {
                remove_style_el();
            }

            is_lock
        });

        on_cleanup(move || {
            drop(effect);
            remove_style_el();
        });
    }

    #[cfg(not(any(feature = "csr", feature = "hydrate")))]
    {
        _ = is_lock;
    }
}