use wasm_bindgen::prelude::*;
use crate::registry;
use super::dom;
use super::tenant;
use super::templates;
pub(crate) fn has_embed_hint() -> bool {
let Ok(window) = dom::window() else { return false };
let Ok(search) = window.location().search() else { return false };
search.contains("embed=1")
}
pub(crate) async fn paint_embed(host: tenant::Host) {
let Ok(doc) = dom::document() else { return };
let Some(root) = doc.get_element_by_id("root") else { return };
let name = match &host {
tenant::Host::Tenant(n) => n.clone(),
tenant::Host::Apex => "localharness".to_string(),
tenant::Host::Other(h) => h.clone(),
};
let placeholder = templates::embed_card(&name, None, None, None, None).into_string();
root.set_inner_html(&placeholder);
notify_parent_ready(&name);
let owner = registry::owner_of_name(&name).await.ok().flatten();
let tba = match &owner {
Some(_) => registry::tba_of_name(&name).await.ok().flatten(),
None => None,
};
let lh_balance = match &tba {
Some(addr) => registry::token_balance_of(addr).await.ok(),
None => None,
};
let is_main = match &owner {
Some(addr) => {
let main_id = registry::main_of(addr).await.ok().unwrap_or(0);
if main_id == 0 {
false
} else {
registry::name_of_id(main_id)
.await
.ok()
.map(|n| n == name)
.unwrap_or(false)
}
}
None => false,
};
let html = templates::embed_card(
&name,
owner.as_deref(),
tba.as_deref(),
lh_balance,
Some(is_main),
)
.into_string();
root.set_inner_html(&html);
notify_parent_ready(&name);
}
fn notify_parent_ready(name: &str) {
let Ok(window) = dom::window() else { return };
let height = window
.document()
.and_then(|d| d.document_element())
.map(|el| el.scroll_height())
.unwrap_or(0);
let payload = js_sys::Object::new();
let _ = js_sys::Reflect::set(
&payload,
&JsValue::from_str("type"),
&JsValue::from_str("lh-embed-ready"),
);
let _ = js_sys::Reflect::set(
&payload,
&JsValue::from_str("name"),
&JsValue::from_str(name),
);
let _ = js_sys::Reflect::set(
&payload,
&JsValue::from_str("height"),
&JsValue::from_f64(height as f64),
);
if let Ok(Some(parent)) = window.parent() {
let _ = parent.post_message(&payload.into(), "*");
}
}