55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import TrackPlayer, { Event } from 'react-native-track-player';
|
|
import { usePlayer } from '../store';
|
|
import { loadAndPlay } from './useAudio';
|
|
|
|
export async function PlaybackService() {
|
|
TrackPlayer.addEventListener(Event.RemotePlay, () => TrackPlayer.play());
|
|
TrackPlayer.addEventListener(Event.RemotePause, () => TrackPlayer.pause());
|
|
|
|
TrackPlayer.addEventListener(Event.RemoteNext, async () => {
|
|
const state = usePlayer.getState();
|
|
const ni = state.nextTrack();
|
|
state.setIndex(ni);
|
|
const track = state.queue[ni];
|
|
if (track) await loadAndPlay(track).catch(console.error);
|
|
});
|
|
|
|
TrackPlayer.addEventListener(Event.RemotePrevious, async () => {
|
|
const state = usePlayer.getState();
|
|
const progress = await TrackPlayer.getProgress();
|
|
if (progress.position > 3) {
|
|
await TrackPlayer.seekTo(0);
|
|
return;
|
|
}
|
|
const pi = state.prevTrack();
|
|
state.setIndex(pi);
|
|
const track = state.queue[pi];
|
|
if (track) await loadAndPlay(track).catch(console.error);
|
|
});
|
|
|
|
TrackPlayer.addEventListener(Event.RemoteSeek, ({ position }) =>
|
|
TrackPlayer.seekTo(position),
|
|
);
|
|
|
|
TrackPlayer.addEventListener(Event.PlaybackQueueEnded, async () => {
|
|
const state = usePlayer.getState();
|
|
const prevIdx = state.index;
|
|
|
|
if (state.repeat === 2) {
|
|
await TrackPlayer.seekTo(0);
|
|
await TrackPlayer.play();
|
|
return;
|
|
}
|
|
|
|
const ni = state.nextTrack();
|
|
state.setIndex(ni);
|
|
|
|
if (ni === prevIdx) {
|
|
state.setPlaying(false);
|
|
return;
|
|
}
|
|
|
|
const track = state.queue[ni];
|
|
if (track) await loadAndPlay(track).catch(console.error);
|
|
});
|
|
}
|