canonrs-client 0.1.0

CanonRS client-side runtime
use leptos::prelude::*;

#[allow(unused_variables)]
pub fn use_column_reorder<F>(
    container_id: String,
    enabled: Signal<bool>,
    on_reorder: F,
) where
    F: Fn(String, String) + 'static + Clone,
{
    #[allow(unused_variables)]
    let on_reorder_outer = on_reorder.clone();

    Effect::new(move |_| {
        if !enabled.get() {
            return;
        }

        #[cfg(target_arch = "wasm32")]
        {
            use leptos::wasm_bindgen::{closure::Closure, JsCast, JsValue};
            use leptos::leptos_dom::helpers::document;
            use leptos::prelude::set_timeout;

            let on_reorder_for_timeout = on_reorder_outer.clone();
            let container_id_clone = container_id.clone();

            set_timeout(
                move || {
                    let doc = document();
                    if let Some(container) = doc.get_element_by_id(&container_id_clone) {
                        if container.get_attribute("data-reorder-hook-attached").as_deref() == Some("1") {
                            return;
                        }

                        let _ = container.set_attribute("data-reorder-hook-attached", "1");
                        let on_reorder_clone = on_reorder_for_timeout.clone();
                        let container_id_cleanup = container_id_clone.clone();

                        let closure = Closure::wrap(Box::new(move |ev: leptos::web_sys::Event| {
                            if let (Ok(from_val), Ok(to_val)) = (
                                js_sys::Reflect::get(&ev, &JsValue::from_str("dragFrom")),
                                js_sys::Reflect::get(&ev, &JsValue::from_str("dragTo")),
                            ) {
                                if let (Some(from), Some(to)) = (from_val.as_string(), to_val.as_string()) {
                                    on_reorder_clone(from, to);
                                }
                            }
                        }) as Box<dyn FnMut(_)>);

                        let _ = container.add_event_listener_with_callback(
                            "canon:reorder",
                            closure.as_ref().unchecked_ref(),
                        );
                        closure.forget();

                        on_cleanup(move || {
                            if let Some(c) = document().get_element_by_id(&container_id_cleanup) {
                                let _ = c.remove_attribute("data-reorder-hook-attached");
                            }
                        });
                    }
                },
                std::time::Duration::from_millis(150),
            );
        }
    });
}