fix(ui): drawer buttons, stats fields, nicknames
- Buttons: use text labels (Mic/Spk/End) instead of emoji HTML entities that rendered as raw text on Android WebView - Stats: match Rust CallStatus fields (tx_codec, rx_codec, encode_fps, recv_fps, audio_level, spk_muted) - Nicknames: register_signal sends derive_alias() as the alias so other users see "Brave Falcon" instead of "a525:e9b2:..." - Lobby header shows alias from get_app_info instead of raw fp - pollStatus uses correct field names from Rust struct Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -79,13 +79,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="vd-controls">
|
<div class="vd-controls">
|
||||||
<button id="vd-mic-btn" class="vd-btn" title="Mic (m)">
|
<button id="vd-mic-btn" class="vd-btn" title="Mic (m)">
|
||||||
<span id="vd-mic-icon">🎤</span>
|
<span id="vd-mic-icon">Mic</span>
|
||||||
</button>
|
</button>
|
||||||
<button id="vd-spk-btn" class="vd-btn" title="Speaker (s)">
|
<button id="vd-spk-btn" class="vd-btn" title="Speaker (s)">
|
||||||
<span id="vd-spk-icon">🔊</span>
|
<span id="vd-spk-icon">Spk</span>
|
||||||
</button>
|
</button>
|
||||||
<button id="vd-end-btn" class="vd-btn vd-end" title="Leave voice (q)">
|
<button id="vd-end-btn" class="vd-btn vd-end" title="Leave voice (q)">
|
||||||
<span>⛔</span>
|
<span>End</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1215,8 +1215,11 @@ fn do_register_signal(
|
|||||||
let transport = Arc::new(wzp_transport::QuinnTransport::new(conn));
|
let transport = Arc::new(wzp_transport::QuinnTransport::new(conn));
|
||||||
emit_call_debug(&app, "register_signal:quic_connected", serde_json::json!({ "relay": relay }));
|
emit_call_debug(&app, "register_signal:quic_connected", serde_json::json!({ "relay": relay }));
|
||||||
|
|
||||||
|
// Send alias from seed-derived adjective+noun so other
|
||||||
|
// users see a friendly name in the lobby.
|
||||||
|
let alias = derive_alias(&seed);
|
||||||
transport.send_signal(&SignalMessage::RegisterPresence {
|
transport.send_signal(&SignalMessage::RegisterPresence {
|
||||||
identity_pub, signature: vec![], alias: None,
|
identity_pub, signature: vec![], alias: Some(alias),
|
||||||
}).await.map_err(|e| format!("{e}"))?;
|
}).await.map_err(|e| format!("{e}"))?;
|
||||||
emit_call_debug(&app, "register_signal:register_presence_sent", serde_json::json!({}));
|
emit_call_debug(&app, "register_signal:register_presence_sent", serde_json::json!({}));
|
||||||
|
|
||||||
|
|||||||
@@ -359,16 +359,15 @@ vdSpkBtn.addEventListener("click", async () => {
|
|||||||
interface CallStatusI {
|
interface CallStatusI {
|
||||||
active: boolean;
|
active: boolean;
|
||||||
mic_muted: boolean;
|
mic_muted: boolean;
|
||||||
speaker_muted: boolean;
|
spk_muted: boolean;
|
||||||
send_rms: number;
|
participants: any[];
|
||||||
recv_rms: number;
|
encode_fps: number;
|
||||||
codec_tx: string;
|
recv_fps: number;
|
||||||
codec_rx: string;
|
audio_level: number;
|
||||||
fec_ratio: number;
|
|
||||||
send_packets: number;
|
|
||||||
recv_packets: number;
|
|
||||||
call_duration_secs: number;
|
call_duration_secs: number;
|
||||||
fingerprint: string;
|
fingerprint: string;
|
||||||
|
tx_codec: string;
|
||||||
|
rx_codec: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function pollStatus() {
|
async function pollStatus() {
|
||||||
@@ -382,12 +381,12 @@ async function pollStatus() {
|
|||||||
|
|
||||||
// Update drawer controls
|
// Update drawer controls
|
||||||
vdMicBtn.classList.toggle("muted", st.mic_muted);
|
vdMicBtn.classList.toggle("muted", st.mic_muted);
|
||||||
vdMicIcon.textContent = st.mic_muted ? "🔇" : "🎤";
|
vdMicIcon.textContent = st.mic_muted ? "Muted" : "Mic";
|
||||||
vdSpkBtn.classList.toggle("muted", st.speaker_muted);
|
vdSpkBtn.classList.toggle("muted", st.spk_muted);
|
||||||
vdSpkIcon.textContent = st.speaker_muted ? "🔇" : "🔊";
|
vdSpkIcon.textContent = st.spk_muted ? "Off" : "Spk";
|
||||||
|
|
||||||
// Level meter
|
// Level meter
|
||||||
const pct = Math.min(100, (st.send_rms / 10000) * 100);
|
const pct = Math.min(100, (st.audio_level / 10000) * 100);
|
||||||
vdLevelBar.style.width = `${pct}%`;
|
vdLevelBar.style.width = `${pct}%`;
|
||||||
|
|
||||||
// Duration
|
// Duration
|
||||||
@@ -417,7 +416,7 @@ async function pollStatus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Stats
|
// Stats
|
||||||
vdStats.textContent = `TX: ${st.codec_tx} ${st.send_packets}pkt | RX: ${st.codec_rx} ${st.recv_packets}pkt | FEC: ${(st.fec_ratio * 100).toFixed(0)}%`;
|
vdStats.textContent = `TX: ${st.tx_codec} ${st.encode_fps}fps | RX: ${st.rx_codec} ${st.recv_fps}fps`;
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -718,13 +717,13 @@ async function autoConnect() {
|
|||||||
lobbyDot.style.background = "var(--green)";
|
lobbyDot.style.background = "var(--green)";
|
||||||
lobbyRelayLabel.textContent = `${relay.name} — connected`;
|
lobbyRelayLabel.textContent = `${relay.name} — connected`;
|
||||||
|
|
||||||
// Get identity
|
// Get identity + alias
|
||||||
const fp: string = await invoke("get_identity");
|
const appInfo: any = await invoke("get_app_info");
|
||||||
if (fp) {
|
if (appInfo?.fingerprint) {
|
||||||
myFingerprint = fp;
|
myFingerprint = appInfo.fingerprint;
|
||||||
lobbyFp.textContent = fp;
|
lobbyFp.textContent = appInfo.alias || appInfo.fingerprint;
|
||||||
lobbyIdenticon.innerHTML = "";
|
lobbyIdenticon.innerHTML = "";
|
||||||
lobbyIdenticon.appendChild(createIdenticonEl(fp, 20, true));
|
lobbyIdenticon.appendChild(createIdenticonEl(appInfo.fingerprint, 20, true));
|
||||||
}
|
}
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
lobbyDot.style.background = "var(--red)";
|
lobbyDot.style.background = "var(--red)";
|
||||||
|
|||||||
Reference in New Issue
Block a user