
npm install @tencentcloud/roomkit-web-react tuikit-atomicx-react @tencentcloud/uikit-base-component-react @tencentcloud/universal-api
pnpm install @tencentcloud/roomkit-web-react tuikit-atomicx-react @tencentcloud/uikit-base-component-react @tencentcloud/universal-api
yarn add @tencentcloud/roomkit-web-react tuikit-atomicx-react @tencentcloud/uikit-base-component-react @tencentcloud/universal-api
import { UIKitProvider } from '@tencentcloud/uikit-base-component-react';import { ConferenceMainView } from '@tencentcloud/roomkit-web-react';export default function App() {return (<UIKitProvider theme="light" language="zh-CN"><ConferenceMainView /></UIKitProvider>);}
conference.login, call conference.setSelfInfo to set the user's display name and avatar, which appear in the participant video area and member list.import { useEffect } from 'react';import { conference } from '@tencentcloud/roomkit-web-react';// Replace these values with your actual business data and SDKAppID from the Consoleconst SDKAppID = 0;const userId = 'your_user_id';const userSig = 'your_dynamic_user_sig';const userName = 'Display Name';function LoginComponent() {useEffect(() => {const init = async () => {try {// 1. Log in to the SDKawait conference.login({sdkAppId: SDKAppID,userId,userSig,});// 2. (Optional) Set user profileawait conference.setSelfInfo({userName,avatarUrl: 'https://your-avatar-url.com/image.png',});} catch (error) {console.error('TUIRoomKit login failed:', error);}};init();}, []);return null;}
conference.login may not have executed when the room page loads. Use useEffect to monitor loginUserInfo?.userId; when this field is non-empty, TUIRoomKit is considered successfully authenticated.import { useEffect } from 'react';import { useLoginState } from 'tuikit-atomicx-react/room';import { conference } from '@tencentcloud/roomkit-web-react';function RoomPage() {const { loginUserInfo } = useLoginState();useEffect(() => {if (loginUserInfo?.userId) {conference.createAndJoinRoom({ roomId: '123456' });}}, [loginUserInfo?.userId]);return null;}
conference.createAndJoinRoom to create and enter the room.import { conference } from '@tencentcloud/roomkit-web-react';const startQuickMeeting = async () => {// 1. Generate a unique Room IDconst myRoomId = `room_${Date.now()}`;// 2. Create and join the roomawait conference.createAndJoinRoom({roomId: myRoomId,options: {roomName: 'My Quick Meeting',},});};
scheduleRoom API with Meeting Time and other parameters. Upon success, meeting information is synced to each Participant's Meeting List. import { useRoomState } from 'tuikit-atomicx-react/room';function ScheduleDemo() {const { scheduleRoom } = useRoomState();const createSchedule = async () => {try {// Room ID must be a string and unique; backend generation is recommended.const roomId = '123456';// Note: Timestamp must be in seconds (Date.getTime() returns milliseconds, so divide by 1000)const startTime = Math.floor(new Date().getTime() / 1000) + 3600; // Starts in 1 hourconst duration = 1800; // 30 minutesconst options = {roomName: 'Product Requirements Review',scheduleStartTime: startTime, // secondsscheduleEndTime: startTime + duration, // secondsscheduleAttendees: ['userA', 'userB'], // Participant IDspassword: '123', // optional: meeting password};await scheduleRoom({ roomId, options });} catch (error) {console.error('Scheduling failed', error);}};return <button onClick={createSchedule}>Schedule Meeting</button>;}
POST /v4/room_engine_http_srv/create_room{"roomId": "your-room-id","roomName": "Meeting Name","startTime": 1710000000,"endTime": 1710003600,"invitees": ["userId1", "userId2"]}
conference.joinRoom to join.import { conference } from '@tencentcloud/roomkit-web-react';const joinExistingMeeting = async (sharedRoomId: string) => {await conference.joinRoom({roomId: sharedRoomId,});};
getScheduledRoomList API from useRoomState to fetch the user's scheduled meetings and render them in the UI. When the user clicks a meeting, retrieve its Room ID and call conference.joinRoom.import { useState, useEffect } from 'react';import { conference } from '@tencentcloud/roomkit-web-react';import { useRoomState, useLoginState } from 'tuikit-atomicx-react/room';interface RoomInfo {roomId: string;roomName?: string;}export default function ScheduledRoomList() {const { getScheduledRoomList } = useRoomState();const { loginUserInfo } = useLoginState();const [roomList, setRoomList] = useState<RoomInfo[]>([]);// 1. Wait for authentication before fetching Meeting ListuseEffect(() => {if (!loginUserInfo?.userId) return;getScheduledRoomList({ cursor: '' }).then(({ scheduledRoomList }) => setRoomList(scheduledRoomList || [])).catch((error) => console.error('Failed to get scheduled meeting list:', error));}, [loginUserInfo?.userId]);// 2. Join room on clickconst handleJoinRoom = async (roomId: string) => {try {await conference.joinRoom({ roomId });} catch (error) {console.error(`Failed to join meeting (${roomId}):`, error);}};return (<div><h3>My Scheduled Meetings</h3>{roomList.length > 0 ? (<ul style={{ padding: 0, listStyle: 'none' }}>{roomList.map((room) => (<li key={room.roomId} style={{ display: 'flex', justifyContent: 'space-between', padding: '10px', borderBottom: '1px solid #eee' }}><div style={{ display: 'flex', flexDirection: 'column', fontSize: '14px', color: '#666' }}><b style={{ fontSize: '16px', color: '#333' }}>{room.roomName || 'Unnamed Meeting'}</b><span>Room ID: {room.roomId}</span></div><buttononClick={() => handleJoinRoom(room.roomId)}style={{ background: '#006eff', color: '#fff', border: 'none', padding: '6px 12px', borderRadius: '4px', cursor: 'pointer' }}>Join Meeting</button></li>))}</ul>) : (<div>No scheduled meetings to join</div>)}</div>);}
conference.createAndJoinRoom to enter.import { conference } from '@tencentcloud/roomkit-web-react';const enterDualMeeting = async (bizOrderId: string) => {// No need to check if the room exists; SDK handles creation and entry automaticallyawait conference.createAndJoinRoom({roomId: bizOrderId,options: {roomName: `Business Communication: ${bizOrderId}`,},});};
conference.createAndJoinRoom API automatically handles "create if not exists (become Host), join if exists (become Participant)", resolving state conflicts under high concurrency.leaveRoom() to exit the meeting. The room remains active for other members.import { conference } from '@tencentcloud/roomkit-web-react';await conference.leaveRoom();
endRoom(), all members receive a notification that the room has ended.import { conference } from '@tencentcloud/roomkit-web-react';await conference.endRoom();
endRoom() after successfully entering the room. Calling as a non-host or before entering will result in an error.import { useEffect } from 'react';import { ConferenceMainView, conference, RoomEvent } from '@tencentcloud/roomkit-web-react';export default function MeetingRoom() {useEffect(() => {const backToHome = () => {};const backToLogin = () => {};conference.on(RoomEvent.ROOM_DISMISS, backToHome);conference.on(RoomEvent.ROOM_LEAVE, backToHome);conference.on(RoomEvent.ROOM_ERROR, backToHome);conference.on(RoomEvent.KICKED_OUT, backToHome);conference.on(RoomEvent.KICKED_OFFLINE, backToLogin);conference.on(RoomEvent.USER_SIG_EXPIRED, backToLogin);return () => {conference.off(RoomEvent.ROOM_DISMISS, backToHome);conference.off(RoomEvent.ROOM_LEAVE, backToHome);conference.off(RoomEvent.ROOM_ERROR, backToHome);conference.off(RoomEvent.KICKED_OUT, backToHome);conference.off(RoomEvent.KICKED_OFFLINE, backToLogin);conference.off(RoomEvent.USER_SIG_EXPIRED, backToLogin);};}, []);return <ConferenceMainView />;}
Event | Trigger Timing | Recommended Handling |
RoomEvent.ROOM_DISMISS | Room ended, triggered for all members | Return to home or Meeting List |
RoomEvent.ROOM_LEAVE | User clicks "Leave" in TUIRoomKit UI | Return to home or Meeting List |
RoomEvent.ROOM_ERROR | Entry failure or unhandled error | Return to home or Meeting List |
RoomEvent.KICKED_OUT | Kicked out by Host | Return to home or Meeting List |
RoomEvent.KICKED_OFFLINE | Same account logged in elsewhere, current device forced offline | Redirect to login page |
RoomEvent.USER_SIG_EXPIRED | UserSig expired | Redirect to login page |
npm run dev
pnpm run dev
yarn run dev

UIKitProvider parameters in App.vue.UIKitProvider Parameter | Optional Values | Default Value |
theme | "light" | "dark" | "dark" |
language | "zh-CN" | "en-US" | "en-US" |
import { UIKitProvider } from '@tencentcloud/uikit-base-component-react';export default function App() {return (<UIKitProvider theme="light" language="zh-CN">{/* Route or page content */}</UIKitProvider>);}


conference.setFeatureConfig after successfully joining or creating a room, ensuring Room ID is available.import { conference } from '@tencentcloud/roomkit-web-react';// Call after conference.createAndJoinRoom / conference.joinRoom succeeds, when roomId is knownconst roomId = '123456';conference.setFeatureConfig({shareLink: `https://your-domain.com/room?roomId=${roomId}`,});
conference.setFeatureConfig.import { RoomLayoutTemplate } from 'tuikit-atomicx-react/room';import { conference } from '@tencentcloud/roomkit-web-react';// Option 1: Set Sidebar Layout as defaultconference.setFeatureConfig({ layoutTemplate: RoomLayoutTemplate.SidebarLayout });// Option 2: Set Top Bar Layout as defaultconference.setFeatureConfig({ layoutTemplate: RoomLayoutTemplate.CinemaLayout });
conference.endRoom()// Enable microphone, camera, screen sharing, fullscreen permissions<iframe src="https://your-domain.com/index.html" allow="microphone; camera; display-capture; display; fullscreen;">
// Set intranet proxy parameters before entering the roomimport TUIRoomEngine from '@tencentcloud/tuiroom-engine-js';import { useRoomEngine } from 'tuikit-atomicx-react/room';const roomEngine = useRoomEngine();TUIRoomEngine.once('ready', () => {const trtcCloud = roomEngine.instance?.getTRTCCloud();trtcCloud.callExperimentalAPI(JSON.stringify({api: 'setNetworkProxy',params: {websocketProxy: "wss://proxy.example.com/ws/",turnServer: [{url: '14.3.3.3:3478',username: 'turn',credential: 'turn',}],iceTransportPolicy: 'relay',},}));});
./src/components/RoomKitnode ./node_modules/@tencentcloud/roomkit-web-react/scripts/eject.js
./src/components/RoomKit. Enter 'y' to customize the copy directory, or 'n' otherwise.
ConferenceMainView component and conference object from the npm package address to the RoomKit source path.import { ConferenceMainView, conference } from '@tencentcloud/roomkit-web-react';// Change import path to the actual TUIRoomKit source pathimport { ConferenceMainView, conference } from './components/RoomKit/index.ts';
.eslintignore to ignore ESLint checks.// Replace with the actual TUIRoomKit source pathsrc/components/RoomKit
Was this page helpful?
You can also Contact sales or Submit a Ticket for help.
Help us improve! Rate your documentation experience in 5 mins.
Feedback