增加一起听功能

This commit is contained in:
mtvpls
2026-05-27 22:57:59 +08:00
parent 540614cef9
commit 23290f027b
9 changed files with 1167 additions and 22 deletions
+110
View File
@@ -9,6 +9,7 @@ import type {
ChatMessage,
LiveState,
Member,
MusicState,
PlayState,
Room,
RoomType,
@@ -333,6 +334,66 @@ export function useWatchRoom(
sock.emit('screen:stop');
}, [isOwner]);
const changeMusic = useCallback(
(state: MusicState) => {
const sock = watchRoomSocketManager.getSocket();
if (!sock || !isOwner) return;
sock.emit('music:change', state);
},
[isOwner]
);
const updateMusicState = useCallback(
(state: MusicState) => {
const sock = watchRoomSocketManager.getSocket();
if (!sock || !isOwner) return;
sock.emit('music:update', state);
},
[isOwner]
);
const updateMusicQueue = useCallback(
(state: MusicState) => {
const sock = watchRoomSocketManager.getSocket();
if (!sock || !isOwner) return;
sock.emit('music:queue', state);
},
[isOwner]
);
const playMusic = useCallback(
(state: MusicState) => {
const sock = watchRoomSocketManager.getSocket();
if (!sock || !isOwner) return;
sock.emit('music:play', state);
},
[isOwner]
);
const pauseMusic = useCallback(
(state: MusicState) => {
const sock = watchRoomSocketManager.getSocket();
if (!sock || !isOwner) return;
sock.emit('music:pause', state);
},
[isOwner]
);
const seekMusic = useCallback(
(state: MusicState) => {
const sock = watchRoomSocketManager.getSocket();
if (!sock || !isOwner) return;
sock.emit('music:seek', state);
},
[isOwner]
);
// 清除房间播放状态(房主离开播放/直播页面时调用)
const clearRoomState = useCallback(() => {
const sock = watchRoomSocketManager.getSocket();
@@ -417,6 +478,43 @@ export function useWatchRoom(
}
});
const handleMusicState = (state: MusicState) => {
if (currentRoom) {
setCurrentRoom((prev) => (prev ? { ...prev, currentState: state } : null));
}
};
socket.on('music:change', handleMusicState);
socket.on('music:update', handleMusicState);
socket.on('music:queue', handleMusicState);
socket.on('music:play', (state) => {
setCurrentRoom((prev) => {
if (!prev || prev.currentState?.type !== 'music') return prev;
return {
...prev,
currentState: { ...prev.currentState, ...state, isPlaying: true },
};
});
});
socket.on('music:pause', (state) => {
setCurrentRoom((prev) => {
if (!prev || prev.currentState?.type !== 'music') return prev;
return {
...prev,
currentState: { ...prev.currentState, ...state, isPlaying: false },
};
});
});
socket.on('music:seek', (state) => {
setCurrentRoom((prev) => {
if (!prev || prev.currentState?.type !== 'music') return prev;
return {
...prev,
currentState: { ...prev.currentState, ...state },
};
});
});
// 聊天事件
socket.on('chat:message', (message) => {
setChatMessages((prev) => [...prev, message]);
@@ -456,6 +554,12 @@ export function useWatchRoom(
socket.off('live:change');
socket.off('screen:start');
socket.off('screen:stop');
socket.off('music:change');
socket.off('music:update');
socket.off('music:queue');
socket.off('music:play');
socket.off('music:pause');
socket.off('music:seek');
socket.off('chat:message');
socket.off('state:cleared');
socket.off('connect');
@@ -494,6 +598,12 @@ export function useWatchRoom(
changeLiveChannel,
startScreenShare,
stopScreenShare,
changeMusic,
updateMusicState,
updateMusicQueue,
playMusic,
pauseMusic,
seekMusic,
clearRoomState,
};
}