ghp / packages /client /src /hooks /useQueue.ts
QSLY's picture
deploy: build Hugging Face Space from source
00a912e
Raw
History Blame Contribute Delete
1.68 kB
import { useCallback } from 'react'
import { EVENTS, LIMITS, type BilibiliMetadataSource, type Track } from '@music-together/shared'
import { useSocketContext } from '@/providers/socket-context'
export function useQueue() {
const { socket } = useSocketContext()
const addTrack = useCallback((track: Track) => socket.emit(EVENTS.QUEUE_ADD, { track }), [socket])
const insertAfterCurrent = useCallback(
(track: Track) => socket.emit(EVENTS.QUEUE_INSERT_AFTER_CURRENT, { track }),
[socket],
)
const addBatchTracks = useCallback(
(tracks: Track[], playlistName?: string) => {
for (let offset = 0; offset < tracks.length; offset += LIMITS.QUEUE_BATCH_MAX_SIZE) {
socket.emit(EVENTS.QUEUE_ADD_BATCH, {
tracks: tracks.slice(offset, offset + LIMITS.QUEUE_BATCH_MAX_SIZE),
playlistName,
})
}
},
[socket],
)
const removeTrack = useCallback((trackId: string) => socket.emit(EVENTS.QUEUE_REMOVE, { trackId }), [socket])
const reorderTracks = useCallback((trackIds: string[]) => socket.emit(EVENTS.QUEUE_REORDER, { trackIds }), [socket])
const updateBilibiliMetadata = useCallback(
(
trackId: string,
metadata:
| { metadataSource: BilibiliMetadataSource; lyricId?: string; picId?: string; cover: string }
| { clearMetadata: true },
) => socket.emit(EVENTS.QUEUE_UPDATE_METADATA, { trackId, ...metadata }),
[socket],
)
const clearQueue = useCallback(() => socket.emit(EVENTS.QUEUE_CLEAR), [socket])
return {
addTrack,
insertAfterCurrent,
addBatchTracks,
removeTrack,
reorderTracks,
updateBilibiliMetadata,
clearQueue,
}
}