import { useStore } from '@app/state/store' import { getQueue, selectTrackPlayer, trackPlayerCommands } from '@app/state/trackplayer' import TrackPlayer from 'react-native-track-player' export const usePlay = () => { return () => trackPlayerCommands.enqueue(() => TrackPlayer.play()) } export const usePause = () => { return () => trackPlayerCommands.enqueue(() => TrackPlayer.pause()) } export const usePrevious = () => { return () => trackPlayerCommands.enqueue(async () => { const [current] = await Promise.all([await TrackPlayer.getCurrentTrack(), await getQueue()]) if (current > 0) { await TrackPlayer.skipToPrevious() } else { await TrackPlayer.seekTo(0) } await TrackPlayer.play() }) } export const useNext = () => { return () => trackPlayerCommands.enqueue(async () => { const [current, queue] = await Promise.all([await TrackPlayer.getCurrentTrack(), await getQueue()]) if (current >= queue.length - 1) { await TrackPlayer.skip(0) await TrackPlayer.pause() } else { await TrackPlayer.skipToNext() await TrackPlayer.play() } }) } export const useSkipTo = () => { return (track: number) => trackPlayerCommands.enqueue(async () => { const queue = await getQueue() if (track < 0 || track >= queue.length) { return } await TrackPlayer.skip(track) await TrackPlayer.play() }) } export const useSeekTo = () => { return (position: number) => trackPlayerCommands.enqueue(async () => { await TrackPlayer.seekTo(position) }) } export const useReset = (enqueue = true) => { const resetStore = useStore(selectTrackPlayer.resetTrackPlayerState) const reset = async () => { await TrackPlayer.reset() resetStore() } return enqueue ? () => trackPlayerCommands.enqueue(reset) : reset } export const useIsPlaying = (contextId: string | undefined, track: number) => { const queueContextId = useStore(selectTrackPlayer.queueContextId) const currentTrackIdx = useStore(selectTrackPlayer.currentTrackIdx) const shuffleOrder = useStore(selectTrackPlayer.shuffleOrder) if (contextId === undefined) { return track === currentTrackIdx } if (shuffleOrder) { const shuffledTrack = shuffleOrder.findIndex(i => i === track) track = shuffledTrack !== undefined ? shuffledTrack : -1 } return contextId === queueContextId && track === currentTrackIdx }