/** * Copyright (c) Double Symmetry GmbH * Commercial use requires a license. See https://rntp.dev/pricing */ import { useEffect, useState } from 'react'; import { AppState } from 'react-native'; import * as TrackPlayer from '../audio'; import { Event } from '../events'; import type { MediaItem } from '../interfaces'; /** * Active media item; refreshes on {@link Event.MediaItemTransition} and * {@link Event.MediaMetadataChanged} (after native merges stream metadata). */ export function useActiveMediaItem(): MediaItem | null { const [item, setItem] = useState(() => TrackPlayer.getActiveMediaItem() ); useEffect(() => { const transitionSub = TrackPlayer.addEventListener( Event.MediaItemTransition, (event) => { setItem(event.item); } ); const metadataSub = TrackPlayer.addEventListener( Event.MediaMetadataChanged, () => { setItem(TrackPlayer.getActiveMediaItem()); } ); // Android background changes bypass addEventListener (they reach the // headless handler instead), so re-read native state on foreground. const appStateSub = AppState.addEventListener('change', (status) => { if (status === 'active') setItem(TrackPlayer.getActiveMediaItem()); }); return () => { transitionSub.remove(); metadataSub.remove(); appStateSub.remove(); }; }, []); return item; }