use crate::app::{dom, templates};
use super::{
defer_onboard_repaint, onboard_flow_begin, set_onboard_name, take_onboard_name,
warn_if_storage_volatile,
};
pub(super) fn reveal_seed_pressed() {
let phrase = crate::app::APP.with(|cell| {
cell.borrow()
.wallet
.as_ref()
.map(|w| w.mnemonic.to_string())
});
if let Some(p) = phrase {
dom::swap_inner(
"seed-reveal",
&templates::seed_phrase(&p).into_string(),
);
} else if !matches!(crate::app::tenant::current(), crate::app::tenant::Host::Apex) {
dom::swap_inner(
"seed-reveal",
"<span style=\"color:var(--muted)\">fetching…</span>",
);
wasm_bindgen_futures::spawn_local(async move {
match crate::app::verify::reveal_seed_via_iframe().await {
Ok(phrase) => dom::swap_inner(
"seed-reveal",
&templates::seed_phrase(&phrase).into_string(),
),
Err(err) => dom::swap_inner(
"seed-reveal",
&maud::html! {
span style="color:var(--error)" { "reveal failed: " (err) }
button type="button" data-action="reveal-seed" class="ghost" { "retry" }
}
.into_string(),
),
}
});
}
}
pub(super) fn onboard_create_pressed() {
let raw = dom::input_by_id("apex-input")
.map(|i| i.value())
.unwrap_or_default();
let cleaned = crate::app::tenant::sanitize(&raw);
if cleaned.len() < 3 || cleaned.len() > 32 {
return;
}
let Some(flow_guard) = onboard_flow_begin() else {
return;
};
set_onboard_name(&cleaned);
dom::swap_outer(
"apex-onboard",
&templates::onboard_checkout().into_string(),
);
wasm_bindgen_futures::spawn_local(async move {
let _flow_guard = flow_guard;
match crate::app::wallet_store::generate_in_memory().await {
Err(err) => {
let _ = take_onboard_name();
dom::swap_outer(
"apex-onboard",
&crate::landing::create_wallet_cta().into_string(),
);
if let Some(input) = dom::input_by_id("apex-input") {
input.set_value(&cleaned);
super::claim::on_apex_input();
}
dom::swap_inner(
"onboard-msg",
&dom::msg_span(dom::Msg::Error, &format!("create failed: {err}")),
);
}
Ok(_) => {
super::credits::buy_lh_pressed(true);
}
}
});
}
pub(super) fn create_identity_pressed() {
let Some(flow_guard) = onboard_flow_begin() else {
return;
};
dom::swap_inner(
"identity-msg",
"<span style=\"color:var(--muted)\">generating identity…</span>",
);
match crate::app::tenant::current() {
crate::app::tenant::Host::Apex => {
wasm_bindgen_futures::spawn_local(async move {
let _flow_guard = flow_guard;
match crate::app::net::with_timeout(
15_000,
crate::app::wallet_store::create_and_persist(),
)
.await
{
Err(_) => {
dom::swap_inner(
"identity-msg",
&dom::msg_span(
dom::Msg::Error,
"create timed out — reload and try again",
),
);
return;
}
Ok(Err(err)) => {
dom::swap_inner(
"identity-msg",
&dom::msg_span(dom::Msg::Error, &format!("create failed: {err}")),
);
return;
}
Ok(Ok(_)) => {}
}
warn_if_storage_volatile().await;
dom::swap_inner(
"identity-msg",
"<span style=\"color:var(--muted)\">identity created — loading…</span>",
);
defer_onboard_repaint(_flow_guard, async {
crate::app::paint_apex(crate::app::tenant::Host::Apex).await;
});
});
}
host => {
wasm_bindgen_futures::spawn_local(async move {
let flow_guard = flow_guard;
match crate::app::verify::create_wallet_via_iframe(false).await {
Ok(_addr) => {
warn_if_storage_volatile().await;
if let crate::app::tenant::Host::Tenant(name) = &host {
let host = host.clone();
let name = name.clone();
defer_onboard_repaint(flow_guard, async move {
crate::app::paint_tenant(host, name).await;
});
}
}
Err(err) => {
dom::swap_inner(
"identity-msg",
&dom::msg_span(dom::Msg::Error, &format!("create failed: {err}")),
);
}
}
});
}
}
}
pub(super) fn import_seed_pressed() {
let phrase = dom::textarea_by_id("import-seed")
.map(|t| t.value())
.unwrap_or_default();
if phrase.split_whitespace().count() != 12 {
dom::swap_inner(
"seed-msg",
"<span style=\"color:var(--error)\">expected exactly 12 words</span>",
);
return;
}
match crate::app::tenant::current() {
crate::app::tenant::Host::Apex => {
wasm_bindgen_futures::spawn_local(async move {
match crate::app::wallet_store::import(&phrase).await {
Ok(_) => {
crate::app::paint_apex(crate::app::tenant::Host::Apex).await;
}
Err(err) => {
dom::swap_inner(
"seed-msg",
&dom::msg_span(dom::Msg::Error, &format!("import failed: {err}")),
);
}
}
});
}
host => {
wasm_bindgen_futures::spawn_local(async move {
match crate::app::wallet_store::import(&phrase).await {
Ok(wallet) => {
crate::app::APP
.with(|cell| cell.borrow_mut().wallet = Some(wallet));
if let crate::app::tenant::Host::Tenant(name) = &host {
crate::app::paint_tenant(host.clone(), name.clone()).await;
}
}
Err(err) => {
dom::swap_inner(
"seed-msg",
&dom::msg_span(dom::Msg::Error, &format!("import failed: {err}")),
);
}
}
});
}
}
}