ghp / packages /client /src /hooks /useRoom.ts
QSLY's picture
deploy: build Hugging Face Space from source
00a912e
Raw
History Blame Contribute Delete
1.83 kB
import { useSocketContext } from '@/providers/socket-context'
import { resetAllRoomState } from '@/lib/resetStores'
import { storage } from '@/lib/storage'
import { EVENTS } from '@music-together/shared'
import { useCallback } from 'react'
import { useRoomStore } from '@/stores/roomStore'
import { useRoomState } from './room/useRoomState'
import { useChatSync } from './room/useChatSync'
import { useQueueSync } from './room/useQueueSync'
import { useAuthSync } from './room/useAuthSync'
import { useConnectionGuard } from './room/useConnectionGuard'
/**
* Composition hook that wires up all room-related socket event listeners.
* Sub-hooks are split by responsibility for maintainability.
* The public API (leaveRoom, updateSettings, setUserRole) remains unchanged.
*/
export function useRoom() {
const { socket } = useSocketContext()
// Sub-hooks handle their own event listeners
useRoomState()
useChatSync()
useQueueSync()
useAuthSync()
useConnectionGuard()
const leaveRoom = useCallback(() => {
const roomId = useRoomStore.getState().room?.id
if (roomId) storage.clearRejoinToken(roomId)
socket.emit(EVENTS.ROOM_LEAVE)
resetAllRoomState()
}, [socket])
const updateSettings = useCallback(
(settings: {
name?: string
password?: string | null
audioQuality?: import('@music-together/shared').AudioQuality
hidden?: boolean
permanent?: boolean
allowTemporaryAdminTrackRemoval?: boolean
allowTemporaryAdminQueueClear?: boolean
}) => {
socket.emit(EVENTS.ROOM_SETTINGS, settings)
},
[socket],
)
const setUserRole = useCallback(
(userId: string, role: 'admin' | 'member') => {
socket.emit(EVENTS.ROOM_SET_ROLE, { userId, role })
},
[socket],
)
return { leaveRoom, updateSettings, setUserRole }
}