fix: resolve LiveKit voice/video stability issues

- Guard Disconnected/ConnectionStateChanged event handlers against stale rooms:
  old room events no longer nuke the new room's state (root cause of buttons
  failing, mute getting stuck, DUPLICATE_IDENTITY cascades)
- Reset media state (isMuted/isCameraOn/isScreenSharing) on connect to prevent
  desync after reconnects
- Add voiceStates to WS ready payload so users see who's in voice on page load
- Wire VoiceControls buttons to check getActiveRoom() before SDK calls
- Guard ChannelSidebar against re-joining the same voice channel
- Switch LIVEKIT_URL to wss://nova.ddns.net/livekit for HTTPS secure context
  (required for getUserMedia in Safari)
This commit is contained in:
Jannis Braun
2026-02-18 07:52:25 +01:00
parent 5ef502f2e3
commit 4f65ea9c86
27 changed files with 573 additions and 143 deletions
@@ -38,13 +38,10 @@ export function AppLayout() {
const currentVoiceChannelId = useVoiceStore((s) => s.currentVoiceChannelId);
const setParticipants = useVoiceStore((s) => s.setParticipants);
const {
connect: connectVoice,
disconnect: disconnectVoice,
const {
connect: connectVoice,
disconnect: disconnectVoice,
participants: voiceParticipants,
toggleMic,
toggleCamera,
toggleScreenShare
} = useLiveKit();
// Initialize WebSocket
@@ -118,11 +115,7 @@ export function AppLayout() {
{/* Server sidebar - always visible on desktop, toggled on mobile */}
<div className={`${isMobile ? `fixed z-40 h-full transition-transform ${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}` : 'flex h-full'}`}>
<ServerSidebar />
<ChannelSidebar
onToggleMic={toggleMic}
onToggleCamera={toggleCamera}
onToggleScreenShare={toggleScreenShare}
/>
<ChannelSidebar />
</div>
{/* Main content area */}