feat: add leave pre room when join new room

pull/105/merge
moonrailgun 2 years ago
parent 3a56d13da7
commit fe3b68fb75

@ -3,13 +3,26 @@ import {
formatChatMessageLinks, formatChatMessageLinks,
LiveKitRoom, LiveKitRoom,
LocalUserChoices, LocalUserChoices,
useRoomContext,
} from '@livekit/components-react'; } from '@livekit/components-react';
import { RoomOptions, VideoPresets } from 'livekit-client'; import { RoomOptions, VideoPresets } from 'livekit-client';
import React, { useMemo } from 'react'; import React, { useEffect, useMemo } from 'react';
import { useLivekitState } from '../store/useLivekitState';
import { useServerUrl } from '../utils/useServerUrl'; import { useServerUrl } from '../utils/useServerUrl';
import { useToken } from '../utils/useToken'; import { useToken } from '../utils/useToken';
import { VideoConference } from './lib/VideoConference'; import { VideoConference } from './lib/VideoConference';
const UpdateRoom: React.FC = React.memo(() => {
const room = useRoomContext();
useEffect(() => {
useLivekitState.setState({ activeRoom: room });
}, [room]);
return null;
});
UpdateRoom.displayName = 'UpdateRoom';
type ActiveRoomProps = { type ActiveRoomProps = {
userChoices: LocalUserChoices; userChoices: LocalUserChoices;
roomName: string; roomName: string;
@ -55,6 +68,8 @@ export const ActiveRoom: React.FC<ActiveRoomProps> = React.memo((props) => {
onDisconnected={onLeave} onDisconnected={onLeave}
> >
<VideoConference chatMessageFormatter={formatChatMessageLinks} /> <VideoConference chatMessageFormatter={formatChatMessageLinks} />
<UpdateRoom />
</LiveKitRoom> </LiveKitRoom>
) : ( ) : (
<LoadingSpinner /> <LoadingSpinner />

@ -22,7 +22,9 @@ const _LivekitView: React.FC<LivekitViewProps> = React.memo((props) => {
console.log('error while setting up prejoin', err); console.log('error while setting up prejoin', err);
}); });
const handleJoin = useEvent((userChoices: LocalUserChoices) => { const handleJoin = useEvent(async (userChoices: LocalUserChoices) => {
await setDeactive(); // 先退出之前的房间
setPreJoinChoices(userChoices); setPreJoinChoices(userChoices);
setActive(props.url); setActive(props.url);
}); });

@ -1,27 +1,36 @@
import type { Room } from 'livekit-client';
import { create } from 'zustand'; import { create } from 'zustand';
import { immer } from 'zustand/middleware/immer'; import { immer } from 'zustand/middleware/immer';
interface LivekitState { interface LivekitState {
isActive: boolean; isActive: boolean;
url: string; url: string;
activeRoom: Room | null;
setActive: (url: string) => void; setActive: (url: string) => void;
setDeactive: () => void; setDeactive: () => Promise<void>;
} }
export const useLivekitState = create<LivekitState>()( export const useLivekitState = create<LivekitState>()(
immer((set) => ({ immer((set, get) => ({
isActive: false, isActive: false,
url: '', url: '',
activeRoom: null,
setActive(url) { setActive(url) {
set((state) => { set((state) => {
state.isActive = true; state.isActive = true;
state.url = url; state.url = url;
}); });
}, },
setDeactive() { async setDeactive() {
const { activeRoom } = get();
if (activeRoom) {
await activeRoom.disconnect(true);
}
set((state) => { set((state) => {
state.isActive = false; state.isActive = false;
state.url = ''; state.url = '';
state.activeRoom = null;
}); });
}, },
})) }))

Loading…
Cancel
Save