Phase 2 frontend: voice store, VoiceChannel, VoicePanel, VoiceControls

Frontend:
- stores/voice.ts: Zustand store for voice state (join, leave, mute, deafen, video, screen share)
- VoiceChannel.tsx: sidebar item showing 🔊 channel name with participant count
- VoicePanel.tsx: box-drawn frame with participant list and controls
- VoiceControls.tsx: [m] mute, [d] deafen, [cam] video, [share] screen, [x] disconnect
- ChannelList.tsx: integrated VoiceChannel for voice-type channels
- Layout.tsx: added VoicePanel above chat area

Deps:
- Added livekit-client, @livekit/components-react
- NODE_ENV fix for dev deps installation
This commit is contained in:
2026-06-28 16:26:19 -04:00
parent 8ee0ce657f
commit f694301ca7
9 changed files with 538 additions and 41 deletions
+7 -1
View File
@@ -4,6 +4,7 @@ import { useAuthStore } from '../stores/auth.ts';
import { ServerBar } from './ServerBar.tsx';
import { ChannelList } from './ChannelList.tsx';
import { MemberList } from './MemberList.tsx';
import { VoicePanel } from './VoicePanel.tsx';
export function Layout() {
const isAuthenticated = useAuthStore((state) => state.isAuthenticated);
@@ -54,7 +55,12 @@ export function Layout() {
<ServerBar />
<ChannelList />
<div className="flex-1 min-w-0 flex flex-col">
<Outlet />
<div className="flex-1 min-h-0 flex flex-col overflow-hidden">
<VoicePanel />
<div className="flex-1 min-h-0">
<Outlet />
</div>
</div>
</div>
<MemberList />
</div>