impl repeat mode

fix position not being restored on close/open due to some bad progress updates
This commit is contained in:
austinried
2021-08-04 22:15:16 +09:00
parent a0b49ec75f
commit 9dc1ac451c
4 changed files with 75 additions and 18 deletions

View File

@@ -1,9 +1,16 @@
import { useCoverArtUri } from '@app/hooks/music'
import { Song } from '@app/models/music'
import { useStore } from '@app/state/store'
import { getCurrentTrack, getQueue, selectTrackPlayer, TrackExt, trackPlayerCommands } from '@app/state/trackplayer'
import {
getCurrentTrack,
getQueue,
getRepeatMode,
selectTrackPlayer,
TrackExt,
trackPlayerCommands,
} from '@app/state/trackplayer'
import { useCallback } from 'react'
import TrackPlayer from 'react-native-track-player'
import TrackPlayer, { RepeatMode } from 'react-native-track-player'
export const usePlay = () => {
return () => trackPlayerCommands.enqueue(() => TrackPlayer.play())
@@ -14,14 +21,11 @@ export const usePause = () => {
}
export const usePrevious = () => {
// const setCurrentTrackIdx = useStore(selectTrackPlayer.setCurrentTrackIdx)
return () =>
trackPlayerCommands.enqueue(async () => {
const [current] = await Promise.all([await TrackPlayer.getCurrentTrack(), await getQueue()])
if (current > 0) {
await TrackPlayer.skipToPrevious()
// setCurrentTrackIdx(current - 1)
} else {
await TrackPlayer.seekTo(0)
}
@@ -30,23 +34,44 @@ export const usePrevious = () => {
}
export const useNext = () => {
// const setCurrentTrack = useUpdateAtom(currentTrackAtom)
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()
// setCurrentTrack(queue[0])
} else {
await TrackPlayer.skipToNext()
// setCurrentTrack(queue[current + 1])
await TrackPlayer.play()
}
})
}
export const useToggleRepeat = () => {
const setRepeatMode = useStore(selectTrackPlayer.setRepeatMode)
return () =>
trackPlayerCommands.enqueue(async () => {
const repeatMode = await getRepeatMode()
let nextMode = RepeatMode.Off
switch (repeatMode) {
case RepeatMode.Off:
nextMode = RepeatMode.Queue
break
case RepeatMode.Queue:
nextMode = RepeatMode.Track
break
default:
nextMode = RepeatMode.Off
break
}
await TrackPlayer.setRepeatMode(nextMode)
setRepeatMode(nextMode)
})
}
export const useReset = (enqueue = true) => {
const resetStore = useStore(selectTrackPlayer.reset)