thaw_utils 0.1.2

Shared Thaw utility functions
Documentation
use cfg_if::cfg_if;

pub fn mount_style(id: &str, content: &'static str) {
    let id = format!("thaw-id-{id}");
    cfg_if! {
        if #[cfg(feature = "ssr")] {
            use leptos::view;
            use leptos_meta::Style;
            use super::SSRMountStyleContext;

            if let Some(context) = SSRMountStyleContext::use_context() {
                context.push_style(id, content.to_string());
                return;
            }

            let _ = view! {
                <Style id=id>
                    {content}
                </Style>
            };
        } else {
            use leptos::prelude::document;
            let head = document().head().expect("head no exist");
            let style = head
                .query_selector(&format!("style#{id}"))
                .expect("query style element error");

            if style.is_some() {
                return;
            }

            let style = document()
                .create_element("style")
                .expect("create style element error");
            _ = style.set_attribute("id", &id);
            style.set_text_content(Some(content));
            _ = head.prepend_with_node_1(&style);
        }
    }
}

pub fn mount_dynamic_style<T: Fn() -> String + Send + Sync + 'static>(id: String, f: T) {
    let id = format!("thaw-id-{id}");
    cfg_if! {
        if #[cfg(feature = "ssr")] {
            use leptos::{view, prelude::untrack};
            use leptos_meta::Style;
            use super::SSRMountStyleContext;

            if let Some(context) = SSRMountStyleContext::use_context() {
                context.push_style(id, untrack(f));
                return;
            }

            let _ = view! {
                <Style id=id>
                    {f()}
                </Style>
            };
        } else {
            use leptos::prelude::document;
            use send_wrapper::SendWrapper;

            let head = document().head().expect("head no exist");
            let style = head
                .query_selector(&format!("style#{id}"))
                .expect("query style element error").unwrap_or_else(|| {
                    let style = document()
                        .create_element("style")
                        .expect("create style element error");
                    _ = style.set_attribute("id", &id);
                    _ = head.prepend_with_node_1(&style);

                    style
                });

            let style = SendWrapper::new(style);
            leptos::prelude::Effect::new_isomorphic(move |_| {
                let content = f();

                style.set_text_content(Some(&content));
            });
        }
    }
}