react-native-nitro-player 0.3.0-alpha.9 → 0.4.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 +970 -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 +998 -276
- 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/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 +3 -2
- package/lib/hooks/useOnChangeTrack.js +15 -12
- 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/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 +3 -2
- package/src/hooks/useOnChangeTrack.ts +15 -11
- 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,126 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback } from 'react'
|
|
2
|
+
import { DownloadManager } from '../index'
|
|
3
|
+
import { downloadCallbackManager } from './downloadCallbackManager'
|
|
4
|
+
import type { DownloadProgress } from '../types/DownloadTypes'
|
|
5
|
+
|
|
6
|
+
export interface UseDownloadProgressOptions {
|
|
7
|
+
/** Track specific track ID(s) */
|
|
8
|
+
trackIds?: string[]
|
|
9
|
+
/** Track specific download ID(s) */
|
|
10
|
+
downloadIds?: string[]
|
|
11
|
+
/** Only track active downloads */
|
|
12
|
+
activeOnly?: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface UseDownloadProgressResult {
|
|
16
|
+
/** Map of trackId to DownloadProgress */
|
|
17
|
+
progressMap: Map<string, DownloadProgress>
|
|
18
|
+
/** Array of all tracked progress */
|
|
19
|
+
progressList: DownloadProgress[]
|
|
20
|
+
/** Overall progress for tracked downloads (0-1) */
|
|
21
|
+
overallProgress: number
|
|
22
|
+
/** Whether any download is in progress */
|
|
23
|
+
isDownloading: boolean
|
|
24
|
+
/** Get progress for a specific track */
|
|
25
|
+
getProgress: (trackId: string) => DownloadProgress | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Hook for tracking download progress
|
|
30
|
+
*/
|
|
31
|
+
export function useDownloadProgress(
|
|
32
|
+
options: UseDownloadProgressOptions = {}
|
|
33
|
+
): UseDownloadProgressResult {
|
|
34
|
+
const { trackIds, downloadIds, activeOnly = false } = options
|
|
35
|
+
const [progressMap, setProgressMap] = useState<Map<string, DownloadProgress>>(
|
|
36
|
+
new Map()
|
|
37
|
+
)
|
|
38
|
+
const isMounted = useRef(true)
|
|
39
|
+
|
|
40
|
+
const shouldTrack = useCallback(
|
|
41
|
+
(progress: DownloadProgress): boolean => {
|
|
42
|
+
if (
|
|
43
|
+
trackIds &&
|
|
44
|
+
trackIds.length > 0 &&
|
|
45
|
+
!trackIds.includes(progress.trackId)
|
|
46
|
+
) {
|
|
47
|
+
return false
|
|
48
|
+
}
|
|
49
|
+
if (
|
|
50
|
+
downloadIds &&
|
|
51
|
+
downloadIds.length > 0 &&
|
|
52
|
+
!downloadIds.includes(progress.downloadId)
|
|
53
|
+
) {
|
|
54
|
+
return false
|
|
55
|
+
}
|
|
56
|
+
if (activeOnly && progress.state !== 'downloading') {
|
|
57
|
+
return false
|
|
58
|
+
}
|
|
59
|
+
return true
|
|
60
|
+
},
|
|
61
|
+
[trackIds, downloadIds, activeOnly]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
isMounted.current = true
|
|
66
|
+
|
|
67
|
+
// Initialize with current active downloads
|
|
68
|
+
try {
|
|
69
|
+
const activeDownloads = DownloadManager.getActiveDownloads()
|
|
70
|
+
const initialMap = new Map<string, DownloadProgress>()
|
|
71
|
+
activeDownloads.forEach((task) => {
|
|
72
|
+
if (shouldTrack(task.progress)) {
|
|
73
|
+
initialMap.set(task.trackId, task.progress)
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
setProgressMap(initialMap)
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error('[useDownloadProgress] Error initializing:', error)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const unsubscribe = downloadCallbackManager.subscribeToProgress(
|
|
82
|
+
(progress) => {
|
|
83
|
+
if (!isMounted.current) return
|
|
84
|
+
if (!shouldTrack(progress)) return
|
|
85
|
+
|
|
86
|
+
setProgressMap((prev) => {
|
|
87
|
+
const next = new Map(prev)
|
|
88
|
+
if (
|
|
89
|
+
progress.state === 'completed' ||
|
|
90
|
+
progress.state === 'cancelled'
|
|
91
|
+
) {
|
|
92
|
+
next.delete(progress.trackId)
|
|
93
|
+
} else {
|
|
94
|
+
next.set(progress.trackId, progress)
|
|
95
|
+
}
|
|
96
|
+
return next
|
|
97
|
+
})
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
return () => {
|
|
102
|
+
isMounted.current = false
|
|
103
|
+
unsubscribe()
|
|
104
|
+
}
|
|
105
|
+
}, [shouldTrack])
|
|
106
|
+
|
|
107
|
+
const progressList = Array.from(progressMap.values())
|
|
108
|
+
const overallProgress =
|
|
109
|
+
progressList.length > 0
|
|
110
|
+
? progressList.reduce((sum, p) => sum + p.progress, 0) /
|
|
111
|
+
progressList.length
|
|
112
|
+
: 0
|
|
113
|
+
const isDownloading = progressList.some((p) => p.state === 'downloading')
|
|
114
|
+
const getProgress = useCallback(
|
|
115
|
+
(trackId: string) => progressMap.get(trackId),
|
|
116
|
+
[progressMap]
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
progressMap,
|
|
121
|
+
progressList,
|
|
122
|
+
overallProgress,
|
|
123
|
+
isDownloading,
|
|
124
|
+
getProgress,
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback } from 'react'
|
|
2
|
+
import { DownloadManager } from '../index'
|
|
3
|
+
import type { DownloadStorageInfo } from '../types/DownloadTypes'
|
|
4
|
+
|
|
5
|
+
export interface UseDownloadStorageResult {
|
|
6
|
+
/** Storage information */
|
|
7
|
+
storageInfo: DownloadStorageInfo | null
|
|
8
|
+
/** Loading state */
|
|
9
|
+
isLoading: boolean
|
|
10
|
+
/** Refresh storage info */
|
|
11
|
+
refresh: () => Promise<void>
|
|
12
|
+
/** Formatted total downloaded size (e.g., "2.5 GB") */
|
|
13
|
+
formattedSize: string
|
|
14
|
+
/** Formatted available space (e.g., "10.2 GB") */
|
|
15
|
+
formattedAvailable: string
|
|
16
|
+
/** Usage percentage (0-100) */
|
|
17
|
+
usagePercentage: number
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Formats bytes into a human-readable string
|
|
22
|
+
*/
|
|
23
|
+
function formatBytes(bytes: number): string {
|
|
24
|
+
if (bytes === 0) return '0 B'
|
|
25
|
+
const k = 1024
|
|
26
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
|
|
27
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k))
|
|
28
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Hook for accessing download storage information
|
|
33
|
+
*/
|
|
34
|
+
export function useDownloadStorage(): UseDownloadStorageResult {
|
|
35
|
+
const [storageInfo, setStorageInfo] = useState<DownloadStorageInfo | null>(
|
|
36
|
+
null
|
|
37
|
+
)
|
|
38
|
+
const [isLoading, setIsLoading] = useState(true)
|
|
39
|
+
const isMounted = useRef(true)
|
|
40
|
+
|
|
41
|
+
const refresh = useCallback(async () => {
|
|
42
|
+
try {
|
|
43
|
+
const info = await DownloadManager.getStorageInfo()
|
|
44
|
+
if (isMounted.current) {
|
|
45
|
+
setStorageInfo(info)
|
|
46
|
+
setIsLoading(false)
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error('[useDownloadStorage] Error:', error)
|
|
50
|
+
if (isMounted.current) {
|
|
51
|
+
setIsLoading(false)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}, [])
|
|
55
|
+
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
isMounted.current = true
|
|
58
|
+
refresh()
|
|
59
|
+
return () => {
|
|
60
|
+
isMounted.current = false
|
|
61
|
+
}
|
|
62
|
+
}, [refresh])
|
|
63
|
+
|
|
64
|
+
const formattedSize = storageInfo
|
|
65
|
+
? formatBytes(storageInfo.totalDownloadedSize)
|
|
66
|
+
: '0 B'
|
|
67
|
+
|
|
68
|
+
const formattedAvailable = storageInfo
|
|
69
|
+
? formatBytes(storageInfo.availableSpace)
|
|
70
|
+
: '0 B'
|
|
71
|
+
|
|
72
|
+
const usagePercentage = storageInfo
|
|
73
|
+
? (storageInfo.totalDownloadedSize / storageInfo.totalSpace) * 100
|
|
74
|
+
: 0
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
storageInfo,
|
|
78
|
+
isLoading,
|
|
79
|
+
refresh,
|
|
80
|
+
formattedSize,
|
|
81
|
+
formattedAvailable,
|
|
82
|
+
usagePercentage,
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { useEffect, useState, useRef, useCallback, useMemo } from 'react'
|
|
2
|
+
import { DownloadManager } from '../index'
|
|
3
|
+
import { downloadCallbackManager } from './downloadCallbackManager'
|
|
4
|
+
import type {
|
|
5
|
+
DownloadedTrack,
|
|
6
|
+
DownloadedPlaylist,
|
|
7
|
+
} from '../types/DownloadTypes'
|
|
8
|
+
|
|
9
|
+
export interface UseDownloadedTracksResult {
|
|
10
|
+
/** All downloaded tracks */
|
|
11
|
+
downloadedTracks: DownloadedTrack[]
|
|
12
|
+
/** All downloaded playlists */
|
|
13
|
+
downloadedPlaylists: DownloadedPlaylist[]
|
|
14
|
+
/** Check if a track is downloaded */
|
|
15
|
+
isTrackDownloaded: (trackId: string) => boolean
|
|
16
|
+
/** Check if a playlist is fully downloaded */
|
|
17
|
+
isPlaylistDownloaded: (playlistId: string) => boolean
|
|
18
|
+
/** Check if a playlist is partially downloaded */
|
|
19
|
+
isPlaylistPartiallyDownloaded: (playlistId: string) => boolean
|
|
20
|
+
/** Get downloaded track info */
|
|
21
|
+
getDownloadedTrack: (trackId: string) => DownloadedTrack | undefined
|
|
22
|
+
/** Get downloaded playlist info */
|
|
23
|
+
getDownloadedPlaylist: (playlistId: string) => DownloadedPlaylist | undefined
|
|
24
|
+
/** Refresh downloaded content list */
|
|
25
|
+
refresh: () => void
|
|
26
|
+
/** Loading state */
|
|
27
|
+
isLoading: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Hook for accessing downloaded tracks and playlists
|
|
32
|
+
*/
|
|
33
|
+
export function useDownloadedTracks(): UseDownloadedTracksResult {
|
|
34
|
+
const [downloadedTracks, setDownloadedTracks] = useState<DownloadedTrack[]>(
|
|
35
|
+
[]
|
|
36
|
+
)
|
|
37
|
+
const [downloadedPlaylists, setDownloadedPlaylists] = useState<
|
|
38
|
+
DownloadedPlaylist[]
|
|
39
|
+
>([])
|
|
40
|
+
const [isLoading, setIsLoading] = useState(true)
|
|
41
|
+
const isMounted = useRef(true)
|
|
42
|
+
|
|
43
|
+
const refresh = useCallback(() => {
|
|
44
|
+
if (!isMounted.current) return
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const tracks = DownloadManager.getAllDownloadedTracks()
|
|
48
|
+
const playlists = DownloadManager.getAllDownloadedPlaylists()
|
|
49
|
+
|
|
50
|
+
if (isMounted.current) {
|
|
51
|
+
setDownloadedTracks(tracks)
|
|
52
|
+
setDownloadedPlaylists(playlists)
|
|
53
|
+
setIsLoading(false)
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error('[useDownloadedTracks] Error refreshing:', error)
|
|
57
|
+
if (isMounted.current) {
|
|
58
|
+
setIsLoading(false)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}, [])
|
|
62
|
+
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
isMounted.current = true
|
|
65
|
+
refresh()
|
|
66
|
+
|
|
67
|
+
const unsubscribeComplete = downloadCallbackManager.subscribeToComplete(
|
|
68
|
+
() => {
|
|
69
|
+
refresh()
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
const unsubscribeStateChange =
|
|
74
|
+
downloadCallbackManager.subscribeToStateChange(
|
|
75
|
+
(_downloadId, _trackId, state) => {
|
|
76
|
+
if (state === 'completed') {
|
|
77
|
+
refresh()
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
return () => {
|
|
83
|
+
isMounted.current = false
|
|
84
|
+
unsubscribeComplete()
|
|
85
|
+
unsubscribeStateChange()
|
|
86
|
+
}
|
|
87
|
+
}, [refresh])
|
|
88
|
+
|
|
89
|
+
const trackMap = useMemo(
|
|
90
|
+
() => new Map(downloadedTracks.map((t) => [t.trackId, t])),
|
|
91
|
+
[downloadedTracks]
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
const playlistMap = useMemo(
|
|
95
|
+
() => new Map(downloadedPlaylists.map((p) => [p.playlistId, p])),
|
|
96
|
+
[downloadedPlaylists]
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
const isTrackDownloaded = useCallback(
|
|
100
|
+
(trackId: string) => trackMap.has(trackId),
|
|
101
|
+
[trackMap]
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
const isPlaylistDownloaded = useCallback(
|
|
105
|
+
(playlistId: string) => {
|
|
106
|
+
const p = playlistMap.get(playlistId)
|
|
107
|
+
return p ? p.isComplete : false
|
|
108
|
+
},
|
|
109
|
+
[playlistMap]
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
const isPlaylistPartiallyDownloaded = useCallback(
|
|
113
|
+
(playlistId: string) => playlistMap.has(playlistId),
|
|
114
|
+
[playlistMap]
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
const getDownloadedTrack = useCallback(
|
|
118
|
+
(trackId: string) => trackMap.get(trackId),
|
|
119
|
+
[trackMap]
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
const getDownloadedPlaylist = useCallback(
|
|
123
|
+
(playlistId: string) => playlistMap.get(playlistId),
|
|
124
|
+
[playlistMap]
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
downloadedTracks,
|
|
129
|
+
downloadedPlaylists,
|
|
130
|
+
isTrackDownloaded,
|
|
131
|
+
isPlaylistDownloaded,
|
|
132
|
+
isPlaylistPartiallyDownloaded,
|
|
133
|
+
getDownloadedTrack,
|
|
134
|
+
getDownloadedPlaylist,
|
|
135
|
+
refresh,
|
|
136
|
+
isLoading,
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback, useRef } from 'react'
|
|
2
|
+
import { Equalizer } from '../index'
|
|
3
|
+
import type { EqualizerBand } from '../types/EqualizerTypes'
|
|
4
|
+
import { equalizerCallbackManager } from './equalizerCallbackManager'
|
|
5
|
+
|
|
6
|
+
export interface UseEqualizerResult {
|
|
7
|
+
/** Whether the equalizer is enabled */
|
|
8
|
+
isEnabled: boolean
|
|
9
|
+
/** Current band settings */
|
|
10
|
+
bands: EqualizerBand[]
|
|
11
|
+
/** Currently applied preset name */
|
|
12
|
+
currentPreset: string | null
|
|
13
|
+
/** Toggle equalizer on/off */
|
|
14
|
+
setEnabled: (enabled: boolean) => boolean
|
|
15
|
+
/** Set gain for a specific band */
|
|
16
|
+
setBandGain: (bandIndex: number, gainDb: number) => boolean
|
|
17
|
+
/** Set all band gains at once */
|
|
18
|
+
setAllBandGains: (gains: number[]) => boolean
|
|
19
|
+
/** Reset to flat response */
|
|
20
|
+
reset: () => void
|
|
21
|
+
/** Whether equalizer is loading */
|
|
22
|
+
isLoading: boolean
|
|
23
|
+
/** Gain range (min/max in dB) */
|
|
24
|
+
gainRange: { min: number; max: number }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const DEFAULT_BANDS: EqualizerBand[] = [
|
|
28
|
+
{ index: 0, centerFrequency: 60, gainDb: 0, frequencyLabel: '60 Hz' },
|
|
29
|
+
{ index: 1, centerFrequency: 230, gainDb: 0, frequencyLabel: '230 Hz' },
|
|
30
|
+
{ index: 2, centerFrequency: 910, gainDb: 0, frequencyLabel: '910 Hz' },
|
|
31
|
+
{ index: 3, centerFrequency: 3600, gainDb: 0, frequencyLabel: '3.6 kHz' },
|
|
32
|
+
{ index: 4, centerFrequency: 14000, gainDb: 0, frequencyLabel: '14 kHz' },
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
export function useEqualizer(): UseEqualizerResult {
|
|
36
|
+
const [isEnabled, setIsEnabledState] = useState(false)
|
|
37
|
+
const [bands, setBands] = useState<EqualizerBand[]>(DEFAULT_BANDS)
|
|
38
|
+
const [currentPreset, setCurrentPreset] = useState<string | null>(null)
|
|
39
|
+
const [isLoading, setIsLoading] = useState(true)
|
|
40
|
+
const [gainRange, setGainRange] = useState({ min: -12, max: 12 })
|
|
41
|
+
const isMounted = useRef(true)
|
|
42
|
+
|
|
43
|
+
// Load initial state
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
isMounted.current = true
|
|
46
|
+
|
|
47
|
+
const loadState = async () => {
|
|
48
|
+
try {
|
|
49
|
+
const state = Equalizer.getState()
|
|
50
|
+
if (isMounted.current) {
|
|
51
|
+
setIsEnabledState(state.enabled)
|
|
52
|
+
setBands(state.bands)
|
|
53
|
+
setCurrentPreset(state.currentPreset)
|
|
54
|
+
|
|
55
|
+
const range = Equalizer.getBandRange()
|
|
56
|
+
setGainRange({ min: range.min, max: range.max })
|
|
57
|
+
|
|
58
|
+
setIsLoading(false)
|
|
59
|
+
}
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error('[useEqualizer] Error loading state:', error)
|
|
62
|
+
if (isMounted.current) {
|
|
63
|
+
setIsLoading(false)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
loadState()
|
|
69
|
+
|
|
70
|
+
return () => {
|
|
71
|
+
isMounted.current = false
|
|
72
|
+
}
|
|
73
|
+
}, [])
|
|
74
|
+
|
|
75
|
+
// Subscribe to enabled changes
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
const unsubscribe = equalizerCallbackManager.subscribeToEnabledChange(
|
|
78
|
+
(enabled) => {
|
|
79
|
+
if (isMounted.current) {
|
|
80
|
+
setIsEnabledState(enabled)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
return unsubscribe
|
|
86
|
+
}, [])
|
|
87
|
+
|
|
88
|
+
// Subscribe to band changes
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
const unsubscribe = equalizerCallbackManager.subscribeToBandChange(
|
|
91
|
+
(newBands) => {
|
|
92
|
+
if (isMounted.current) {
|
|
93
|
+
setBands(newBands)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return unsubscribe
|
|
99
|
+
}, [])
|
|
100
|
+
|
|
101
|
+
// Subscribe to preset changes
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
const unsubscribe = equalizerCallbackManager.subscribeToPresetChange(
|
|
104
|
+
(presetName) => {
|
|
105
|
+
if (isMounted.current) {
|
|
106
|
+
setCurrentPreset(presetName)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
return unsubscribe
|
|
112
|
+
}, [])
|
|
113
|
+
|
|
114
|
+
const setEnabled = useCallback((enabled: boolean): boolean => {
|
|
115
|
+
try {
|
|
116
|
+
return Equalizer.setEnabled(enabled)
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error('[useEqualizer] Error setting enabled:', error)
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
}, [])
|
|
122
|
+
|
|
123
|
+
const setBandGain = useCallback(
|
|
124
|
+
(bandIndex: number, gainDb: number): boolean => {
|
|
125
|
+
// Optimistic update
|
|
126
|
+
setBands((prevBands) =>
|
|
127
|
+
prevBands.map((b) => (b.index === bandIndex ? { ...b, gainDb } : b))
|
|
128
|
+
)
|
|
129
|
+
try {
|
|
130
|
+
return Equalizer.setBandGain(bandIndex, gainDb)
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error('[useEqualizer] Error setting band gain:', error)
|
|
133
|
+
return false
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
[]
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
const setAllBandGains = useCallback((gains: number[]): boolean => {
|
|
140
|
+
// Optimistic update
|
|
141
|
+
setBands((prevBands) =>
|
|
142
|
+
prevBands.map((b, i) => ({ ...b, gainDb: gains[i] ?? b.gainDb }))
|
|
143
|
+
)
|
|
144
|
+
try {
|
|
145
|
+
return Equalizer.setAllBandGains(gains)
|
|
146
|
+
} catch (error) {
|
|
147
|
+
console.error('[useEqualizer] Error setting all band gains:', error)
|
|
148
|
+
return false
|
|
149
|
+
}
|
|
150
|
+
}, [])
|
|
151
|
+
|
|
152
|
+
const reset = useCallback(() => {
|
|
153
|
+
// Optimistic update
|
|
154
|
+
setBands((prevBands) => prevBands.map((b) => ({ ...b, gainDb: 0 })))
|
|
155
|
+
try {
|
|
156
|
+
Equalizer.reset()
|
|
157
|
+
} catch (error) {
|
|
158
|
+
console.error('[useEqualizer] Error resetting equalizer:', error)
|
|
159
|
+
}
|
|
160
|
+
}, [])
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
isEnabled,
|
|
164
|
+
bands,
|
|
165
|
+
currentPreset,
|
|
166
|
+
setEnabled,
|
|
167
|
+
setBandGain,
|
|
168
|
+
setAllBandGains,
|
|
169
|
+
reset,
|
|
170
|
+
isLoading,
|
|
171
|
+
gainRange,
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback, useRef } from 'react'
|
|
2
|
+
import { Equalizer } from '../index'
|
|
3
|
+
import type { EqualizerPreset } from '../types/EqualizerTypes'
|
|
4
|
+
import { equalizerCallbackManager } from './equalizerCallbackManager'
|
|
5
|
+
|
|
6
|
+
export interface UseEqualizerPresetsResult {
|
|
7
|
+
/** All available presets */
|
|
8
|
+
presets: EqualizerPreset[]
|
|
9
|
+
/** Built-in presets only */
|
|
10
|
+
builtInPresets: EqualizerPreset[]
|
|
11
|
+
/** Custom user presets */
|
|
12
|
+
customPresets: EqualizerPreset[]
|
|
13
|
+
/** Apply a preset by name */
|
|
14
|
+
applyPreset: (name: string) => boolean
|
|
15
|
+
/** Save current settings as custom preset */
|
|
16
|
+
saveCustomPreset: (name: string) => boolean
|
|
17
|
+
/** Delete a custom preset */
|
|
18
|
+
deleteCustomPreset: (name: string) => boolean
|
|
19
|
+
/** Currently applied preset name */
|
|
20
|
+
currentPreset: string | null
|
|
21
|
+
/** Whether presets are loading */
|
|
22
|
+
isLoading: boolean
|
|
23
|
+
/** Refresh presets from native */
|
|
24
|
+
refreshPresets: () => void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function useEqualizerPresets(): UseEqualizerPresetsResult {
|
|
28
|
+
const [presets, setPresets] = useState<EqualizerPreset[]>([])
|
|
29
|
+
const [builtInPresets, setBuiltInPresets] = useState<EqualizerPreset[]>([])
|
|
30
|
+
const [customPresets, setCustomPresets] = useState<EqualizerPreset[]>([])
|
|
31
|
+
const [currentPreset, setCurrentPreset] = useState<string | null>(null)
|
|
32
|
+
const [isLoading, setIsLoading] = useState(true)
|
|
33
|
+
const isMounted = useRef(true)
|
|
34
|
+
|
|
35
|
+
const refreshPresets = useCallback(() => {
|
|
36
|
+
try {
|
|
37
|
+
const allPresets = Equalizer.getPresets()
|
|
38
|
+
const builtIn = Equalizer.getBuiltInPresets()
|
|
39
|
+
const custom = Equalizer.getCustomPresets()
|
|
40
|
+
const current = Equalizer.getCurrentPresetName()
|
|
41
|
+
|
|
42
|
+
if (isMounted.current) {
|
|
43
|
+
setPresets(allPresets)
|
|
44
|
+
setBuiltInPresets(builtIn)
|
|
45
|
+
setCustomPresets(custom)
|
|
46
|
+
setCurrentPreset(current)
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error('[useEqualizerPresets] Error refreshing presets:', error)
|
|
50
|
+
}
|
|
51
|
+
}, [])
|
|
52
|
+
|
|
53
|
+
// Load initial presets
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
isMounted.current = true
|
|
56
|
+
|
|
57
|
+
refreshPresets()
|
|
58
|
+
setIsLoading(false)
|
|
59
|
+
|
|
60
|
+
return () => {
|
|
61
|
+
isMounted.current = false
|
|
62
|
+
}
|
|
63
|
+
}, [refreshPresets])
|
|
64
|
+
|
|
65
|
+
// Subscribe to preset changes
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const unsubscribe = equalizerCallbackManager.subscribeToPresetChange(
|
|
68
|
+
(presetName) => {
|
|
69
|
+
if (isMounted.current) {
|
|
70
|
+
setCurrentPreset(presetName)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return unsubscribe
|
|
76
|
+
}, [])
|
|
77
|
+
|
|
78
|
+
const applyPreset = useCallback((name: string): boolean => {
|
|
79
|
+
try {
|
|
80
|
+
const success = Equalizer.applyPreset(name)
|
|
81
|
+
if (success) {
|
|
82
|
+
setCurrentPreset(name)
|
|
83
|
+
}
|
|
84
|
+
return success
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error('[useEqualizerPresets] Error applying preset:', error)
|
|
87
|
+
return false
|
|
88
|
+
}
|
|
89
|
+
}, [])
|
|
90
|
+
|
|
91
|
+
const saveCustomPreset = useCallback(
|
|
92
|
+
(name: string): boolean => {
|
|
93
|
+
try {
|
|
94
|
+
const success = Equalizer.saveCustomPreset(name)
|
|
95
|
+
if (success) {
|
|
96
|
+
refreshPresets()
|
|
97
|
+
}
|
|
98
|
+
return success
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.error(
|
|
101
|
+
'[useEqualizerPresets] Error saving custom preset:',
|
|
102
|
+
error
|
|
103
|
+
)
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
[refreshPresets]
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
const deleteCustomPreset = useCallback(
|
|
111
|
+
(name: string): boolean => {
|
|
112
|
+
try {
|
|
113
|
+
const success = Equalizer.deleteCustomPreset(name)
|
|
114
|
+
if (success) {
|
|
115
|
+
refreshPresets()
|
|
116
|
+
}
|
|
117
|
+
return success
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.error(
|
|
120
|
+
'[useEqualizerPresets] Error deleting custom preset:',
|
|
121
|
+
error
|
|
122
|
+
)
|
|
123
|
+
return false
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
[refreshPresets]
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
presets,
|
|
131
|
+
builtInPresets,
|
|
132
|
+
customPresets,
|
|
133
|
+
applyPreset,
|
|
134
|
+
saveCustomPreset,
|
|
135
|
+
deleteCustomPreset,
|
|
136
|
+
currentPreset,
|
|
137
|
+
isLoading,
|
|
138
|
+
refreshPresets,
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -10,6 +10,7 @@ const DEFAULT_STATE: PlayerState = {
|
|
|
10
10
|
currentState: 'stopped',
|
|
11
11
|
currentPlaylistId: null,
|
|
12
12
|
currentIndex: -1,
|
|
13
|
+
currentPlayingType: 'not-playing',
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
/**
|
|
@@ -50,11 +51,11 @@ export function useNowPlaying(): PlayerState {
|
|
|
50
51
|
const [state, setState] = useState<PlayerState>(DEFAULT_STATE)
|
|
51
52
|
const isMounted = useRef(true)
|
|
52
53
|
|
|
53
|
-
const updateState = useCallback(() => {
|
|
54
|
+
const updateState = useCallback(async () => {
|
|
54
55
|
if (!isMounted.current) return
|
|
55
56
|
|
|
56
57
|
try {
|
|
57
|
-
const newState = TrackPlayer.getState()
|
|
58
|
+
const newState = await TrackPlayer.getState()
|
|
58
59
|
setState(newState)
|
|
59
60
|
} catch (error) {
|
|
60
61
|
console.error('[useNowPlaying] Error updating player state:', error)
|