use dioxus::prelude::Element;
use wasm_bindgen::prelude::*;
#[wasm_bindgen(inline_js = r#"
export function __ev_register(tag, mount){
if (customElements.get(tag)) return;
customElements.define(tag, class extends HTMLElement {
connectedCallback(){ mount(this); }
});
}
export function __ev_origin(){ return new URL(import.meta.url).origin; }
"#)]
extern "C" {
#[wasm_bindgen(js_name = __ev_register)]
fn js_register(tag: &str, mount: &js_sys::Function);
#[wasm_bindgen(js_name = __ev_origin)]
fn js_origin() -> String;
}
pub fn bundle_origin() -> String {
js_origin()
}
pub fn register(tag: &str, mount: &Closure<dyn Fn(web_sys::Element)>) {
js_register(tag, mount.as_ref().unchecked_ref());
}
pub fn launch_into(el: web_sys::Element, root: fn() -> Element) {
dioxus::LaunchBuilder::new().with_cfg(dioxus::web::Config::new().rootelement(el)).launch(root);
}
#[macro_export]
macro_rules! mfe {
(service: $service:literal,name: $name:literal,kind: $kind:ident,root: $root:path,stylesheet: $stylesheet:literal $(,)?) => {
const __EV_TAG: &str = concat!("mfe-", $service, "-", $name);
pub const MFE_MANIFEST: &str = concat!(
"{\"name\":\"",
$service,
".",
$name,
"\",\"tag\":\"mfe-",
$service,
"-",
$name,
"\",\"kind\":\"",
stringify!($kind),
"\"}"
);
fn __ev_root() -> ::dioxus::prelude::Element {
use ::dioxus::prelude::*;
use $root as EvMfeRoot;
rsx! {
document::Stylesheet { href: format!("{}/mfe/{}", $crate::mfe::bundle_origin(), $stylesheet) }
EvMfeRoot {}
}
}
fn __ev_mount(el: ::web_sys::Element) {
$crate::mfe::launch_into(el, __ev_root);
}
#[::wasm_bindgen::prelude::wasm_bindgen(start)]
pub fn __ev_start() {
let closure = ::wasm_bindgen::closure::Closure::<dyn Fn(::web_sys::Element)>::new(__ev_mount);
$crate::mfe::register(__EV_TAG, &closure);
closure.forget();
}
};
}