Skip to content

feat: implement frontend for real-time video conference system - #5

Merged
lcl6659 merged 2 commits into
mainfrom
claude/issue-3-20260120-0527
Jan 20, 2026
Merged

feat: implement frontend for real-time video conference system#5
lcl6659 merged 2 commits into
mainfrom
claude/issue-3-20260120-0527

Conversation

@lcl6659

@lcl6659 lcl6659 commented Jan 20, 2026

Copy link
Copy Markdown
Owner

Summary

Implement complete frontend for multi-user video conferencing system based on PRD in #3.

Changes

Core Components

  • VideoTile: Individual video window with status indicators
  • VideoGrid: Responsive grid layout (auto-adjusts 1-4 columns)
  • MediaControls: Mute/video/leave controls with room link sharing

Hooks

  • useMediaDevices: Camera/mic access and permissions handling
  • useWebRTC: WebRTC peer connection management with polling

Pages

  • /room: Room creation and join entry page
  • /room/[roomId]: Main video conference room

API Integration

  • Room join/leave endpoints
  • WebRTC signaling (offer/answer/ICE)
  • Participant status polling (3s interval)

Features

  • Real-time video/audio streaming
  • Auto-join on room entry
  • Permission request flow with error handling
  • Video grid auto-layout based on participant count
  • Media controls (mute, video off, leave)
  • Room link copy functionality

Design

  • Base.org design system (blue primary, no shadows, no borders)
  • Rounded-xl cards and buttons
  • Responsive layout

Closes #3


Generated with Claude Code

Implement complete frontend for multi-user video conferencing based on PRD:

**Core Components**
- VideoTile: Individual video window with status indicators
- VideoGrid: Responsive grid layout (auto-adjusts 1-4 columns)
- MediaControls: Mute/video/leave controls with room link sharing

**Hooks**
- useMediaDevices: Camera/mic access and permissions handling
- useWebRTC: WebRTC peer connection management with polling

**Pages**
- /room: Room creation and join entry page
- /room/[roomId]: Main video conference room

**API Integration**
- Room join/leave endpoints
- WebRTC signaling (offer/answer/ICE)
- Participant status polling (3s interval)

**Features**
- Real-time video/audio streaming
- Auto-join on room entry
- Permission request flow with error handling
- Video grid auto-layout based on participant count
- Media controls (mute, video off, leave)
- Room link copy functionality

**Design**
- Base.org design system (blue primary, no shadows, no borders)
- Rounded-xl cards and buttons
- Responsive layout

**Technical Details**
- WebRTC with Google STUN servers
- Polling-based participant discovery (3s)
- Proper cleanup on unmount
- Local video mirroring
- Muted local audio to prevent feedback

Closes #3

Co-authored-by: Nick Li <lcl6659@users.noreply.github.com>
@vercel

vercel Bot commented Jan 20, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
vibe-engineering Error Error Jan 20, 2026 5:42am

@lcl6659

lcl6659 commented Jan 20, 2026

Copy link
Copy Markdown
Owner Author

/fix

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Build 错误分析完成

发现 若干 个错误:


完整 Build 日志


> frontend@0.1.0 build
> next build

⚠ No build cache found. Please configure build caching for faster rebuilds. Read more: https://nextjs.org/docs/messages/no-cache
Attention: Next.js now collects completely anonymous telemetry regarding usage.
This information is used to shape Next.js' roadmap and prioritize features.
You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
https://nextjs.org/telemetry

▲ Next.js 16.1.1 (Turbopack)
- Experiments (use with caution):
  · optimizePackageImports

  Creating an optimized production build ...

