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
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback, useRef } from 'react';
|
|
2
|
+
import { Equalizer } from '../index';
|
|
3
|
+
import { equalizerCallbackManager } from './equalizerCallbackManager';
|
|
4
|
+
const DEFAULT_BANDS = [
|
|
5
|
+
{ index: 0, centerFrequency: 60, gainDb: 0, frequencyLabel: '60 Hz' },
|
|
6
|
+
{ index: 1, centerFrequency: 230, gainDb: 0, frequencyLabel: '230 Hz' },
|
|
7
|
+
{ index: 2, centerFrequency: 910, gainDb: 0, frequencyLabel: '910 Hz' },
|
|
8
|
+
{ index: 3, centerFrequency: 3600, gainDb: 0, frequencyLabel: '3.6 kHz' },
|
|
9
|
+
{ index: 4, centerFrequency: 14000, gainDb: 0, frequencyLabel: '14 kHz' },
|
|
10
|
+
];
|
|
11
|
+
export function useEqualizer() {
|
|
12
|
+
const [isEnabled, setIsEnabledState] = useState(false);
|
|
13
|
+
const [bands, setBands] = useState(DEFAULT_BANDS);
|
|
14
|
+
const [currentPreset, setCurrentPreset] = useState(null);
|
|
15
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
16
|
+
const [gainRange, setGainRange] = useState({ min: -12, max: 12 });
|
|
17
|
+
const isMounted = useRef(true);
|
|
18
|
+
// Load initial state
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
isMounted.current = true;
|
|
21
|
+
const loadState = async () => {
|
|
22
|
+
try {
|
|
23
|
+
const state = Equalizer.getState();
|
|
24
|
+
if (isMounted.current) {
|
|
25
|
+
setIsEnabledState(state.enabled);
|
|
26
|
+
setBands(state.bands);
|
|
27
|
+
setCurrentPreset(state.currentPreset);
|
|
28
|
+
const range = Equalizer.getBandRange();
|
|
29
|
+
setGainRange({ min: range.min, max: range.max });
|
|
30
|
+
setIsLoading(false);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error('[useEqualizer] Error loading state:', error);
|
|
35
|
+
if (isMounted.current) {
|
|
36
|
+
setIsLoading(false);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
loadState();
|
|
41
|
+
return () => {
|
|
42
|
+
isMounted.current = false;
|
|
43
|
+
};
|
|
44
|
+
}, []);
|
|
45
|
+
// Subscribe to enabled changes
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
const unsubscribe = equalizerCallbackManager.subscribeToEnabledChange((enabled) => {
|
|
48
|
+
if (isMounted.current) {
|
|
49
|
+
setIsEnabledState(enabled);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return unsubscribe;
|
|
53
|
+
}, []);
|
|
54
|
+
// Subscribe to band changes
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
const unsubscribe = equalizerCallbackManager.subscribeToBandChange((newBands) => {
|
|
57
|
+
if (isMounted.current) {
|
|
58
|
+
setBands(newBands);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return unsubscribe;
|
|
62
|
+
}, []);
|
|
63
|
+
// Subscribe to preset changes
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
const unsubscribe = equalizerCallbackManager.subscribeToPresetChange((presetName) => {
|
|
66
|
+
if (isMounted.current) {
|
|
67
|
+
setCurrentPreset(presetName);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return unsubscribe;
|
|
71
|
+
}, []);
|
|
72
|
+
const setEnabled = useCallback((enabled) => {
|
|
73
|
+
try {
|
|
74
|
+
return Equalizer.setEnabled(enabled);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error('[useEqualizer] Error setting enabled:', error);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}, []);
|
|
81
|
+
const setBandGain = useCallback((bandIndex, gainDb) => {
|
|
82
|
+
// Optimistic update
|
|
83
|
+
setBands((prevBands) => prevBands.map((b) => (b.index === bandIndex ? { ...b, gainDb } : b)));
|
|
84
|
+
try {
|
|
85
|
+
return Equalizer.setBandGain(bandIndex, gainDb);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('[useEqualizer] Error setting band gain:', error);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}, []);
|
|
92
|
+
const setAllBandGains = useCallback((gains) => {
|
|
93
|
+
// Optimistic update
|
|
94
|
+
setBands((prevBands) => prevBands.map((b, i) => ({ ...b, gainDb: gains[i] ?? b.gainDb })));
|
|
95
|
+
try {
|
|
96
|
+
return Equalizer.setAllBandGains(gains);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error('[useEqualizer] Error setting all band gains:', error);
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}, []);
|
|
103
|
+
const reset = useCallback(() => {
|
|
104
|
+
// Optimistic update
|
|
105
|
+
setBands((prevBands) => prevBands.map((b) => ({ ...b, gainDb: 0 })));
|
|
106
|
+
try {
|
|
107
|
+
Equalizer.reset();
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('[useEqualizer] Error resetting equalizer:', error);
|
|
111
|
+
}
|
|
112
|
+
}, []);
|
|
113
|
+
return {
|
|
114
|
+
isEnabled,
|
|
115
|
+
bands,
|
|
116
|
+
currentPreset,
|
|
117
|
+
setEnabled,
|
|
118
|
+
setBandGain,
|
|
119
|
+
setAllBandGains,
|
|
120
|
+
reset,
|
|
121
|
+
isLoading,
|
|
122
|
+
gainRange,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EqualizerPreset } from '../types/EqualizerTypes';
|
|
2
|
+
export interface UseEqualizerPresetsResult {
|
|
3
|
+
/** All available presets */
|
|
4
|
+
presets: EqualizerPreset[];
|
|
5
|
+
/** Built-in presets only */
|
|
6
|
+
builtInPresets: EqualizerPreset[];
|
|
7
|
+
/** Custom user presets */
|
|
8
|
+
customPresets: EqualizerPreset[];
|
|
9
|
+
/** Apply a preset by name */
|
|
10
|
+
applyPreset: (name: string) => boolean;
|
|
11
|
+
/** Save current settings as custom preset */
|
|
12
|
+
saveCustomPreset: (name: string) => boolean;
|
|
13
|
+
/** Delete a custom preset */
|
|
14
|
+
deleteCustomPreset: (name: string) => boolean;
|
|
15
|
+
/** Currently applied preset name */
|
|
16
|
+
currentPreset: string | null;
|
|
17
|
+
/** Whether presets are loading */
|
|
18
|
+
isLoading: boolean;
|
|
19
|
+
/** Refresh presets from native */
|
|
20
|
+
refreshPresets: () => void;
|
|
21
|
+
}
|
|
22
|
+
export declare function useEqualizerPresets(): UseEqualizerPresetsResult;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback, useRef } from 'react';
|
|
2
|
+
import { Equalizer } from '../index';
|
|
3
|
+
import { equalizerCallbackManager } from './equalizerCallbackManager';
|
|
4
|
+
export function useEqualizerPresets() {
|
|
5
|
+
const [presets, setPresets] = useState([]);
|
|
6
|
+
const [builtInPresets, setBuiltInPresets] = useState([]);
|
|
7
|
+
const [customPresets, setCustomPresets] = useState([]);
|
|
8
|
+
const [currentPreset, setCurrentPreset] = useState(null);
|
|
9
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
10
|
+
const isMounted = useRef(true);
|
|
11
|
+
const refreshPresets = useCallback(() => {
|
|
12
|
+
try {
|
|
13
|
+
const allPresets = Equalizer.getPresets();
|
|
14
|
+
const builtIn = Equalizer.getBuiltInPresets();
|
|
15
|
+
const custom = Equalizer.getCustomPresets();
|
|
16
|
+
const current = Equalizer.getCurrentPresetName();
|
|
17
|
+
if (isMounted.current) {
|
|
18
|
+
setPresets(allPresets);
|
|
19
|
+
setBuiltInPresets(builtIn);
|
|
20
|
+
setCustomPresets(custom);
|
|
21
|
+
setCurrentPreset(current);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error('[useEqualizerPresets] Error refreshing presets:', error);
|
|
26
|
+
}
|
|
27
|
+
}, []);
|
|
28
|
+
// Load initial presets
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
isMounted.current = true;
|
|
31
|
+
refreshPresets();
|
|
32
|
+
setIsLoading(false);
|
|
33
|
+
return () => {
|
|
34
|
+
isMounted.current = false;
|
|
35
|
+
};
|
|
36
|
+
}, [refreshPresets]);
|
|
37
|
+
// Subscribe to preset changes
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
const unsubscribe = equalizerCallbackManager.subscribeToPresetChange((presetName) => {
|
|
40
|
+
if (isMounted.current) {
|
|
41
|
+
setCurrentPreset(presetName);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return unsubscribe;
|
|
45
|
+
}, []);
|
|
46
|
+
const applyPreset = useCallback((name) => {
|
|
47
|
+
try {
|
|
48
|
+
const success = Equalizer.applyPreset(name);
|
|
49
|
+
if (success) {
|
|
50
|
+
setCurrentPreset(name);
|
|
51
|
+
}
|
|
52
|
+
return success;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('[useEqualizerPresets] Error applying preset:', error);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}, []);
|
|
59
|
+
const saveCustomPreset = useCallback((name) => {
|
|
60
|
+
try {
|
|
61
|
+
const success = Equalizer.saveCustomPreset(name);
|
|
62
|
+
if (success) {
|
|
63
|
+
refreshPresets();
|
|
64
|
+
}
|
|
65
|
+
return success;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error('[useEqualizerPresets] Error saving custom preset:', error);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}, [refreshPresets]);
|
|
72
|
+
const deleteCustomPreset = useCallback((name) => {
|
|
73
|
+
try {
|
|
74
|
+
const success = Equalizer.deleteCustomPreset(name);
|
|
75
|
+
if (success) {
|
|
76
|
+
refreshPresets();
|
|
77
|
+
}
|
|
78
|
+
return success;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('[useEqualizerPresets] Error deleting custom preset:', error);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}, [refreshPresets]);
|
|
85
|
+
return {
|
|
86
|
+
presets,
|
|
87
|
+
builtInPresets,
|
|
88
|
+
customPresets,
|
|
89
|
+
applyPreset,
|
|
90
|
+
saveCustomPreset,
|
|
91
|
+
deleteCustomPreset,
|
|
92
|
+
currentPreset,
|
|
93
|
+
isLoading,
|
|
94
|
+
refreshPresets,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -8,6 +8,7 @@ const DEFAULT_STATE = {
|
|
|
8
8
|
currentState: 'stopped',
|
|
9
9
|
currentPlaylistId: null,
|
|
10
10
|
currentIndex: -1,
|
|
11
|
+
currentPlayingType: 'not-playing',
|
|
11
12
|
};
|
|
12
13
|
/**
|
|
13
14
|
* Hook to get the current player state (same as TrackPlayer.getState())
|
|
@@ -46,12 +47,14 @@ const DEFAULT_STATE = {
|
|
|
46
47
|
export function useNowPlaying() {
|
|
47
48
|
const [state, setState] = useState(DEFAULT_STATE);
|
|
48
49
|
const isMounted = useRef(true);
|
|
49
|
-
const
|
|
50
|
+
const fetchFullState = useCallback(async () => {
|
|
50
51
|
if (!isMounted.current)
|
|
51
52
|
return;
|
|
52
53
|
try {
|
|
53
|
-
const newState = TrackPlayer.getState();
|
|
54
|
-
|
|
54
|
+
const newState = await TrackPlayer.getState();
|
|
55
|
+
if (isMounted.current) {
|
|
56
|
+
setState(newState);
|
|
57
|
+
}
|
|
55
58
|
}
|
|
56
59
|
catch (error) {
|
|
57
60
|
console.error('[useNowPlaying] Error updating player state:', error);
|
|
@@ -60,28 +63,38 @@ export function useNowPlaying() {
|
|
|
60
63
|
// Initialize with current state
|
|
61
64
|
useEffect(() => {
|
|
62
65
|
isMounted.current = true;
|
|
63
|
-
|
|
66
|
+
fetchFullState();
|
|
64
67
|
return () => {
|
|
65
68
|
isMounted.current = false;
|
|
66
69
|
};
|
|
67
|
-
}, [
|
|
68
|
-
// Subscribe to track changes
|
|
70
|
+
}, [fetchFullState]);
|
|
71
|
+
// Subscribe to track changes — full refresh
|
|
69
72
|
useEffect(() => {
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
return callbackManager.subscribeToTrackChange(() => {
|
|
74
|
+
fetchFullState();
|
|
72
75
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
};
|
|
76
|
-
}, [updateState]);
|
|
77
|
-
// Subscribe to playback state changes
|
|
76
|
+
}, [fetchFullState]);
|
|
77
|
+
// Subscribe to playback state changes — full refresh
|
|
78
78
|
useEffect(() => {
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
return callbackManager.subscribeToPlaybackState(() => {
|
|
80
|
+
fetchFullState();
|
|
81
81
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
}, [fetchFullState]);
|
|
83
|
+
// Subscribe to progress changes — lightweight position/duration update
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
return callbackManager.subscribeToPlaybackProgressChange((currentPosition, totalDuration) => {
|
|
86
|
+
if (!isMounted.current)
|
|
87
|
+
return;
|
|
88
|
+
setState((prev) => ({ ...prev, currentPosition, totalDuration }));
|
|
89
|
+
});
|
|
90
|
+
}, []);
|
|
91
|
+
// Subscribe to seek events — lightweight position/duration update
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
return callbackManager.subscribeToSeek((currentPosition, totalDuration) => {
|
|
94
|
+
if (!isMounted.current)
|
|
95
|
+
return;
|
|
96
|
+
setState((prev) => ({ ...prev, currentPosition, totalDuration }));
|
|
97
|
+
});
|
|
98
|
+
}, []);
|
|
86
99
|
return state;
|
|
87
100
|
}
|
|
@@ -38,20 +38,23 @@ export function useOnChangeTrack() {
|
|
|
38
38
|
// Initialize with current track from the player
|
|
39
39
|
useEffect(() => {
|
|
40
40
|
isMounted.current = true;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
const initializeTrack = async () => {
|
|
42
|
+
try {
|
|
43
|
+
const playerState = await TrackPlayer.getState();
|
|
44
|
+
if (isMounted.current) {
|
|
45
|
+
setTrack(playerState.currentTrack);
|
|
46
|
+
setIsReady(true);
|
|
47
|
+
}
|
|
46
48
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('[useOnChangeTrack] Failed to get initial state:', error);
|
|
51
|
+
if (isMounted.current) {
|
|
52
|
+
setTrack(null);
|
|
53
|
+
setIsReady(true);
|
|
54
|
+
}
|
|
53
55
|
}
|
|
54
|
-
}
|
|
56
|
+
};
|
|
57
|
+
initializeTrack();
|
|
55
58
|
return () => {
|
|
56
59
|
isMounted.current = false;
|
|
57
60
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { callbackManager } from './callbackManager';
|
|
3
3
|
/**
|
|
4
4
|
* Hook to get the current playback progress
|
|
5
5
|
* @returns Object with current position, total duration, and manual seek indicator
|
|
@@ -9,7 +9,7 @@ export function useOnPlaybackProgressChange() {
|
|
|
9
9
|
const [totalDuration, setTotalDuration] = useState(0);
|
|
10
10
|
const [isManuallySeeked, setIsManuallySeeked] = useState(undefined);
|
|
11
11
|
useEffect(() => {
|
|
12
|
-
|
|
12
|
+
return callbackManager.subscribeToPlaybackProgressChange((newPosition, newTotalDuration, newIsManuallySeeked) => {
|
|
13
13
|
setPosition(newPosition);
|
|
14
14
|
setTotalDuration(newTotalDuration);
|
|
15
15
|
setIsManuallySeeked(newIsManuallySeeked);
|
|
@@ -37,21 +37,24 @@ export function useOnPlaybackStateChange() {
|
|
|
37
37
|
// Initialize with current state from the player
|
|
38
38
|
useEffect(() => {
|
|
39
39
|
isMounted.current = true;
|
|
40
|
-
// Get initial state
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
// Get initial state asynchronously
|
|
41
|
+
const initializeState = async () => {
|
|
42
|
+
try {
|
|
43
|
+
const playerState = await TrackPlayer.getState();
|
|
44
|
+
if (isMounted.current) {
|
|
45
|
+
setState(playerState.currentState);
|
|
46
|
+
setIsReady(true);
|
|
47
|
+
}
|
|
46
48
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('[useOnPlaybackStateChange] Failed to get initial state:', error);
|
|
51
|
+
if (isMounted.current) {
|
|
52
|
+
setState('stopped');
|
|
53
|
+
setIsReady(true);
|
|
54
|
+
}
|
|
53
55
|
}
|
|
54
|
-
}
|
|
56
|
+
};
|
|
57
|
+
initializeState();
|
|
55
58
|
return () => {
|
|
56
59
|
isMounted.current = false;
|
|
57
60
|
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Playlist, TrackItem } from '../types/PlayerQueue';
|
|
2
|
+
export interface UsePlaylistResult {
|
|
3
|
+
/** The currently loaded playlist */
|
|
4
|
+
currentPlaylist: Playlist | null;
|
|
5
|
+
/** ID of the currently loaded playlist */
|
|
6
|
+
currentPlaylistId: string | null;
|
|
7
|
+
/** All available playlists */
|
|
8
|
+
allPlaylists: Playlist[];
|
|
9
|
+
/** All tracks from all playlists (flattened) */
|
|
10
|
+
allTracks: TrackItem[];
|
|
11
|
+
/** Whether the playlists are currently loading */
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
/** Manually refresh playlist data */
|
|
14
|
+
refreshPlaylists: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Hook to manage playlist state
|
|
18
|
+
*
|
|
19
|
+
* Provides current playlist, all playlists, and all tracks across playlists.
|
|
20
|
+
* Automatically refreshes when:
|
|
21
|
+
* - Component mounts
|
|
22
|
+
* - Track changes (to update currentPlaylistId)
|
|
23
|
+
* - Playlists are modified via PlayerQueue methods
|
|
24
|
+
*
|
|
25
|
+
* Call `refreshPlaylists()` after creating/deleting playlists to update the state.
|
|
26
|
+
*
|
|
27
|
+
* @returns Object containing playlist state and refresh function
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* function MyComponent() {
|
|
32
|
+
* const { currentPlaylist, allTracks, refreshPlaylists } = usePlaylist();
|
|
33
|
+
*
|
|
34
|
+
* const handleCreatePlaylist = () => {
|
|
35
|
+
* PlayerQueue.createPlaylist('New Playlist');
|
|
36
|
+
* refreshPlaylists(); // Refresh to see the new playlist
|
|
37
|
+
* };
|
|
38
|
+
*
|
|
39
|
+
* return (
|
|
40
|
+
* <View>
|
|
41
|
+
* <Text>{currentPlaylist?.name}</Text>
|
|
42
|
+
* <Text>Total tracks: {allTracks.length}</Text>
|
|
43
|
+
* </View>
|
|
44
|
+
* );
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function usePlaylist(): UsePlaylistResult;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback } from 'react';
|
|
2
|
+
import { PlayerQueue } from '../index';
|
|
3
|
+
import { callbackManager } from './callbackManager';
|
|
4
|
+
/**
|
|
5
|
+
* Hook to manage playlist state
|
|
6
|
+
*
|
|
7
|
+
* Provides current playlist, all playlists, and all tracks across playlists.
|
|
8
|
+
* Automatically refreshes when:
|
|
9
|
+
* - Component mounts
|
|
10
|
+
* - Track changes (to update currentPlaylistId)
|
|
11
|
+
* - Playlists are modified via PlayerQueue methods
|
|
12
|
+
*
|
|
13
|
+
* Call `refreshPlaylists()` after creating/deleting playlists to update the state.
|
|
14
|
+
*
|
|
15
|
+
* @returns Object containing playlist state and refresh function
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* function MyComponent() {
|
|
20
|
+
* const { currentPlaylist, allTracks, refreshPlaylists } = usePlaylist();
|
|
21
|
+
*
|
|
22
|
+
* const handleCreatePlaylist = () => {
|
|
23
|
+
* PlayerQueue.createPlaylist('New Playlist');
|
|
24
|
+
* refreshPlaylists(); // Refresh to see the new playlist
|
|
25
|
+
* };
|
|
26
|
+
*
|
|
27
|
+
* return (
|
|
28
|
+
* <View>
|
|
29
|
+
* <Text>{currentPlaylist?.name}</Text>
|
|
30
|
+
* <Text>Total tracks: {allTracks.length}</Text>
|
|
31
|
+
* </View>
|
|
32
|
+
* );
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function usePlaylist() {
|
|
37
|
+
const [currentPlaylist, setCurrentPlaylist] = useState(null);
|
|
38
|
+
const [currentPlaylistId, setCurrentPlaylistId] = useState(null);
|
|
39
|
+
const [allPlaylists, setAllPlaylists] = useState([]);
|
|
40
|
+
const [allTracks, setAllTracks] = useState([]);
|
|
41
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
42
|
+
const isMounted = useRef(true);
|
|
43
|
+
const hasSubscribed = useRef(false);
|
|
44
|
+
const refreshPlaylists = useCallback(() => {
|
|
45
|
+
if (!isMounted.current)
|
|
46
|
+
return;
|
|
47
|
+
try {
|
|
48
|
+
// Get current playlist ID
|
|
49
|
+
const playlistId = PlayerQueue.getCurrentPlaylistId();
|
|
50
|
+
if (!isMounted.current)
|
|
51
|
+
return;
|
|
52
|
+
setCurrentPlaylistId(playlistId);
|
|
53
|
+
// Get current playlist details
|
|
54
|
+
if (playlistId) {
|
|
55
|
+
const playlist = PlayerQueue.getPlaylist(playlistId);
|
|
56
|
+
if (isMounted.current) {
|
|
57
|
+
setCurrentPlaylist(playlist);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (isMounted.current) {
|
|
62
|
+
setCurrentPlaylist(null);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Get all playlists
|
|
66
|
+
const playlists = PlayerQueue.getAllPlaylists();
|
|
67
|
+
if (!isMounted.current)
|
|
68
|
+
return;
|
|
69
|
+
setAllPlaylists(playlists);
|
|
70
|
+
// Get all tracks from all playlists (deduplicated by id)
|
|
71
|
+
const trackMap = new Map();
|
|
72
|
+
playlists.forEach((playlist) => {
|
|
73
|
+
playlist.tracks.forEach((track) => {
|
|
74
|
+
if (!trackMap.has(track.id)) {
|
|
75
|
+
trackMap.set(track.id, track);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
if (isMounted.current) {
|
|
80
|
+
setAllTracks(Array.from(trackMap.values()));
|
|
81
|
+
setIsLoading(false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('[usePlaylist] Error refreshing playlists:', error);
|
|
86
|
+
if (isMounted.current) {
|
|
87
|
+
setIsLoading(false);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}, []);
|
|
91
|
+
// Initialize and setup mounted ref
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
isMounted.current = true;
|
|
94
|
+
// Initial load
|
|
95
|
+
refreshPlaylists();
|
|
96
|
+
return () => {
|
|
97
|
+
isMounted.current = false;
|
|
98
|
+
};
|
|
99
|
+
}, [refreshPlaylists]);
|
|
100
|
+
// Subscribe to native playlist changes (only once)
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (hasSubscribed.current)
|
|
103
|
+
return;
|
|
104
|
+
hasSubscribed.current = true;
|
|
105
|
+
try {
|
|
106
|
+
PlayerQueue.onPlaylistsChanged(() => {
|
|
107
|
+
if (isMounted.current) {
|
|
108
|
+
refreshPlaylists();
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error('[usePlaylist] Error setting up playlist listener:', error);
|
|
114
|
+
}
|
|
115
|
+
}, [refreshPlaylists]);
|
|
116
|
+
// Also refresh when track changes (as it might indicate playlist loaded)
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
const unsubscribe = callbackManager.subscribeToTrackChange(() => {
|
|
119
|
+
// Refresh to update currentPlaylistId when track changes
|
|
120
|
+
if (isMounted.current) {
|
|
121
|
+
refreshPlaylists();
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return () => {
|
|
125
|
+
unsubscribe();
|
|
126
|
+
};
|
|
127
|
+
}, [refreshPlaylists]);
|
|
128
|
+
return {
|
|
129
|
+
currentPlaylist,
|
|
130
|
+
currentPlaylistId,
|
|
131
|
+
allPlaylists,
|
|
132
|
+
allTracks,
|
|
133
|
+
isLoading,
|
|
134
|
+
refreshPlaylists,
|
|
135
|
+
};
|
|
136
|
+
}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,14 +2,20 @@ import type { PlayerQueue as PlayerQueueType, TrackPlayer as TrackPlayerType } f
|
|
|
2
2
|
import type { AndroidAutoMediaLibrary as AndroidAutoMediaLibraryType } from './specs/AndroidAutoMediaLibrary.nitro';
|
|
3
3
|
import type { AudioDevices as AudioDevicesType } from './specs/AudioDevices.nitro';
|
|
4
4
|
import type { AudioRoutePicker as AudioRoutePickerType } from './specs/AudioRoutePicker.nitro';
|
|
5
|
+
import type { DownloadManager as DownloadManagerType } from './specs/DownloadManager.nitro';
|
|
6
|
+
import type { Equalizer as EqualizerType } from './specs/Equalizer.nitro';
|
|
5
7
|
export declare const PlayerQueue: PlayerQueueType;
|
|
6
8
|
export declare const TrackPlayer: TrackPlayerType;
|
|
7
9
|
export declare const AndroidAutoMediaLibrary: AndroidAutoMediaLibraryType | null;
|
|
8
10
|
export declare const AudioDevices: AudioDevicesType | null;
|
|
9
11
|
export declare const AudioRoutePicker: AudioRoutePickerType | null;
|
|
12
|
+
export declare const DownloadManager: DownloadManagerType;
|
|
13
|
+
export declare const Equalizer: EqualizerType;
|
|
10
14
|
export * from './hooks';
|
|
11
15
|
export * from './types/PlayerQueue';
|
|
12
16
|
export * from './types/AndroidAutoMediaLibrary';
|
|
17
|
+
export * from './types/DownloadTypes';
|
|
18
|
+
export * from './types/EqualizerTypes';
|
|
13
19
|
export type { TAudioDevice } from './specs/AudioDevices.nitro';
|
|
14
20
|
export type { RepeatMode } from './specs/TrackPlayer.nitro';
|
|
15
21
|
export { AndroidAutoMediaLibraryHelper } from './utils/androidAutoMediaLibrary';
|
package/lib/index.js
CHANGED
|
@@ -15,10 +15,16 @@ export const AudioDevices = Platform.OS === 'android'
|
|
|
15
15
|
export const AudioRoutePicker = Platform.OS === 'ios'
|
|
16
16
|
? NitroModules.createHybridObject('AudioRoutePicker')
|
|
17
17
|
: null;
|
|
18
|
+
// Download Manager
|
|
19
|
+
export const DownloadManager = NitroModules.createHybridObject('DownloadManager');
|
|
20
|
+
// Equalizer
|
|
21
|
+
export const Equalizer = NitroModules.createHybridObject('Equalizer');
|
|
18
22
|
// Export hooks
|
|
19
23
|
export * from './hooks';
|
|
20
24
|
// Export types
|
|
21
25
|
export * from './types/PlayerQueue';
|
|
22
26
|
export * from './types/AndroidAutoMediaLibrary';
|
|
27
|
+
export * from './types/DownloadTypes';
|
|
28
|
+
export * from './types/EqualizerTypes';
|
|
23
29
|
// Export utilities
|
|
24
30
|
export { AndroidAutoMediaLibraryHelper } from './utils/androidAutoMediaLibrary';
|