From 48d8ed8aaf3b67b392a6ef57a46ca129b5fd2fa6 Mon Sep 17 00:00:00 2001 From: Kartikeya <176560021+karti-ai@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:44:18 -0700 Subject: [PATCH] feat(frontend): team + engineer dropdowns on join screen Replace free-text name/pod inputs with select-only dropdowns (pick a team, then yourself from its members) for fast R&D iteration. Demo teams live in lib/teams.ts until pods are persisted. Co-Authored-By: Claude Opus 4.8 --- frontend/src/App.tsx | 70 +++++++++++++++++++++++++++------------ frontend/src/lib/teams.ts | 31 +++++++++++++++++ 2 files changed, 80 insertions(+), 21 deletions(-) create mode 100644 frontend/src/lib/teams.ts diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index f8adf28..60063a4 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,20 +1,28 @@ -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import type { Room } from 'livekit-client'; import { joinPod } from './lib/pod.js'; +import { TEAMS } from './lib/teams.js'; export default function App() { - const [podId, setPodId] = useState('demo-pod'); - const [name, setName] = useState(''); + const [teamId, setTeamId] = useState(TEAMS[0]!.id); + const team = useMemo(() => TEAMS.find((t) => t.id === teamId) ?? TEAMS[0]!, [teamId]); + const [member, setMember] = useState(team.members[0]!); const [room, setRoom] = useState(null); const [error, setError] = useState(null); const [connecting, setConnecting] = useState(false); + function handleTeamChange(id: string) { + setTeamId(id); + const next = TEAMS.find((t) => t.id === id); + if (next) setMember(next.members[0]!); + } + async function handleJoin() { setError(null); setConnecting(true); try { - const identity = `${name || 'engineer'}-${Math.random().toString(36).slice(2, 7)}`; - setRoom(await joinPod(podId, identity, name || identity)); + const identity = `${member}-${Math.random().toString(36).slice(2, 7)}`; + setRoom(await joinPod(team.id, identity, member)); } catch (err) { setError((err as Error).message); } finally { @@ -33,29 +41,49 @@ export default function App() { {room ? (
-

Connected to “{podId}”.

+

+ {member} connected to “{team.name}”. +

Sharing screen + mic. PodMan is watching.

) : ( -
- setName(e.target.value)} - /> - setPodId(e.target.value)} - /> +
+ + + + {error &&

{error}

}
diff --git a/frontend/src/lib/teams.ts b/frontend/src/lib/teams.ts new file mode 100644 index 0000000..175dff1 --- /dev/null +++ b/frontend/src/lib/teams.ts @@ -0,0 +1,31 @@ +/** + * Hardcoded teams/engineers for R&D so the join screen is select-only (no typing) + * while we develop. Swap for real data (backend/Atlas) once pods are persisted. + */ +export interface DemoTeam { + id: string; + name: string; + repo: string; + members: string[]; +} + +export const TEAMS: DemoTeam[] = [ + { + id: 'demo-pod', + name: 'Demo Pod', + repo: 'karti-ai/podman', + members: ['Karti', 'Yahya', 'Ramis', 'Zander', 'Shakthi'], + }, + { + id: 'frontend-squad', + name: 'Frontend Squad', + repo: 'karti-ai/podman', + members: ['Karti', 'Zander'], + }, + { + id: 'backend-squad', + name: 'Backend Squad', + repo: 'karti-ai/podman', + members: ['Yahya', 'Ramis'], + }, +];