import { useCallback, useEffect } from "preact/hooks";
import { AgentIndicator } from "./components/AgentIndicator";
import { ControlBar, VoiceStatus } from "./components/Controls";
import { LogPanel } from "./components/LogPanel";
import { ToastContainer } from "./components/Toast";
import { useAudioMeter } from "./hooks/useAudioMeter";
import { usePTT } from "./hooks/usePTT";
import { useWebRTC } from "./hooks/useWebRTC";
export function App() {
const rtc = useWebRTC();
const audioLevel = useAudioMeter(rtc.remoteStream);
const { agentStateOverride, handlePointerDown, handlePointerUp } = usePTT({
connected: rtc.connected,
onSendPtt: (pressed) => rtc.sendJson({ type: "voice-ptt", pressed }),
onBootstrap: rtc.connect,
});
const effectiveAgentState = agentStateOverride ?? rtc.agentState;
useEffect(() => {
document.addEventListener("pointerdown", handlePointerDown, { passive: false });
document.addEventListener("pointerup", handlePointerUp, { passive: false });
document.addEventListener("pointercancel", handlePointerUp, { passive: false });
return () => {
document.removeEventListener("pointerdown", handlePointerDown);
document.removeEventListener("pointerup", handlePointerUp);
document.removeEventListener("pointercancel", handlePointerUp);
};
}, [handlePointerDown, handlePointerUp]);
const handleReset = useCallback(async () => {
await rtc.connect();
rtc.sendJson({ type: "command", command: "reset" });
}, [rtc]);
const handleChoice = useCallback(
(requestId: string, value: string) => {
rtc.sendJson({ type: "ui-response", request_id: requestId, value });
},
[rtc],
);
return (
<>
{}}
onPointerUp={() => {}}
/>
>
);
}