File size: 1,679 Bytes
00a912e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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,
}
}
|