0.1.1
This commit is contained in:
107
frontend/main.ts
107
frontend/main.ts
@@ -2,6 +2,8 @@
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { AvStartResponse } from './ts/bindings/AvStartResponse';
|
||||
import { AvStopResponse } from './ts/bindings/AvStopResponse';
|
||||
import { LocalSignallingClient } from "./chat";
|
||||
import { PeerInfo } from './ts/bindings/PeerInfo';
|
||||
|
||||
type Mode = "idle" | "audio" | "video" | "av";
|
||||
|
||||
@@ -19,6 +21,15 @@ const avStatus = document.querySelector<HTMLElement>("#av-status");
|
||||
|
||||
const previewElement = document.querySelector<HTMLImageElement>("#video-preview");
|
||||
|
||||
const chatDisplayNameInput = document.querySelector<HTMLInputElement>("#chat-display-name");
|
||||
const chatConnectBtn = document.querySelector<HTMLButtonElement>("#chat-connect-btn");
|
||||
const chatDisconnectBtn = document.querySelector<HTMLButtonElement>("#chat-disconnect-btn");
|
||||
const chatInput = document.querySelector<HTMLInputElement>("#chat-input");
|
||||
const chatSendBtn = document.querySelector<HTMLButtonElement>("#chat-send-btn");
|
||||
const chatPeers = document.querySelector<HTMLElement>("#chat-peers");
|
||||
const chatLogs = document.querySelector<HTMLElement>("#chat-logs");
|
||||
const chatMessages = document.querySelector<HTMLElement>("#chat-messages");
|
||||
|
||||
if (
|
||||
startAudioBtn === null ||
|
||||
stopAudioBtn === null ||
|
||||
@@ -29,7 +40,15 @@ if (
|
||||
startAvBtn === null ||
|
||||
stopAvBtn === null ||
|
||||
avStatus === null ||
|
||||
previewElement === null
|
||||
previewElement === null ||
|
||||
chatDisplayNameInput === null ||
|
||||
chatConnectBtn === null ||
|
||||
chatDisconnectBtn === null ||
|
||||
chatInput === null ||
|
||||
chatSendBtn === null ||
|
||||
chatPeers === null ||
|
||||
chatLogs === null ||
|
||||
chatMessages === null
|
||||
) {
|
||||
throw new Error("missing UI elements");
|
||||
}
|
||||
@@ -320,3 +339,89 @@ stopAvBtn.addEventListener("click", async () => {
|
||||
});
|
||||
|
||||
setCurrentMode("idle");
|
||||
|
||||
let signallingClient: LocalSignallingClient | null = null;
|
||||
|
||||
function appendChatLog(line: string): void {
|
||||
if (chatLogs) {
|
||||
const current = chatLogs.textContent ?? "";
|
||||
chatLogs.textContent = `${current}\n${line}`.trim();
|
||||
}
|
||||
}
|
||||
|
||||
function appendChatMessage(line: string): void {
|
||||
if (chatMessages) {
|
||||
const current = chatMessages.textContent ?? "";
|
||||
chatMessages.textContent = `${current}\n${line}`.trim();
|
||||
}
|
||||
}
|
||||
|
||||
function updatePeerList(peers: PeerInfo[]): void {
|
||||
if (chatPeers)
|
||||
chatPeers.textContent = JSON.stringify(peers, null, 2);
|
||||
}
|
||||
|
||||
function setChatConnected(connected: boolean): void {
|
||||
if (chatConnectBtn)
|
||||
chatConnectBtn.disabled = connected;
|
||||
if (chatDisconnectBtn)
|
||||
chatDisconnectBtn.disabled = !connected;
|
||||
if (chatSendBtn)
|
||||
chatSendBtn.disabled = !connected;
|
||||
}
|
||||
|
||||
chatConnectBtn.addEventListener("click", async () => {
|
||||
if (signallingClient !== null) {
|
||||
appendChatLog("signalling client already exists");
|
||||
return;
|
||||
}
|
||||
|
||||
const displayName = (chatDisplayNameInput.value || "").trim() || "anonymous";
|
||||
|
||||
const client = new LocalSignallingClient(
|
||||
displayName,
|
||||
(line) => appendChatLog(line),
|
||||
(peers) => updatePeerList(peers),
|
||||
(line) => appendChatMessage(line),
|
||||
);
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
signallingClient = client;
|
||||
setChatConnected(true);
|
||||
} catch (error) {
|
||||
appendChatLog(`connect failed: ${String(error)}`);
|
||||
signallingClient = null;
|
||||
setChatConnected(false);
|
||||
}
|
||||
});
|
||||
|
||||
chatDisconnectBtn.addEventListener("click", () => {
|
||||
if (signallingClient === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
signallingClient.disconnect();
|
||||
signallingClient = null;
|
||||
setChatConnected(false);
|
||||
updatePeerList([]);
|
||||
});
|
||||
|
||||
chatSendBtn.addEventListener("click", () => {
|
||||
if (signallingClient === null) {
|
||||
appendChatLog("not connected");
|
||||
return;
|
||||
}
|
||||
|
||||
const text = chatInput.value.trim();
|
||||
if (text.length === 0) {
|
||||
appendChatLog("chat message is empty");
|
||||
return;
|
||||
}
|
||||
|
||||
signallingClient.sendChat(text);
|
||||
chatInput.value = "";
|
||||
});
|
||||
|
||||
setChatConnected(false);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user