| 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, |
| } |
| } |
|
|