> Build error occurred
Error: Turbopack build failed with 2 errors:
./frontend/lib/api/rooms.ts:6:1
Export request doesn't exist in target module
�[0m �[90m 4 |�[39m �[90m */�[39m
 �[90m 5 |�[39m
�[31m�[1m>�[22m�[39m�[90m 6 |�[39m �[36mimport�[39m { request } �[36mfrom�[39m �[32m"./client"�[39m�[33m;�[39m
 �[90m   |�[39m �[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m
 �[90m 7 |�[39m �[36mimport�[39m type {
 �[90m 8 |�[39m   �[33mJoinRoomRequest�[39m�[33m,�[39m
 �[90m 9 |�[39m   �[33mJoinRoomResponse�[39m�[33m,�[39m�[0m

The export request was not found in module [project]/frontend/lib/api/client.ts [app-client] (ecmascript).
Did you mean to import default?
All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist.

Import traces:
  Client Component Browser:
    ./frontend/lib/api/rooms.ts [Client Component Browser]
    ./frontend/app/room/[roomId]/page.tsx [Client Component Browser]
    ./frontend/app/room/[roomId]/page.tsx [Server Component]

  Client Component SSR:
    ./frontend/lib/api/rooms.ts [Client Component SSR]
    ./frontend/app/room/[roomId]/page.tsx [Client Component SSR]
    ./frontend/app/room/[roomId]/page.tsx [Server Component]


./frontend/lib/api/rooms.ts:6:1
Export request doesn't exist in target module
�[0m �[90m 4 |�[39m �[90m */�[39m
 �[90m 5 |�[39m
�[31m�[1m>�[22m�[39m�[90m 6 |�[39m �[36mimport�[39m { request } �[36mfrom�[39m �[32m"./client"�[39m�[33m;�[39m
 �[90m   |�[39m �[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m�[31m�[1m^�[22m�[39m
 �[90m 7 |�[39m �[36mimport�[39m type {
 �[90m 8 |�[39m   �[33mJoinRoomRequest�[39m�[33m,�[39m
 �[90m 9 |�[39m   �[33mJoinRoomResponse�[39m�[33m,�[39m�[0m

The export request was not found in module [project]/frontend/lib/api/client.ts [app-ssr] (ecmascript).
Did you mean to import default?
All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist.

Import traces:
  Client Component Browser:
    ./frontend/lib/api/rooms.ts [Client Component Browser]
    ./frontend/app/room/[roomId]/page.tsx [Client Component Browser]
    ./frontend/app/room/[roomId]/page.tsx [Server Component]

  Client Component SSR:
    ./frontend/lib/api/rooms.ts [Client Component SSR]
    ./frontend/app/room/[roomId]/page.tsx [Client Component SSR]
    ./frontend/app/room/[roomId]/page.tsx [Server Component]


    at <unknown> (./frontend/lib/api/rooms.ts:6:1)
    at <unknown> (./frontend/lib/api/rooms.ts:6:1)


🤖 正在调用 AI 修复...

@github-actions

github-actions Bot commented Jan 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @lcl6659's task in 1m 17s —— View job


修复 Build 错误 ✅

任务清单

  • 分析错误日志
  • 检查 frontend/lib/api/client.ts 的导出
  • 检查 frontend/lib/api/rooms.ts 的导入
  • 修复导入语句
  • 提交并推送修复

问题分析

错误原因:rooms.ts 尝试从 client.ts 导入不存在的 request 函数。

client.ts 实际导出的是:

  • apiClient - ApiClient 类的单例实例
  • default - ApiClient 类本身

request 方法是 ApiClient 类的成员方法,需要通过 apiClient 实例调用。

修复内容

frontend/lib/api/rooms.ts:6 中:

  • 修改前:import { request } from "./client";
  • 修改后:import { apiClient } from "./client";

并将文件中所有的 request<T>(...) 调用改为 apiClient.request<T>(...)

完成

已提交并推送修复到分支 claude/issue-3-20260120-0527。Build 错误已解决。


Branch |

- Changed import from non-existent 'request' export to 'apiClient' export
- Updated all request() calls to apiClient.request() throughout the file
- Fixes Turbopack build error: Export request doesn't exist in target module

Co-authored-by: Nick Li <lcl6659@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

AI 修复完成!

代码已推送到当前 PR 分支,Vercel 将自动重新部署。

请检查修改是否正确。

@lcl6659

lcl6659 commented Jan 20, 2026

Copy link
Copy Markdown
Owner Author

/fix

@github-actions

Copy link
Copy Markdown
Contributor

Build 成功! 没有发现错误,无需修复。

@lcl6659

lcl6659 commented Jan 20, 2026

Copy link
Copy Markdown
Owner Author

/fix

@github-actions

Copy link
Copy Markdown
Contributor

Build 成功! 没有发现错误,无需修复。

@lcl6659
lcl6659 merged commit 7a670ec into main Jan 20, 2026
4 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

部署成功!

线上地址: https://vibe-engineering-2360msp81-nick-lis-projects-89aa49af.vercel.app

@github-actions github-actions Bot mentioned this pull request Jan 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

视频连线互动项目

1 participant