react-native-nitro-player 0.3.0-alpha.9 → 0.4.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +444 -4
- package/android/build.gradle +4 -1
- package/android/src/main/AndroidManifest.xml +16 -1
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAndroidAutoMediaLibrary.kt +2 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridAudioDevices.kt +8 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridDownloadManager.kt +225 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridEqualizer.kt +105 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridPlayerQueue.kt +6 -6
- package/android/src/main/java/com/margelo/nitro/nitroplayer/HybridTrackPlayer.kt +37 -12
- package/android/src/main/java/com/margelo/nitro/nitroplayer/core/TrackPlayerCore.kt +944 -213
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadDatabase.kt +475 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadFileManager.kt +159 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadManagerCore.kt +489 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/download/DownloadWorker.kt +209 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/equalizer/EqualizerCore.kt +486 -0
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaBrowserService.kt +3 -1
- package/android/src/main/java/com/margelo/nitro/nitroplayer/media/MediaSessionManager.kt +14 -6
- package/android/src/main/java/com/margelo/nitro/nitroplayer/playlist/PlaylistManager.kt +27 -0
- package/ios/HybridDownloadManager.swift +226 -0
- package/ios/HybridEqualizer.swift +111 -0
- package/ios/HybridTrackPlayer.swift +36 -8
- package/ios/core/TrackPlayerCore.swift +996 -288
- package/ios/download/DownloadDatabase.swift +493 -0
- package/ios/download/DownloadFileManager.swift +241 -0
- package/ios/download/DownloadManagerCore.swift +923 -0
- package/ios/equalizer/EqualizerCore.swift +685 -0
- package/ios/media/MediaSessionManager.swift +40 -28
- package/ios/playlist/PlaylistManager.swift +40 -9
- package/ios/queue/HybridPlayerQueue.swift +33 -13
- package/lib/hooks/callbackManager.d.ts +18 -0
- package/lib/hooks/callbackManager.js +66 -0
- package/lib/hooks/downloadCallbackManager.d.ts +36 -0
- package/lib/hooks/downloadCallbackManager.js +108 -0
- package/lib/hooks/equalizerCallbackManager.d.ts +37 -0
- package/lib/hooks/equalizerCallbackManager.js +109 -0
- package/lib/hooks/index.d.ts +16 -0
- package/lib/hooks/index.js +10 -0
- package/lib/hooks/useActualQueue.d.ts +48 -0
- package/lib/hooks/useActualQueue.js +98 -0
- package/lib/hooks/useDownloadActions.d.ts +26 -0
- package/lib/hooks/useDownloadActions.js +117 -0
- package/lib/hooks/useDownloadProgress.d.ts +25 -0
- package/lib/hooks/useDownloadProgress.js +79 -0
- package/lib/hooks/useDownloadStorage.d.ts +19 -0
- package/lib/hooks/useDownloadStorage.js +60 -0
- package/lib/hooks/useDownloadedTracks.d.ts +25 -0
- package/lib/hooks/useDownloadedTracks.js +69 -0
- package/lib/hooks/useEqualizer.d.ts +25 -0
- package/lib/hooks/useEqualizer.js +124 -0
- package/lib/hooks/useEqualizerPresets.d.ts +22 -0
- package/lib/hooks/useEqualizerPresets.js +96 -0
- package/lib/hooks/useNowPlaying.js +32 -19
- package/lib/hooks/useOnChangeTrack.js +15 -12
- package/lib/hooks/useOnPlaybackProgressChange.js +2 -2
- package/lib/hooks/useOnPlaybackStateChange.js +16 -13
- package/lib/hooks/usePlaylist.d.ts +48 -0
- package/lib/hooks/usePlaylist.js +136 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +6 -0
- package/lib/specs/DownloadManager.nitro.d.ts +152 -0
- package/lib/specs/DownloadManager.nitro.js +1 -0
- package/lib/specs/Equalizer.nitro.d.ts +43 -0
- package/lib/specs/Equalizer.nitro.js +1 -0
- package/lib/specs/TrackPlayer.nitro.d.ts +6 -2
- package/lib/types/DownloadTypes.d.ts +110 -0
- package/lib/types/DownloadTypes.js +1 -0
- package/lib/types/EqualizerTypes.d.ts +52 -0
- package/lib/types/EqualizerTypes.js +1 -0
- package/lib/types/PlayerQueue.d.ts +4 -0
- package/nitro.json +8 -0
- package/nitrogen/generated/android/NitroPlayer+autolinking.cmake +10 -1
- package/nitrogen/generated/android/NitroPlayerOnLoad.cpp +32 -2
- package/nitrogen/generated/android/c++/JCurrentPlayingType.hpp +65 -0
- package/nitrogen/generated/android/c++/JDownloadConfig.hpp +92 -0
- package/nitrogen/generated/android/c++/JDownloadError.hpp +71 -0
- package/nitrogen/generated/android/c++/JDownloadErrorReason.hpp +74 -0
- package/nitrogen/generated/android/c++/JDownloadProgress.hpp +79 -0
- package/nitrogen/generated/android/c++/JDownloadQueueStatus.hpp +81 -0
- package/nitrogen/generated/android/c++/JDownloadState.hpp +71 -0
- package/nitrogen/generated/android/c++/JDownloadStorageInfo.hpp +73 -0
- package/nitrogen/generated/android/c++/JDownloadTask.hpp +108 -0
- package/nitrogen/generated/android/c++/JDownloadedPlaylist.hpp +111 -0
- package/nitrogen/generated/android/c++/JDownloadedTrack.hpp +92 -0
- package/nitrogen/generated/android/c++/JEqualizerBand.hpp +69 -0
- package/nitrogen/generated/android/c++/JEqualizerPreset.hpp +78 -0
- package/nitrogen/generated/android/c++/JEqualizerState.hpp +91 -0
- package/nitrogen/generated/android/c++/JFunc_void_DownloadProgress.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_DownloadedTrack.hpp +89 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackItem_std__optional_Reason_.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__std__string__.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_Playlist_std__optional_QueueOperation_.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_DownloadState_std__optional_DownloadError_.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_EqualizerBand_.hpp +97 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Playlist__std__optional_QueueOperation_.hpp +2 -0
- package/nitrogen/generated/android/c++/JGainRange.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.cpp +470 -0
- package/nitrogen/generated/android/c++/JHybridDownloadManagerSpec.hpp +99 -0
- package/nitrogen/generated/android/c++/JHybridEqualizerSpec.cpp +204 -0
- package/nitrogen/generated/android/c++/JHybridEqualizerSpec.hpp +82 -0
- package/nitrogen/generated/android/c++/JHybridPlayerQueueSpec.cpp +2 -0
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.cpp +117 -15
- package/nitrogen/generated/android/c++/JHybridTrackPlayerSpec.hpp +6 -2
- package/nitrogen/generated/android/c++/JPlaybackSource.hpp +62 -0
- package/nitrogen/generated/android/c++/JPlayerState.hpp +11 -3
- package/nitrogen/generated/android/c++/JPlaylist.hpp +2 -0
- package/nitrogen/generated/android/c++/JPresetType.hpp +59 -0
- package/nitrogen/generated/android/c++/JStorageLocation.hpp +59 -0
- package/nitrogen/generated/android/c++/JTrackItem.hpp +9 -3
- package/nitrogen/generated/android/c++/JTrackPlayerState.hpp +3 -3
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadError.hpp +74 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadTask.hpp +84 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedPlaylist.hpp +85 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DownloadedTrack.hpp +80 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Playlist.hpp +2 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_TrackItem.hpp +2 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/CurrentPlayingType.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadConfig.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadError.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadErrorReason.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadProgress.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadQueueStatus.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadState.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadStorageInfo.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadTask.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedPlaylist.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/DownloadedTrack.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerBand.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerPreset.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/EqualizerState.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadProgress.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_DownloadedTrack.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__optional_std__variant_nitro__NullType__std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Func_void_std__vector_EqualizerBand_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/GainRange.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridDownloadManagerSpec.kt +210 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridEqualizerSpec.kt +141 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/HybridTrackPlayerSpec.kt +19 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlaybackSource.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PlayerState.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/PresetType.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/StorageLocation.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackItem.kt +7 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/TrackPlayerState.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_Double.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadError.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadTask.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedPlaylist.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroplayer/Variant_NullType_DownloadedTrack.kt +59 -0
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.cpp +138 -8
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Bridge.hpp +1046 -121
- package/nitrogen/generated/ios/NitroPlayer-Swift-Cxx-Umbrella.hpp +66 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.mm +16 -0
- package/nitrogen/generated/ios/NitroPlayerAutolinking.swift +30 -0
- package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridDownloadManagerSpecSwift.hpp +386 -0
- package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridEqualizerSpecSwift.hpp +223 -0
- package/nitrogen/generated/ios/c++/HybridPlayerQueueSpecSwift.hpp +1 -0
- package/nitrogen/generated/ios/c++/HybridTrackPlayerSpecSwift.hpp +46 -6
- package/nitrogen/generated/ios/swift/CurrentPlayingType.swift +48 -0
- package/nitrogen/generated/ios/swift/DownloadConfig.swift +270 -0
- package/nitrogen/generated/ios/swift/DownloadError.swift +69 -0
- package/nitrogen/generated/ios/swift/DownloadErrorReason.swift +60 -0
- package/nitrogen/generated/ios/swift/DownloadProgress.swift +91 -0
- package/nitrogen/generated/ios/swift/DownloadQueueStatus.swift +102 -0
- package/nitrogen/generated/ios/swift/DownloadState.swift +56 -0
- package/nitrogen/generated/ios/swift/DownloadStorageInfo.swift +80 -0
- package/nitrogen/generated/ios/swift/DownloadTask.swift +315 -0
- package/nitrogen/generated/ios/swift/DownloadedPlaylist.swift +103 -0
- package/nitrogen/generated/ios/swift/DownloadedTrack.swift +147 -0
- package/nitrogen/generated/ios/swift/EqualizerBand.swift +69 -0
- package/nitrogen/generated/ios/swift/EqualizerPreset.swift +70 -0
- package/nitrogen/generated/ios/swift/EqualizerState.swift +115 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadProgress.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadStorageInfo.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_DownloadedTrack.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_PlayerState.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__std__string__.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string_std__string_DownloadState_std__optional_DownloadError_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_EqualizerBand_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_TrackItem_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +47 -0
- package/nitrogen/generated/ios/swift/GainRange.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec.swift +90 -0
- package/nitrogen/generated/ios/swift/HybridDownloadManagerSpec_cxx.swift +705 -0
- package/nitrogen/generated/ios/swift/HybridEqualizerSpec.swift +73 -0
- package/nitrogen/generated/ios/swift/HybridEqualizerSpec_cxx.swift +396 -0
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec.swift +6 -2
- package/nitrogen/generated/ios/swift/HybridTrackPlayerSpec_cxx.swift +105 -8
- package/nitrogen/generated/ios/swift/PlaybackSource.swift +44 -0
- package/nitrogen/generated/ios/swift/PlayerState.swift +13 -2
- package/nitrogen/generated/ios/swift/PresetType.swift +40 -0
- package/nitrogen/generated/ios/swift/StorageLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/TrackItem.swift +31 -1
- package/nitrogen/generated/ios/swift/TrackPlayerState.swift +4 -4
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadError.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadTask.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedPlaylist.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DownloadedTrack.swift +18 -0
- package/nitrogen/generated/shared/c++/CurrentPlayingType.hpp +84 -0
- package/nitrogen/generated/shared/c++/DownloadConfig.hpp +108 -0
- package/nitrogen/generated/shared/c++/DownloadError.hpp +89 -0
- package/nitrogen/generated/shared/c++/DownloadErrorReason.hpp +96 -0
- package/nitrogen/generated/shared/c++/DownloadProgress.hpp +97 -0
- package/nitrogen/generated/shared/c++/DownloadQueueStatus.hpp +99 -0
- package/nitrogen/generated/shared/c++/DownloadState.hpp +92 -0
- package/nitrogen/generated/shared/c++/DownloadStorageInfo.hpp +91 -0
- package/nitrogen/generated/shared/c++/DownloadTask.hpp +122 -0
- package/nitrogen/generated/shared/c++/DownloadedPlaylist.hpp +101 -0
- package/nitrogen/generated/shared/c++/DownloadedTrack.hpp +107 -0
- package/nitrogen/generated/shared/c++/EqualizerBand.hpp +87 -0
- package/nitrogen/generated/shared/c++/EqualizerPreset.hpp +86 -0
- package/nitrogen/generated/shared/c++/EqualizerState.hpp +89 -0
- package/nitrogen/generated/shared/c++/GainRange.hpp +79 -0
- package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.cpp +55 -0
- package/nitrogen/generated/shared/c++/HybridDownloadManagerSpec.hpp +134 -0
- package/nitrogen/generated/shared/c++/HybridEqualizerSpec.cpp +38 -0
- package/nitrogen/generated/shared/c++/HybridEqualizerSpec.hpp +95 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.cpp +4 -0
- package/nitrogen/generated/shared/c++/HybridTrackPlayerSpec.hpp +11 -5
- package/nitrogen/generated/shared/c++/PlaybackSource.hpp +80 -0
- package/nitrogen/generated/shared/c++/PlayerState.hpp +9 -2
- package/nitrogen/generated/shared/c++/PresetType.hpp +76 -0
- package/nitrogen/generated/shared/c++/StorageLocation.hpp +76 -0
- package/nitrogen/generated/shared/c++/TrackItem.hpp +7 -2
- package/nitrogen/generated/shared/c++/TrackPlayerState.hpp +5 -5
- package/package.json +1 -1
- package/src/hooks/callbackManager.ts +87 -0
- package/src/hooks/downloadCallbackManager.ts +149 -0
- package/src/hooks/equalizerCallbackManager.ts +138 -0
- package/src/hooks/index.ts +23 -0
- package/src/hooks/useActualQueue.ts +116 -0
- package/src/hooks/useDownloadActions.ts +179 -0
- package/src/hooks/useDownloadProgress.ts +126 -0
- package/src/hooks/useDownloadStorage.ts +84 -0
- package/src/hooks/useDownloadedTracks.ts +138 -0
- package/src/hooks/useEqualizer.ts +173 -0
- package/src/hooks/useEqualizerPresets.ts +140 -0
- package/src/hooks/useNowPlaying.ts +33 -20
- package/src/hooks/useOnChangeTrack.ts +15 -11
- package/src/hooks/useOnPlaybackProgressChange.ts +2 -2
- package/src/hooks/useOnPlaybackStateChange.ts +19 -15
- package/src/hooks/usePlaylist.ts +161 -0
- package/src/index.ts +12 -0
- package/src/specs/DownloadManager.nitro.ts +203 -0
- package/src/specs/Equalizer.nitro.ts +69 -0
- package/src/specs/TrackPlayer.nitro.ts +6 -2
- package/src/types/DownloadTypes.ts +135 -0
- package/src/types/EqualizerTypes.ts +72 -0
- package/src/types/PlayerQueue.ts +9 -0
|
@@ -3,6 +3,12 @@ import type { TrackItem, TrackPlayerState, Reason } from '../types/PlayerQueue'
|
|
|
3
3
|
|
|
4
4
|
type PlaybackStateCallback = (state: TrackPlayerState, reason?: Reason) => void
|
|
5
5
|
type TrackChangeCallback = (track: TrackItem, reason?: Reason) => void
|
|
6
|
+
type PlaybackProgressCallback = (
|
|
7
|
+
position: number,
|
|
8
|
+
totalDuration: number,
|
|
9
|
+
isManuallySeeked?: boolean
|
|
10
|
+
) => void
|
|
11
|
+
type SeekCallback = (position: number, totalDuration: number) => void
|
|
6
12
|
|
|
7
13
|
/**
|
|
8
14
|
* Internal subscription manager that allows multiple hooks to subscribe
|
|
@@ -12,8 +18,12 @@ type TrackChangeCallback = (track: TrackItem, reason?: Reason) => void
|
|
|
12
18
|
class CallbackSubscriptionManager {
|
|
13
19
|
private playbackStateSubscribers = new Set<PlaybackStateCallback>()
|
|
14
20
|
private trackChangeSubscribers = new Set<TrackChangeCallback>()
|
|
21
|
+
private playbackProgressSubscribers = new Set<PlaybackProgressCallback>()
|
|
22
|
+
private seekSubscribers = new Set<SeekCallback>()
|
|
15
23
|
private isPlaybackStateRegistered = false
|
|
16
24
|
private isTrackChangeRegistered = false
|
|
25
|
+
private isPlaybackProgressRegistered = false
|
|
26
|
+
private isSeekRegistered = false
|
|
17
27
|
|
|
18
28
|
/**
|
|
19
29
|
* Subscribe to playback state changes
|
|
@@ -90,6 +100,83 @@ class CallbackSubscriptionManager {
|
|
|
90
100
|
)
|
|
91
101
|
}
|
|
92
102
|
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Subscribe to playback progress changes
|
|
106
|
+
* @returns Unsubscribe function
|
|
107
|
+
*/
|
|
108
|
+
subscribeToPlaybackProgressChange(
|
|
109
|
+
callback: PlaybackProgressCallback
|
|
110
|
+
): () => void {
|
|
111
|
+
this.playbackProgressSubscribers.add(callback)
|
|
112
|
+
this.ensurePlaybackProgressRegistered()
|
|
113
|
+
|
|
114
|
+
return () => {
|
|
115
|
+
this.playbackProgressSubscribers.delete(callback)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Subscribe to seek events
|
|
121
|
+
* @returns Unsubscribe function
|
|
122
|
+
*/
|
|
123
|
+
subscribeToSeek(callback: SeekCallback): () => void {
|
|
124
|
+
this.seekSubscribers.add(callback)
|
|
125
|
+
this.ensureSeekRegistered()
|
|
126
|
+
|
|
127
|
+
return () => {
|
|
128
|
+
this.seekSubscribers.delete(callback)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private ensurePlaybackProgressRegistered(): void {
|
|
133
|
+
if (this.isPlaybackProgressRegistered) return
|
|
134
|
+
|
|
135
|
+
try {
|
|
136
|
+
TrackPlayer.onPlaybackProgressChange(
|
|
137
|
+
(position, totalDuration, isManuallySeeked) => {
|
|
138
|
+
this.playbackProgressSubscribers.forEach((subscriber) => {
|
|
139
|
+
try {
|
|
140
|
+
subscriber(position, totalDuration, isManuallySeeked)
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error(
|
|
143
|
+
'[CallbackManager] Error in playback progress subscriber:',
|
|
144
|
+
error
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
this.isPlaybackProgressRegistered = true
|
|
151
|
+
} catch (error) {
|
|
152
|
+
console.error(
|
|
153
|
+
'[CallbackManager] Failed to register playback progress callback:',
|
|
154
|
+
error
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private ensureSeekRegistered(): void {
|
|
160
|
+
if (this.isSeekRegistered) return
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
TrackPlayer.onSeek((position, totalDuration) => {
|
|
164
|
+
this.seekSubscribers.forEach((subscriber) => {
|
|
165
|
+
try {
|
|
166
|
+
subscriber(position, totalDuration)
|
|
167
|
+
} catch (error) {
|
|
168
|
+
console.error('[CallbackManager] Error in seek subscriber:', error)
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
})
|
|
172
|
+
this.isSeekRegistered = true
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error(
|
|
175
|
+
'[CallbackManager] Failed to register seek callback:',
|
|
176
|
+
error
|
|
177
|
+
)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
93
180
|
}
|
|
94
181
|
|
|
95
182
|
// Export singleton instance
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { DownloadManager } from '../index'
|
|
2
|
+
import type {
|
|
3
|
+
DownloadProgress,
|
|
4
|
+
DownloadState,
|
|
5
|
+
DownloadedTrack,
|
|
6
|
+
DownloadError,
|
|
7
|
+
} from '../types/DownloadTypes'
|
|
8
|
+
|
|
9
|
+
type ProgressCallback = (progress: DownloadProgress) => void
|
|
10
|
+
type StateChangeCallback = (
|
|
11
|
+
downloadId: string,
|
|
12
|
+
trackId: string,
|
|
13
|
+
state: DownloadState,
|
|
14
|
+
error?: DownloadError
|
|
15
|
+
) => void
|
|
16
|
+
type CompleteCallback = (downloadedTrack: DownloadedTrack) => void
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Internal subscription manager for download callbacks.
|
|
20
|
+
* Allows multiple hooks to subscribe to a single native callback.
|
|
21
|
+
*/
|
|
22
|
+
class DownloadCallbackSubscriptionManager {
|
|
23
|
+
private progressSubscribers = new Set<ProgressCallback>()
|
|
24
|
+
private stateChangeSubscribers = new Set<StateChangeCallback>()
|
|
25
|
+
private completeSubscribers = new Set<CompleteCallback>()
|
|
26
|
+
|
|
27
|
+
private isProgressRegistered = false
|
|
28
|
+
private isStateChangeRegistered = false
|
|
29
|
+
private isCompleteRegistered = false
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Subscribe to download progress updates
|
|
33
|
+
* @returns Unsubscribe function
|
|
34
|
+
*/
|
|
35
|
+
subscribeToProgress(callback: ProgressCallback): () => void {
|
|
36
|
+
this.progressSubscribers.add(callback)
|
|
37
|
+
this.ensureProgressRegistered()
|
|
38
|
+
|
|
39
|
+
return () => {
|
|
40
|
+
this.progressSubscribers.delete(callback)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Subscribe to download state changes
|
|
46
|
+
* @returns Unsubscribe function
|
|
47
|
+
*/
|
|
48
|
+
subscribeToStateChange(callback: StateChangeCallback): () => void {
|
|
49
|
+
this.stateChangeSubscribers.add(callback)
|
|
50
|
+
this.ensureStateChangeRegistered()
|
|
51
|
+
|
|
52
|
+
return () => {
|
|
53
|
+
this.stateChangeSubscribers.delete(callback)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Subscribe to download completions
|
|
59
|
+
* @returns Unsubscribe function
|
|
60
|
+
*/
|
|
61
|
+
subscribeToComplete(callback: CompleteCallback): () => void {
|
|
62
|
+
this.completeSubscribers.add(callback)
|
|
63
|
+
this.ensureCompleteRegistered()
|
|
64
|
+
|
|
65
|
+
return () => {
|
|
66
|
+
this.completeSubscribers.delete(callback)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private ensureProgressRegistered(): void {
|
|
71
|
+
if (this.isProgressRegistered) return
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
DownloadManager.onDownloadProgress((progress) => {
|
|
75
|
+
this.progressSubscribers.forEach((subscriber) => {
|
|
76
|
+
try {
|
|
77
|
+
subscriber(progress)
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error(
|
|
80
|
+
'[DownloadCallbackManager] Error in progress subscriber:',
|
|
81
|
+
error
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
this.isProgressRegistered = true
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error(
|
|
89
|
+
'[DownloadCallbackManager] Failed to register progress callback:',
|
|
90
|
+
error
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private ensureStateChangeRegistered(): void {
|
|
96
|
+
if (this.isStateChangeRegistered) return
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
DownloadManager.onDownloadStateChange(
|
|
100
|
+
(downloadId, trackId, state, error) => {
|
|
101
|
+
this.stateChangeSubscribers.forEach((subscriber) => {
|
|
102
|
+
try {
|
|
103
|
+
subscriber(downloadId, trackId, state, error)
|
|
104
|
+
} catch (err) {
|
|
105
|
+
console.error(
|
|
106
|
+
'[DownloadCallbackManager] Error in state change subscriber:',
|
|
107
|
+
err
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
this.isStateChangeRegistered = true
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error(
|
|
116
|
+
'[DownloadCallbackManager] Failed to register state change callback:',
|
|
117
|
+
error
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private ensureCompleteRegistered(): void {
|
|
123
|
+
if (this.isCompleteRegistered) return
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
DownloadManager.onDownloadComplete((downloadedTrack) => {
|
|
127
|
+
this.completeSubscribers.forEach((subscriber) => {
|
|
128
|
+
try {
|
|
129
|
+
subscriber(downloadedTrack)
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error(
|
|
132
|
+
'[DownloadCallbackManager] Error in complete subscriber:',
|
|
133
|
+
error
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
this.isCompleteRegistered = true
|
|
139
|
+
} catch (error) {
|
|
140
|
+
console.error(
|
|
141
|
+
'[DownloadCallbackManager] Failed to register complete callback:',
|
|
142
|
+
error
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Export singleton instance
|
|
149
|
+
export const downloadCallbackManager = new DownloadCallbackSubscriptionManager()
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Equalizer } from '../index'
|
|
2
|
+
import type { EqualizerBand } from '../types/EqualizerTypes'
|
|
3
|
+
|
|
4
|
+
type EnabledChangeCallback = (enabled: boolean) => void
|
|
5
|
+
type BandChangeCallback = (bands: EqualizerBand[]) => void
|
|
6
|
+
type PresetChangeCallback = (presetName: string | null) => void
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Internal subscription manager that allows multiple hooks to subscribe
|
|
10
|
+
* to equalizer callbacks. This solves the problem where registering
|
|
11
|
+
* a new callback overwrites the previous one.
|
|
12
|
+
*/
|
|
13
|
+
class EqualizerCallbackSubscriptionManager {
|
|
14
|
+
private enabledChangeSubscribers = new Set<EnabledChangeCallback>()
|
|
15
|
+
private bandChangeSubscribers = new Set<BandChangeCallback>()
|
|
16
|
+
private presetChangeSubscribers = new Set<PresetChangeCallback>()
|
|
17
|
+
private isEnabledChangeRegistered = false
|
|
18
|
+
private isBandChangeRegistered = false
|
|
19
|
+
private isPresetChangeRegistered = false
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Subscribe to enabled state changes
|
|
23
|
+
* @returns Unsubscribe function
|
|
24
|
+
*/
|
|
25
|
+
subscribeToEnabledChange(callback: EnabledChangeCallback): () => void {
|
|
26
|
+
this.enabledChangeSubscribers.add(callback)
|
|
27
|
+
this.ensureEnabledChangeRegistered()
|
|
28
|
+
|
|
29
|
+
return () => {
|
|
30
|
+
this.enabledChangeSubscribers.delete(callback)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Subscribe to band changes
|
|
36
|
+
* @returns Unsubscribe function
|
|
37
|
+
*/
|
|
38
|
+
subscribeToBandChange(callback: BandChangeCallback): () => void {
|
|
39
|
+
this.bandChangeSubscribers.add(callback)
|
|
40
|
+
this.ensureBandChangeRegistered()
|
|
41
|
+
|
|
42
|
+
return () => {
|
|
43
|
+
this.bandChangeSubscribers.delete(callback)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Subscribe to preset changes
|
|
49
|
+
* @returns Unsubscribe function
|
|
50
|
+
*/
|
|
51
|
+
subscribeToPresetChange(callback: PresetChangeCallback): () => void {
|
|
52
|
+
this.presetChangeSubscribers.add(callback)
|
|
53
|
+
this.ensurePresetChangeRegistered()
|
|
54
|
+
|
|
55
|
+
return () => {
|
|
56
|
+
this.presetChangeSubscribers.delete(callback)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private ensureEnabledChangeRegistered(): void {
|
|
61
|
+
if (this.isEnabledChangeRegistered) return
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
Equalizer.onEnabledChange((enabled) => {
|
|
65
|
+
this.enabledChangeSubscribers.forEach((subscriber) => {
|
|
66
|
+
try {
|
|
67
|
+
subscriber(enabled)
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error(
|
|
70
|
+
'[EqualizerCallbackManager] Error in enabled change subscriber:',
|
|
71
|
+
error
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
this.isEnabledChangeRegistered = true
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error(
|
|
79
|
+
'[EqualizerCallbackManager] Failed to register enabled change callback:',
|
|
80
|
+
error
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private ensureBandChangeRegistered(): void {
|
|
86
|
+
if (this.isBandChangeRegistered) return
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
Equalizer.onBandChange((bands) => {
|
|
90
|
+
this.bandChangeSubscribers.forEach((subscriber) => {
|
|
91
|
+
try {
|
|
92
|
+
subscriber(bands)
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error(
|
|
95
|
+
'[EqualizerCallbackManager] Error in band change subscriber:',
|
|
96
|
+
error
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
this.isBandChangeRegistered = true
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error(
|
|
104
|
+
'[EqualizerCallbackManager] Failed to register band change callback:',
|
|
105
|
+
error
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private ensurePresetChangeRegistered(): void {
|
|
111
|
+
if (this.isPresetChangeRegistered) return
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
Equalizer.onPresetChange((presetName) => {
|
|
115
|
+
this.presetChangeSubscribers.forEach((subscriber) => {
|
|
116
|
+
try {
|
|
117
|
+
subscriber(presetName)
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.error(
|
|
120
|
+
'[EqualizerCallbackManager] Error in preset change subscriber:',
|
|
121
|
+
error
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
this.isPresetChangeRegistered = true
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error(
|
|
129
|
+
'[EqualizerCallbackManager] Failed to register preset change callback:',
|
|
130
|
+
error
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Export singleton instance
|
|
137
|
+
export const equalizerCallbackManager =
|
|
138
|
+
new EqualizerCallbackSubscriptionManager()
|
package/src/hooks/index.ts
CHANGED
|
@@ -7,3 +7,26 @@ export { useOnPlaybackProgressChange } from './useOnPlaybackProgressChange'
|
|
|
7
7
|
export { useAndroidAutoConnection } from './useAndroidAutoConnection'
|
|
8
8
|
export { useAudioDevices } from './useAudioDevices'
|
|
9
9
|
export { useNowPlaying } from './useNowPlaying'
|
|
10
|
+
export { usePlaylist } from './usePlaylist'
|
|
11
|
+
export type { UsePlaylistResult } from './usePlaylist'
|
|
12
|
+
export { useActualQueue } from './useActualQueue'
|
|
13
|
+
export type { UseActualQueueResult } from './useActualQueue'
|
|
14
|
+
|
|
15
|
+
// Download hooks
|
|
16
|
+
export { useDownloadProgress } from './useDownloadProgress'
|
|
17
|
+
export type {
|
|
18
|
+
UseDownloadProgressOptions,
|
|
19
|
+
UseDownloadProgressResult,
|
|
20
|
+
} from './useDownloadProgress'
|
|
21
|
+
export { useDownloadedTracks } from './useDownloadedTracks'
|
|
22
|
+
export type { UseDownloadedTracksResult } from './useDownloadedTracks'
|
|
23
|
+
export { useDownloadActions } from './useDownloadActions'
|
|
24
|
+
export type { UseDownloadActionsResult } from './useDownloadActions'
|
|
25
|
+
export { useDownloadStorage } from './useDownloadStorage'
|
|
26
|
+
export type { UseDownloadStorageResult } from './useDownloadStorage'
|
|
27
|
+
|
|
28
|
+
// Equalizer hooks
|
|
29
|
+
export { useEqualizer } from './useEqualizer'
|
|
30
|
+
export type { UseEqualizerResult } from './useEqualizer'
|
|
31
|
+
export { useEqualizerPresets } from './useEqualizerPresets'
|
|
32
|
+
export type { UseEqualizerPresetsResult } from './useEqualizerPresets'
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback } from 'react'
|
|
2
|
+
import { TrackPlayer } from '../index'
|
|
3
|
+
import { callbackManager } from './callbackManager'
|
|
4
|
+
import type { TrackItem } from '../types/PlayerQueue'
|
|
5
|
+
|
|
6
|
+
export interface UseActualQueueResult {
|
|
7
|
+
/** The current queue in playback order */
|
|
8
|
+
queue: TrackItem[]
|
|
9
|
+
/** Manually refresh the queue */
|
|
10
|
+
refreshQueue: () => void
|
|
11
|
+
/** Whether the queue is currently loading */
|
|
12
|
+
isLoading: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Hook to get the actual playback queue including temporary tracks
|
|
17
|
+
*
|
|
18
|
+
* Returns the complete queue in playback order:
|
|
19
|
+
* [tracks_before_current] + [current] + [playNext_stack] + [upNext_queue] + [remaining_tracks]
|
|
20
|
+
*
|
|
21
|
+
* Auto-updates when:
|
|
22
|
+
* - Track changes
|
|
23
|
+
* - Playback state changes
|
|
24
|
+
*
|
|
25
|
+
* Call `refreshQueue()` after adding tracks via `playNext()` or `addToUpNext()`
|
|
26
|
+
* to immediately see the updated queue.
|
|
27
|
+
*
|
|
28
|
+
* @returns Object containing queue array, refresh function, and loading state
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* function QueueView() {
|
|
33
|
+
* const { queue, refreshQueue, isLoading } = useActualQueue();
|
|
34
|
+
*
|
|
35
|
+
* const handleAddToUpNext = (trackId: string) => {
|
|
36
|
+
* TrackPlayer.addToUpNext(trackId);
|
|
37
|
+
* // Refresh queue after adding track
|
|
38
|
+
* setTimeout(refreshQueue, 100);
|
|
39
|
+
* };
|
|
40
|
+
*
|
|
41
|
+
* return (
|
|
42
|
+
* <ScrollView>
|
|
43
|
+
* {queue.map((track, index) => (
|
|
44
|
+
* <Text key={track.id}>
|
|
45
|
+
* {index + 1}. {track.title}
|
|
46
|
+
* </Text>
|
|
47
|
+
* ))}
|
|
48
|
+
* </ScrollView>
|
|
49
|
+
* );
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function useActualQueue(): UseActualQueueResult {
|
|
54
|
+
const [queue, setQueue] = useState<TrackItem[]>([])
|
|
55
|
+
const [isLoading, setIsLoading] = useState(true)
|
|
56
|
+
const isMounted = useRef(true)
|
|
57
|
+
|
|
58
|
+
const updateQueue = useCallback(async () => {
|
|
59
|
+
if (!isMounted.current) return
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const actualQueue = await TrackPlayer.getActualQueue()
|
|
63
|
+
if (isMounted.current) {
|
|
64
|
+
setQueue(actualQueue)
|
|
65
|
+
setIsLoading(false)
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error('[useActualQueue] Error getting queue:', error)
|
|
69
|
+
if (isMounted.current) {
|
|
70
|
+
setQueue([])
|
|
71
|
+
setIsLoading(false)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}, [])
|
|
75
|
+
|
|
76
|
+
const refreshQueue = useCallback(() => {
|
|
77
|
+
if (!isMounted.current) return
|
|
78
|
+
setIsLoading(true)
|
|
79
|
+
updateQueue()
|
|
80
|
+
}, [updateQueue])
|
|
81
|
+
|
|
82
|
+
// Initialize queue
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
isMounted.current = true
|
|
85
|
+
updateQueue()
|
|
86
|
+
|
|
87
|
+
return () => {
|
|
88
|
+
isMounted.current = false
|
|
89
|
+
}
|
|
90
|
+
}, [updateQueue])
|
|
91
|
+
|
|
92
|
+
// Update queue on track changes (with slight delay to ensure native side has updated)
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
const unsubscribe = callbackManager.subscribeToTrackChange(() => {
|
|
95
|
+
// Small delay to ensure native queue is updated
|
|
96
|
+
setTimeout(updateQueue, 50)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
return () => {
|
|
100
|
+
unsubscribe()
|
|
101
|
+
}
|
|
102
|
+
}, [updateQueue])
|
|
103
|
+
|
|
104
|
+
// Update queue on playback state changes
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
const unsubscribe = callbackManager.subscribeToPlaybackState(() => {
|
|
107
|
+
updateQueue()
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
return () => {
|
|
111
|
+
unsubscribe()
|
|
112
|
+
}
|
|
113
|
+
}, [updateQueue])
|
|
114
|
+
|
|
115
|
+
return { queue, refreshQueue, isLoading }
|
|
116
|
+
}
|