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,
LiveKitRoom,
LocalUserChoices,
useRoomContext,
} from '@livekit/components-react';
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 { useToken } from '../utils/useToken';
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 = {
userChoices: LocalUserChoices;
roomName: string;
@ -55,6 +68,8 @@ export const ActiveRoom: React.FC<ActiveRoomProps> = React.memo((props) => {
onDisconnected={onLeave}
>
<VideoConference chatMessageFormatter={formatChatMessageLinks} />
<UpdateRoom />
</LiveKitRoom>
) : (
<LoadingSpinner />

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

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

Loading…
Cancel
Save