react-native-audio-browser 0.2.0-next.1 → 0.2.0-next.11

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.
Files changed (290) hide show
  1. package/README.md +22 -18
  2. package/android/build.gradle +13 -10
  3. package/android/gradle.properties +2 -2
  4. package/android/src/main/AndroidManifest.xml +3 -1
  5. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +76 -21
  6. package/android/src/main/java/com/audiobrowser/AudioBrowserLifecycleModule.kt +38 -0
  7. package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +18 -2
  8. package/android/src/main/java/com/audiobrowser/ServiceBinding.kt +48 -0
  9. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +1 -2
  10. package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +1 -2
  11. package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +6 -7
  12. package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +20 -3
  13. package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +11 -11
  14. package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +111 -58
  15. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +9 -5
  16. package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +218 -252
  17. package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +0 -1
  18. package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +2 -4
  19. package/android/src/main/java/com/audiobrowser/player/Player.kt +30 -8
  20. package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +2 -1
  21. package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +2 -1
  22. package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +67 -11
  23. package/android/src/main/java/com/audiobrowser/tls/AiaChasingExtendedTrustManager.kt +168 -0
  24. package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +58 -14
  25. package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +35 -7
  26. package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +278 -59
  27. package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +7 -9
  28. package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +8 -7
  29. package/android/src/test/java/com/audiobrowser/ServiceBindingTest.kt +87 -0
  30. package/android/src/test/java/com/audiobrowser/TestFixtures.kt +52 -1
  31. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +6 -0
  32. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +167 -8
  33. package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +2 -1
  34. package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +2 -4
  35. package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +100 -56
  36. package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +45 -0
  37. package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +3 -4
  38. package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +3 -3
  39. package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +197 -7
  40. package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +325 -4
  41. package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherCallSiteTest.kt +322 -0
  42. package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +83 -0
  43. package/ios/Browser/BrowserManager.swift +2 -27
  44. package/ios/Browser/SearchDrillIn.swift +1 -1
  45. package/ios/CarPlay/RNABMediaAddHandler.swift +6 -6
  46. package/ios/CarPlay/RNABMediaAffinityHandler.swift +2 -2
  47. package/ios/CarPlay/RNABMediaIntentHandler.swift +16 -16
  48. package/ios/HybridAudioBrowser.swift +87 -56
  49. package/ios/Model/NitroTypeStubs.swift +18 -2
  50. package/ios/Model/RemoteCommand.swift +18 -0
  51. package/ios/Model/TrackPlayerError.swift +2 -2
  52. package/ios/Option/SessionCategories.swift +3 -2
  53. package/ios/Player/MediaIntentCriteria.swift +4 -4
  54. package/ios/Player/MediaLoader.swift +3 -1
  55. package/ios/Player/PlaybackCoordinator.swift +4 -1
  56. package/ios/Player/PlaybackErrorHandler.swift +4 -4
  57. package/ios/Player/QueueManager.swift +10 -3
  58. package/ios/Player/RetryManager.swift +79 -18
  59. package/ios/Player/ShuffleOrder.swift +10 -0
  60. package/ios/Player/SleepTimerManager.swift +43 -15
  61. package/ios/RemoteCommand/RemoteCommandCallbacks.swift +47 -0
  62. package/ios/RemoteCommand/RemoteCommandController.swift +9 -6
  63. package/ios/Tests/LRUCacheTests.swift +111 -0
  64. package/ios/Tests/LoadSeekCoordinatorTests.swift +3 -1
  65. package/ios/Tests/MediaIntentCriteriaTests.swift +2 -2
  66. package/ios/Tests/MediaLoaderTests.swift +10 -13
  67. package/ios/Tests/PlaybackCoordinatorTests.swift +10 -7
  68. package/ios/Tests/PlaybackErrorHandlerTests.swift +3 -1
  69. package/ios/Tests/PlayerTimeObserverTests.swift +37 -0
  70. package/ios/Tests/QueueManagerTests.swift +50 -4
  71. package/ios/Tests/RemoteCommandControllerTests.swift +156 -0
  72. package/ios/Tests/RemoteCommandTests.swift +67 -0
  73. package/ios/Tests/RetryManagerTests.swift +89 -0
  74. package/ios/Tests/SectionScopeTests.swift +2 -2
  75. package/ios/Tests/SleepTimerManagerTests.swift +22 -19
  76. package/ios/Tests/Support/ManualSleepTimerScheduler.swift +47 -0
  77. package/ios/Tests/Support/TestTypes.swift +1 -1
  78. package/ios/Tests/TabBarEntriesTests.swift +7 -7
  79. package/ios/TrackPlayer.swift +6 -1
  80. package/ios/TrackPlayerCallbacks.swift +5 -38
  81. package/ios/Util/LRUCache.swift +4 -1
  82. package/lib/commonjs/AudioBrowser.js +0 -11
  83. package/lib/commonjs/AudioBrowser.js.map +1 -1
  84. package/lib/commonjs/CLAUDE.md +52 -0
  85. package/lib/commonjs/features/browser.js +1 -1
  86. package/lib/commonjs/features/browser.js.map +1 -1
  87. package/lib/commonjs/features/carConnection.js +1 -1
  88. package/lib/commonjs/features/equalizer.js +1 -1
  89. package/lib/commonjs/features/errors.js +3 -3
  90. package/lib/commonjs/features/favorites.js +1 -1
  91. package/lib/commonjs/features/gate.js +16 -1
  92. package/lib/commonjs/features/gate.js.map +1 -1
  93. package/lib/commonjs/features/metadata.js +20 -3
  94. package/lib/commonjs/features/metadata.js.map +1 -1
  95. package/lib/commonjs/features/network.js +1 -1
  96. package/lib/commonjs/features/nowPlaying.js +1 -1
  97. package/lib/commonjs/features/output.js +1 -1
  98. package/lib/commonjs/features/playback/playWhenReady.js +1 -1
  99. package/lib/commonjs/features/playback/playing.js +1 -1
  100. package/lib/commonjs/features/playback/progress.js +1 -1
  101. package/lib/commonjs/features/playback/state.js +1 -1
  102. package/lib/commonjs/features/playback/trackPlaybackTime.js +0 -6
  103. package/lib/commonjs/features/playback/trackPlaybackTime.js.map +1 -1
  104. package/lib/commonjs/features/playback/volume.js +1 -1
  105. package/lib/commonjs/features/player/options.js +48 -34
  106. package/lib/commonjs/features/player/options.js.map +1 -1
  107. package/lib/commonjs/features/player/setup.js +15 -8
  108. package/lib/commonjs/features/player/setup.js.map +1 -1
  109. package/lib/commonjs/features/player/validateOptions.js +21 -0
  110. package/lib/commonjs/features/player/validateOptions.js.map +1 -0
  111. package/lib/commonjs/features/queue/activeTrack.js +1 -1
  112. package/lib/commonjs/features/queue/queue.js +2 -2
  113. package/lib/commonjs/features/queue/repeatMode.js +1 -1
  114. package/lib/commonjs/features/queue/shuffle.js +1 -1
  115. package/lib/commonjs/features/remoteControls.js +13 -92
  116. package/lib/commonjs/features/remoteControls.js.map +1 -1
  117. package/lib/commonjs/features/sleepTimer.js +13 -1
  118. package/lib/commonjs/features/sleepTimer.js.map +1 -1
  119. package/lib/commonjs/test-utils/reactNativeStub.js +65 -0
  120. package/lib/commonjs/test-utils/reactNativeStub.js.map +1 -0
  121. package/lib/commonjs/utils/LazyNativeEmitter.js +8 -5
  122. package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
  123. package/lib/commonjs/web/NativeAudioBrowser.js +1 -1
  124. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
  125. package/lib/commonjs/web/browser/BrowserManager.js +1 -1
  126. package/lib/module/AudioBrowser.js +1 -1
  127. package/lib/module/AudioBrowser.js.map +1 -1
  128. package/lib/module/CLAUDE.md +52 -0
  129. package/lib/module/features/browser.js +1 -1
  130. package/lib/module/features/browser.js.map +1 -1
  131. package/lib/module/features/carConnection.js +1 -1
  132. package/lib/module/features/equalizer.js +1 -1
  133. package/lib/module/features/errors.js +3 -3
  134. package/lib/module/features/favorites.js +1 -1
  135. package/lib/module/features/gate.js +16 -1
  136. package/lib/module/features/gate.js.map +1 -1
  137. package/lib/module/features/metadata.js +20 -3
  138. package/lib/module/features/metadata.js.map +1 -1
  139. package/lib/module/features/network.js +1 -1
  140. package/lib/module/features/nowPlaying.js +1 -1
  141. package/lib/module/features/output.js +1 -1
  142. package/lib/module/features/playback/playWhenReady.js +1 -1
  143. package/lib/module/features/playback/playing.js +1 -1
  144. package/lib/module/features/playback/progress.js +1 -1
  145. package/lib/module/features/playback/state.js +1 -1
  146. package/lib/module/features/playback/trackPlaybackTime.js +0 -5
  147. package/lib/module/features/playback/trackPlaybackTime.js.map +1 -1
  148. package/lib/module/features/playback/volume.js +1 -1
  149. package/lib/module/features/player/options.js +47 -32
  150. package/lib/module/features/player/options.js.map +1 -1
  151. package/lib/module/features/player/setup.js +14 -7
  152. package/lib/module/features/player/setup.js.map +1 -1
  153. package/lib/module/features/player/validateOptions.js +17 -0
  154. package/lib/module/features/player/validateOptions.js.map +1 -0
  155. package/lib/module/features/queue/activeTrack.js +1 -1
  156. package/lib/module/features/queue/queue.js +2 -2
  157. package/lib/module/features/queue/repeatMode.js +1 -1
  158. package/lib/module/features/queue/shuffle.js +1 -1
  159. package/lib/module/features/remoteControls.js +13 -92
  160. package/lib/module/features/remoteControls.js.map +1 -1
  161. package/lib/module/features/sleepTimer.js +13 -1
  162. package/lib/module/features/sleepTimer.js.map +1 -1
  163. package/lib/module/test-utils/reactNativeStub.js +58 -0
  164. package/lib/module/test-utils/reactNativeStub.js.map +1 -0
  165. package/lib/module/utils/LazyNativeEmitter.js +8 -5
  166. package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
  167. package/lib/module/web/NativeAudioBrowser.js +1 -1
  168. package/lib/module/web/NativeAudioBrowser.js.map +1 -1
  169. package/lib/module/web/browser/BrowserManager.js +1 -1
  170. package/lib/typescript/src/AudioBrowser.d.ts +0 -1
  171. package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
  172. package/lib/typescript/src/features/carConnection.d.ts +1 -1
  173. package/lib/typescript/src/features/equalizer.d.ts +1 -1
  174. package/lib/typescript/src/features/errors.d.ts +3 -3
  175. package/lib/typescript/src/features/favorites.d.ts +1 -1
  176. package/lib/typescript/src/features/gate.d.ts +18 -2
  177. package/lib/typescript/src/features/gate.d.ts.map +1 -1
  178. package/lib/typescript/src/features/metadata.d.ts +20 -3
  179. package/lib/typescript/src/features/metadata.d.ts.map +1 -1
  180. package/lib/typescript/src/features/network.d.ts +1 -1
  181. package/lib/typescript/src/features/nowPlaying.d.ts +1 -1
  182. package/lib/typescript/src/features/output.d.ts +1 -1
  183. package/lib/typescript/src/features/playback/playWhenReady.d.ts +1 -1
  184. package/lib/typescript/src/features/playback/playing.d.ts +1 -1
  185. package/lib/typescript/src/features/playback/progress.d.ts +1 -1
  186. package/lib/typescript/src/features/playback/state.d.ts +1 -1
  187. package/lib/typescript/src/features/playback/volume.d.ts +1 -1
  188. package/lib/typescript/src/features/player/options.d.ts +87 -37
  189. package/lib/typescript/src/features/player/options.d.ts.map +1 -1
  190. package/lib/typescript/src/features/player/setup.d.ts +14 -4
  191. package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
  192. package/lib/typescript/src/features/player/validateOptions.d.ts +9 -0
  193. package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -0
  194. package/lib/typescript/src/features/queue/activeTrack.d.ts +1 -1
  195. package/lib/typescript/src/features/queue/queue.d.ts +2 -2
  196. package/lib/typescript/src/features/queue/repeatMode.d.ts +1 -1
  197. package/lib/typescript/src/features/queue/shuffle.d.ts +1 -1
  198. package/lib/typescript/src/features/remoteControls.d.ts +23 -22
  199. package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
  200. package/lib/typescript/src/features/sleepTimer.d.ts +1 -1
  201. package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -1
  202. package/lib/typescript/src/test-utils/reactNativeStub.d.ts +36 -0
  203. package/lib/typescript/src/test-utils/reactNativeStub.d.ts.map +1 -0
  204. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +8 -4
  205. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
  206. package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +1 -1
  207. package/nitrogen/generated/android/c++/JAndroidOptions.hpp +10 -10
  208. package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +5 -5
  209. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +11 -11
  210. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +1 -1
  211. package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +5 -5
  212. package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +5 -5
  213. package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +10 -10
  214. package/nitrogen/generated/android/c++/JOptions.hpp +5 -5
  215. package/nitrogen/generated/android/c++/{JNotificationButton.hpp → JRemoteButton.hpp} +19 -19
  216. package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +86 -0
  217. package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +26 -0
  218. package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +75 -0
  219. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +3 -3
  220. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1 -1
  221. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +3 -3
  222. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NotificationButton.kt → RemoteButton.kt} +3 -3
  223. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +44 -0
  224. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Variant_NullType_NotificationButtonLayout.kt → Variant_NullType_RemoteButtonLayout.kt} +9 -9
  225. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +36 -51
  226. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +6 -6
  227. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +8 -8
  228. package/nitrogen/generated/ios/swift/AndroidOptions.swift +12 -12
  229. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +1 -1
  230. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2 -2
  231. package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +12 -12
  232. package/nitrogen/generated/ios/swift/{NotificationButton.swift → RemoteButton.swift} +6 -6
  233. package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +57 -0
  234. package/nitrogen/generated/ios/swift/{Variant_NullType_NotificationButtonLayout.swift → Variant_NullType_RemoteButtonLayout.swift} +3 -3
  235. package/nitrogen/generated/shared/c++/AndroidOptions.hpp +8 -8
  236. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +1 -1
  237. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +1 -1
  238. package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +8 -8
  239. package/nitrogen/generated/shared/c++/{NotificationButton.hpp → RemoteButton.hpp} +19 -19
  240. package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +94 -0
  241. package/package.json +12 -4
  242. package/src/AudioBrowser.ts +1 -1
  243. package/src/CLAUDE.md +52 -0
  244. package/src/features/battery.test.ts +79 -0
  245. package/src/features/browser.ts +1 -1
  246. package/src/features/carConnection.ts +1 -1
  247. package/src/features/equalizer.ts +1 -1
  248. package/src/features/errors.ts +3 -3
  249. package/src/features/favorites.ts +1 -1
  250. package/src/features/gate.ts +16 -1
  251. package/src/features/hook-wiring.test.ts +254 -0
  252. package/src/features/metadata.ts +20 -3
  253. package/src/features/network.ts +1 -1
  254. package/src/features/nowPlaying.ts +1 -1
  255. package/src/features/output.ts +1 -1
  256. package/src/features/playback/playWhenReady.ts +1 -1
  257. package/src/features/playback/playing.ts +1 -1
  258. package/src/features/playback/progress.test.ts +169 -0
  259. package/src/features/playback/progress.ts +1 -1
  260. package/src/features/playback/state.ts +1 -1
  261. package/src/features/playback/trackPlaybackTime.test.ts +16 -6
  262. package/src/features/playback/trackPlaybackTime.ts +0 -5
  263. package/src/features/playback/volume.ts +1 -1
  264. package/src/features/player/options.ts +99 -57
  265. package/src/features/player/setup.test.ts +12 -4
  266. package/src/features/player/setup.ts +19 -9
  267. package/src/features/player/validateOptions.ts +19 -0
  268. package/src/features/queue/activeTrack.ts +1 -1
  269. package/src/features/queue/queue.ts +2 -2
  270. package/src/features/queue/repeatMode.ts +1 -1
  271. package/src/features/queue/shuffle.ts +1 -1
  272. package/src/features/remoteControls.ts +13 -92
  273. package/src/features/sleepTimer.test.ts +172 -0
  274. package/src/features/sleepTimer.ts +9 -1
  275. package/src/nitro-stub-drift.test.ts +237 -0
  276. package/src/public-surface.test.ts +107 -0
  277. package/src/specs/audio-browser.nitro.ts +1 -1
  278. package/src/test-utils/reactNativeStub.ts +60 -0
  279. package/src/utils/LazyNativeEmitter.ts +9 -6
  280. package/src/utils/useDebug.test.ts +182 -0
  281. package/src/utils/useNativeUpdatedValue.test.ts +103 -0
  282. package/src/web/NativeAudioBrowser.ts +1 -1
  283. package/src/web/browser/BrowserManager.ts +1 -1
  284. package/ios/Model/MediaURL.swift +0 -67
  285. package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +0 -94
  286. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +0 -26
  287. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +0 -75
  288. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +0 -50
  289. package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +0 -92
  290. package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +0 -102
@@ -3,6 +3,7 @@
3
3
  import { nativeBrowser } from '../../native';
4
4
  import { NativeUpdatedValue } from '../../utils/NativeUpdatedValue';
5
5
  import { useNativeUpdatedValue } from '../../utils/useNativeUpdatedValue';
6
+ import { validateIOSUpdateOptions } from './validateOptions';
6
7
 
7
8
  // MARK: - Types
8
9
 
@@ -24,34 +25,64 @@ import { useNativeUpdatedValue } from '../../utils/useNativeUpdatedValue';
24
25
  */
25
26
 
26
27
  /**
27
- * Buttons that can be assigned to Android notification button slots.
28
- * These represent the interactive buttons users can tap in the notification.
28
+ * Buttons that can be placed in the Android button layout — the interactive
29
+ * controls a listener taps in the notification, on the Android Auto Now Playing
30
+ * screen, and in the Android 13+ system media controls.
29
31
  */
30
32
 
31
33
  /**
32
- * Configuration for notification button layout on Android.
33
- * Allows explicit control over which buttons appear in which slots.
34
+ * Where each button sits on Android.
34
35
  *
35
- * Slot behavior:
36
- * - **Omit a slot**: Derive from capabilities (smart default)
37
- * - **Set to null**: Explicitly empty slot
38
- * - **Set to button**: Show that button in that slot
36
+ * Android offers exactly three positions, and play/pause always occupies the
37
+ * centre — you cannot move it, and you cannot put two buttons on the same side
38
+ * of it:
39
+ *
40
+ * ```
41
+ * back │ ▶ play/pause │ forward overflow ⋯
42
+ * ```
43
+ *
44
+ * - **`back`** — the single position left of play/pause
45
+ * - **`forward`** — the single position right of play/pause
46
+ * - **`overflow`** — everything else, in priority order
47
+ *
48
+ * **A layout describes the whole arrangement.** All three fields are required —
49
+ * there is no per-field merge with the capability defaults, so what you write is
50
+ * exactly what renders. Use `undefined` for an empty position and `[]` for no
51
+ * overflow. To go back to the derived defaults, omit `remoteButtonLayout`
52
+ * entirely (or set it to `null`); that is the only switch.
53
+ *
54
+ * **Overflow order is priority, not coordinates.** Each surface renders as many
55
+ * buttons as it has room for, taking them from the front — a phone
56
+ * notification, the Android 13+ system media controls, and a car head unit all
57
+ * have different budgets. A head unit with a spare slot may promote the first
58
+ * overflow entry onto the main row, and a long list gets truncated by whichever
59
+ * surface is showing it. Put what matters most first.
60
+ *
61
+ * Placement never changes what a control *can* do: a button left out entirely
62
+ * still responds to a Bluetooth remote or headset, as long as its
63
+ * {@link PlayerCapabilities} entry is enabled.
39
64
  *
40
65
  * @example
41
66
  * ```typescript
42
- * // Podcast-style: jump buttons as primary
43
- * notificationButtons: {
67
+ * // Podcast-style: jump either side of play/pause
68
+ * remoteButtonLayout: {
44
69
  * back: 'jump-backward',
45
70
  * forward: 'jump-forward',
46
- * overflow: ['favorite']
71
+ * overflow: ['skip-to-previous', 'skip-to-next', 'favorite']
47
72
  * }
48
73
  *
49
- * // Music-style: skip as primary, jump as secondary
50
- * notificationButtons: {
74
+ * // Music-style: skip either side of play/pause
75
+ * remoteButtonLayout: {
51
76
  * back: 'skip-to-previous',
52
77
  * forward: 'skip-to-next',
53
- * backSecondary: 'jump-backward',
54
- * forwardSecondary: 'jump-forward'
78
+ * overflow: ['favorite']
79
+ * }
80
+ *
81
+ * // Live radio: forward only, nothing to the left
82
+ * remoteButtonLayout: {
83
+ * back: undefined,
84
+ * forward: 'skip-to-next',
85
+ * overflow: []
55
86
  * }
56
87
  * ```
57
88
  */
@@ -135,22 +166,6 @@ import { useNativeUpdatedValue } from '../../utils/useNativeUpdatedValue';
135
166
 
136
167
  // MARK: - Functions
137
168
 
138
- const MAX_CARPLAY_NOW_PLAYING_BUTTONS = 5;
139
-
140
- /**
141
- * Warns when more CarPlay now-playing buttons are configured than CarPlay renders.
142
- * Shared by {@link updateOptions} and `setupPlayer` (both can carry `ios` options).
143
- *
144
- * @internal Validation helper, not public API — `stripInternal` removes it from
145
- * the published types and typedoc hides it from the docs.
146
- */
147
- export function validateIOSUpdateOptions(ios) {
148
- const buttons = ios?.carPlayNowPlayingButtons;
149
- if (buttons && buttons.length > MAX_CARPLAY_NOW_PLAYING_BUTTONS) {
150
- console.warn(`[react-native-audio-browser] ${buttons.length} CarPlay now-playing ` + `buttons configured; CarPlay shows at most ${MAX_CARPLAY_NOW_PLAYING_BUTTONS}.`);
151
- }
152
- }
153
-
154
169
  /**
155
170
  * Updates the configuration for the components.
156
171
  * Pass only the properties you want to change - all properties are optional.
@@ -195,7 +210,7 @@ export function getOptions() {
195
210
  /**
196
211
  * Subscribes to player options changes.
197
212
  * @param callback - Called when the player options change
198
- * @returns Cleanup function to unsubscribe
213
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
199
214
  */
200
215
  export const onOptionsChanged = NativeUpdatedValue.emitterize(cb => nativeBrowser.onOptionsChanged = cb);
201
216
 
@@ -1 +1 @@
1
- {"version":3,"names":["nativeBrowser","NativeUpdatedValue","useNativeUpdatedValue","MAX_CARPLAY_NOW_PLAYING_BUTTONS","validateIOSUpdateOptions","ios","buttons","carPlayNowPlayingButtons","length","console","warn","updateOptions","options","getOptions","onOptionsChanged","emitterize","cb","useOptions"],"sourceRoot":"../../../../src","sources":["features/player/options.ts"],"mappings":";;AAEA,SAASA,aAAa,QAAQ,cAAc;AAC5C,SAASC,kBAAkB,QAAQ,gCAAgC;AACnE,SAASC,qBAAqB,QAAQ,mCAAmC;;AAEzE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA+FA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkCA;AACA;AACA;AACA;;AA4EA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;;AA6BA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA6CA;AACA;AACA;AACA;;AA8BA;;AAEA,MAAMC,+BAA+B,GAAG,CAAC;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAACC,GAAsB,EAAQ;EACrE,MAAMC,OAAO,GAAGD,GAAG,EAAEE,wBAAwB;EAC7C,IAAID,OAAO,IAAIA,OAAO,CAACE,MAAM,GAAGL,+BAA+B,EAAE;IAC/DM,OAAO,CAACC,IAAI,CACV,gCAAgCJ,OAAO,CAACE,MAAM,uBAAuB,GACnE,6CAA6CL,+BAA+B,GAChF,CAAC;EACH;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASQ,aAAaA,CAACC,OAAsB,EAAQ;EAC1DR,wBAAwB,CAACQ,OAAO,CAACP,GAAG,CAAC;EACrCL,aAAa,CAACW,aAAa,CAACC,OAAO,CAAC;AACtC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAY;EACpC,OAAOb,aAAa,CAACa,UAAU,CAAC,CAAC;AACnC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAGb,kBAAkB,CAACc,UAAU,CAC1DC,EAAE,IAAMhB,aAAa,CAACc,gBAAgB,GAAGE,EAC5C,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAY;EACpC,OAAOf,qBAAqB,CAACW,UAAU,EAAEC,gBAAgB,CAAC;AAC5D","ignoreList":[]}
1
+ {"version":3,"names":["nativeBrowser","NativeUpdatedValue","useNativeUpdatedValue","validateIOSUpdateOptions","updateOptions","options","ios","getOptions","onOptionsChanged","emitterize","cb","useOptions"],"sourceRoot":"../../../../src","sources":["features/player/options.ts"],"mappings":";;AAEA,SAASA,aAAa,QAAQ,cAAc;AAC5C,SAASC,kBAAkB,QAAQ,gCAAgC;AACnE,SAASC,qBAAqB,QAAQ,mCAAmC;AACzE,SAASC,wBAAwB,QAAQ,mBAAmB;;AAE5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAgGA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA4CA;AACA;AACA;AACA;;AA4EA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;;AA6BA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAuDA;AACA;AACA;AACA;;AAwCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAACC,OAAsB,EAAQ;EAC1DF,wBAAwB,CAACE,OAAO,CAACC,GAAG,CAAC;EACrCN,aAAa,CAACI,aAAa,CAACC,OAAO,CAAC;AACtC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,UAAUA,CAAA,EAAY;EACpC,OAAOP,aAAa,CAACO,UAAU,CAAC,CAAC;AACnC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAGP,kBAAkB,CAACQ,UAAU,CAC1DC,EAAE,IAAMV,aAAa,CAACQ,gBAAgB,GAAGE,EAC5C,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAY;EACpC,OAAOT,qBAAqB,CAACK,UAAU,EAAEC,gBAAgB,CAAC;AAC5D","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  // MARK: - Types
4
4
 
5
5
  import { nativeBrowser } from '../../native';
6
- import { validateIOSUpdateOptions } from './options';
6
+ import { validateIOSUpdateOptions } from './validateOptions';
7
7
 
8
8
  /**
9
9
  * Parameters passed to the {@link FormatNowPlayingCallback}.
@@ -220,7 +220,7 @@ import { validateIOSUpdateOptions } from './options';
220
220
 
221
221
  /**
222
222
  * Android setup options: the engine-construction fields plus the Android runtime options
223
- * ({@link AndroidUpdateOptions} — `notificationButtons`, `skipSilence`, …), all expressible at
223
+ * ({@link AndroidUpdateOptions} — `remoteButtonLayout`, `skipSilence`, …), all expressible at
224
224
  * launch. The consumer never has to know which is which; `setupPlayer` routes each field to
225
225
  * where it's applied.
226
226
  */
@@ -287,7 +287,7 @@ function wrapNowPlayingFormatter(formatter) {
287
287
 
288
288
  /**
289
289
  * The object's entries whose values aren't `undefined`. `null` stays: it's meaningful on some
290
- * fields (`progressUpdateEventInterval: null` disables progress events, `notificationButtons:
290
+ * fields (`progressUpdateEventInterval: null` disables progress events, `remoteButtonLayout:
291
291
  * null` empties the layout), so only `undefined` means "not provided".
292
292
  */
293
293
  function definedFields(obj) {
@@ -308,7 +308,7 @@ function nonEmpty(key, value) {
308
308
  /**
309
309
  * Initializes the player with the specified options — the full launch description in one
310
310
  * declarative, atomic call. Runtime options (`capabilities`, jump intervals,
311
- * `notificationButtons`, …) and the initial `playWhenReady` / `repeatMode` are applied
311
+ * `remoteButtonLayout`, …) and the initial `playWhenReady` / `repeatMode` are applied
312
312
  * natively as part of setup itself, so there is no setup-then-command ordering for consumers
313
313
  * to know about, and no window where the player exists without its options.
314
314
  *
@@ -325,7 +325,14 @@ function nonEmpty(key, value) {
325
325
  * playWhenReady: true,
326
326
  * repeatMode: 'queue',
327
327
  * capabilities: { favorite: true },
328
- * android: { audioContentType: 'music', notificationButtons: { overflow: ['favorite'] } },
328
+ * android: {
329
+ * audioContentType: 'music',
330
+ * remoteButtonLayout: {
331
+ * back: 'jump-backward',
332
+ * forward: 'jump-forward',
333
+ * overflow: ['favorite']
334
+ * }
335
+ * },
329
336
  * ios: { category: 'playback' }
330
337
  * })
331
338
  * ```
@@ -348,7 +355,7 @@ export async function setupPlayer(options = {}) {
348
355
  const {
349
356
  appKilledPlaybackBehavior,
350
357
  skipSilence,
351
- notificationButtons,
358
+ remoteButtonLayout,
352
359
  ...androidSetup
353
360
  } = android;
354
361
  const {
@@ -371,7 +378,7 @@ export async function setupPlayer(options = {}) {
371
378
  ...nonEmpty('android', definedFields({
372
379
  appKilledPlaybackBehavior,
373
380
  skipSilence,
374
- notificationButtons
381
+ remoteButtonLayout
375
382
  })),
376
383
  ...nonEmpty('ios', iosUpdate)
377
384
  });
@@ -1 +1 @@
1
- {"version":3,"names":["nativeBrowser","validateIOSUpdateOptions","resolveNowPlaying","value","autoUpdateNowPlayingMetadata","nowPlayingMetadataFormatter","wrapNowPlayingFormatter","undefined","formatter","params","definedFields","obj","out","key","nonEmpty","Object","keys","length","setupPlayer","options","nowPlaying","capabilities","forwardJumpInterval","backwardJumpInterval","progressUpdateEventInterval","android","ios","nativeSetup","appKilledPlaybackBehavior","skipSilence","notificationButtons","androidSetup","playbackRates","carPlayUpNextButton","carPlayNowPlayingButtons","iosSetup","iosUpdate","updates"],"sourceRoot":"../../../../src","sources":["features/player/setup.ts"],"mappings":";;AAAA;;AAYA,SAASA,aAAa,QAAQ,cAAc;AAC5C,SAASC,wBAAwB,QAAQ,WAAW;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsBA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AA2GA;;AA4CA;AACA;AACA;AACA;AACA;;AAgCA;;AAEA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;;AA0EA;;AAMA;AACA,SAASC,iBAAiBA,CACxBC,KAAuC,EACjB;EACtB,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE;IAC/B,OAAO;MACLC,4BAA4B,EAAE,IAAI;MAClCC,2BAA2B,EAAEC,uBAAuB,CAACH,KAAK;IAC5D,CAAC;EACH;EACA;EACA,OAAO;IACLC,4BAA4B,EAAED,KAAK,IAAI,IAAI;IAC3CE,2BAA2B,EAAEE;EAC/B,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASD,uBAAuBA,CAC9BE,SAAmC,EACT;EAC1B,OAAQC,MAAM,IAAKD,SAAS,CAACC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASC,aAAaA,CAAmBC,GAAM,EAAc;EAC3D,MAAMC,GAAe,GAAG,CAAC,CAAC;EAC1B,KAAK,MAAMC,GAAG,IAAIF,GAAG,EAAE;IACrB,IAAIA,GAAG,CAACE,GAAG,CAAC,KAAKN,SAAS,EAAEK,GAAG,CAACC,GAAG,CAAC,GAAGF,GAAG,CAACE,GAAG,CAAC;EACjD;EACA,OAAOD,GAAG;AACZ;;AAEA;AACA,SAASE,QAAQA,CACfD,GAAM,EACNV,KAAQ,EACU;EAClB,OAAOY,MAAM,CAACC,IAAI,CAACb,KAAK,CAAC,CAACc,MAAM,GAAG,CAAC,GAC/B;IAAE,CAACJ,GAAG,GAAGV;EAAM,CAAC,GACjB,CAAC,CAAC;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAee,WAAWA,CAC/BC,OAA2B,GAAG,CAAC,CAAC,EACjB;EACf,MAAM;IACJC,UAAU;IACVC,YAAY;IACZC,mBAAmB;IACnBC,oBAAoB;IACpBC,2BAA2B;IAC3BC,OAAO,GAAG,CAAC,CAAC;IACZC,GAAG,GAAG,CAAC,CAAC;IACR,GAAGC;EACL,CAAC,GAAGR,OAAO;;EAEX;EACA;EACA;EACA,MAAM;IACJS,yBAAyB;IACzBC,WAAW;IACXC,mBAAmB;IACnB,GAAGC;EACL,CAAC,GAAGN,OAAO;EACX,MAAM;IACJO,aAAa;IACbC,mBAAmB;IACnBC,wBAAwB;IACxB,GAAGC;EACL,CAAC,GAAGT,GAAG;EACP,MAAMU,SAAS,GAAG1B,aAAa,CAAC;IAC9BsB,aAAa;IACbC,mBAAmB;IACnBC;EACF,CAAC,CAAC;EACFjC,wBAAwB,CAACmC,SAAS,CAAC;EAEnC,MAAMC,OAA4B,GAAG3B,aAAa,CAAC;IACjDW,YAAY;IACZC,mBAAmB;IACnBC,oBAAoB;IACpBC,2BAA2B;IAC3B,GAAGV,QAAQ,CACT,SAAS,EACTJ,aAAa,CAAC;MACZkB,yBAAyB;MACzBC,WAAW;MACXC;IACF,CAAC,CACH,CAAC;IACD,GAAGhB,QAAQ,CAAC,KAAK,EAAEsB,SAAS;EAC9B,CAAC,CAAC;EAEF,OAAOpC,aAAa,CAACkB,WAAW,CAAC;IAC/B,GAAGS,WAAW;IACd,GAAGb,QAAQ,CAAC,SAAS,EAAEJ,aAAa,CAACqB,YAAY,CAAC,CAAC;IACnD,GAAGjB,QAAQ,CAAC,KAAK,EAAEJ,aAAa,CAACyB,QAAQ,CAAC,CAAC;IAC3C,GAAGjC,iBAAiB,CAACkB,UAAU,CAAC;IAChC,GAAGN,QAAQ,CAAC,SAAS,EAAEuB,OAAO;EAChC,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["nativeBrowser","validateIOSUpdateOptions","resolveNowPlaying","value","autoUpdateNowPlayingMetadata","nowPlayingMetadataFormatter","wrapNowPlayingFormatter","undefined","formatter","params","definedFields","obj","out","key","nonEmpty","Object","keys","length","setupPlayer","options","nowPlaying","capabilities","forwardJumpInterval","backwardJumpInterval","progressUpdateEventInterval","android","ios","nativeSetup","appKilledPlaybackBehavior","skipSilence","remoteButtonLayout","androidSetup","playbackRates","carPlayUpNextButton","carPlayNowPlayingButtons","iosSetup","iosUpdate","updates"],"sourceRoot":"../../../../src","sources":["features/player/setup.ts"],"mappings":";;AAAA;;AAYA,SAASA,aAAa,QAAQ,cAAc;AAC5C,SAASC,wBAAwB,QAAQ,mBAAmB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAyBA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AA2GA;;AA4CA;AACA;AACA;AACA;AACA;;AAgCA;;AAEA;AACA;AACA;AACA;;AAMA;AACA;AA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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ const MAX_CARPLAY_NOW_PLAYING_BUTTONS = 5;
4
+
5
+ /**
6
+ * Warns when more CarPlay now-playing buttons are configured than CarPlay renders.
7
+ * Shared by `updateOptions` and `setupPlayer` (both can carry `ios` options).
8
+ * Kept out of `options.ts`, which the barrel re-exports — see
9
+ * public-surface.test.ts.
10
+ */
11
+ export function validateIOSUpdateOptions(ios) {
12
+ const buttons = ios?.carPlayNowPlayingButtons;
13
+ if (buttons && buttons.length > MAX_CARPLAY_NOW_PLAYING_BUTTONS) {
14
+ console.warn(`[react-native-audio-browser] ${buttons.length} CarPlay now-playing ` + `buttons configured; CarPlay shows at most ${MAX_CARPLAY_NOW_PLAYING_BUTTONS}.`);
15
+ }
16
+ }
17
+ //# sourceMappingURL=validateOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MAX_CARPLAY_NOW_PLAYING_BUTTONS","validateIOSUpdateOptions","ios","buttons","carPlayNowPlayingButtons","length","console","warn"],"sourceRoot":"../../../../src","sources":["features/player/validateOptions.ts"],"mappings":";;AAEA,MAAMA,+BAA+B,GAAG,CAAC;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAACC,GAAsB,EAAQ;EACrE,MAAMC,OAAO,GAAGD,GAAG,EAAEE,wBAAwB;EAC7C,IAAID,OAAO,IAAIA,OAAO,CAACE,MAAM,GAAGL,+BAA+B,EAAE;IAC/DM,OAAO,CAACC,IAAI,CACV,gCAAgCJ,OAAO,CAACE,MAAM,uBAAuB,GACnE,6CAA6CL,+BAA+B,GAChF,CAAC;EACH;AACF","ignoreList":[]}
@@ -30,7 +30,7 @@ export function getActiveTrackIndex() {
30
30
  /**
31
31
  * Subscribes to active track change events.
32
32
  * @param callback - Called when the active track changes
33
- * @returns Cleanup function to unsubscribe
33
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
34
34
  */
35
35
  export const onActiveTrackChanged = NativeUpdatedValue.emitterize(cb => nativeBrowser.onPlaybackActiveTrackChanged = cb);
36
36
 
@@ -145,7 +145,7 @@ export function getQueue() {
145
145
  /**
146
146
  * Subscribes to playback queue ended events.
147
147
  * @param callback - Called when playback has paused due to reaching the end of the queue
148
- * @returns Cleanup function to unsubscribe
148
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
149
149
  */
150
150
  export const onQueueEnded = NativeUpdatedValue.emitterize(cb => nativeBrowser.onPlaybackQueueEnded = cb);
151
151
 
@@ -153,7 +153,7 @@ export const onQueueEnded = NativeUpdatedValue.emitterize(cb => nativeBrowser.on
153
153
  * Subscribes to queue change events.
154
154
  * Called when tracks are added, removed, reordered, or when track metadata changes.
155
155
  * @param callback - Called with the updated queue
156
- * @returns Cleanup function to unsubscribe
156
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
157
157
  */
158
158
  export const onQueueChanged = NativeUpdatedValue.emitterize(cb => nativeBrowser.onPlaybackQueueChanged = cb);
159
159
 
@@ -36,7 +36,7 @@ export function setRepeatMode(repeatMode) {
36
36
  /**
37
37
  * Subscribes to repeat mode changes.
38
38
  * @param callback - Called when repeat mode changes
39
- * @returns Cleanup function to unsubscribe
39
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
40
40
  */
41
41
  export const onRepeatModeChanged = NativeUpdatedValue.emitterize(cb => nativeBrowser.onPlaybackRepeatModeChanged = cb);
42
42
 
@@ -34,7 +34,7 @@ export function toggleShuffle() {
34
34
  /**
35
35
  * Subscribes to shuffle mode changes.
36
36
  * @param callback - Called when shuffle mode changes
37
- * @returns Cleanup function to unsubscribe
37
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
38
38
  */
39
39
  export const onShuffleChanged = NativeUpdatedValue.emitterize(cb => nativeBrowser.onPlaybackShuffleModeChanged = cb);
40
40
 
@@ -29,90 +29,11 @@ import { LazyNativeEmitter } from '../utils/LazyNativeEmitter';
29
29
  * Remote skip event (Android only).
30
30
  */
31
31
 
32
- // MARK: - Default Handlers
33
-
34
- // Install remote control handlers with default behavior immediately when module loads
35
- // Custom handlers can override the defaults using handleRemote* functions
36
-
37
- // Basic playback controls
38
- // AudioBrowser.onRemotePlay(() => {
39
- // const customHandler = customHandlers.get('play')
40
- // if (customHandler) {
41
- // customHandler()
42
- // } else {
43
- // play()
44
- // }
45
- // })
46
-
47
- // AudioBrowser.onRemotePause(() => {
48
- // const customHandler = customHandlers.get('pause')
49
- // if (customHandler) {
50
- // customHandler()
51
- // } else {
52
- // pause()
53
- // }
54
- // })
55
-
56
- // AudioBrowser.onRemoteNext(() => {
57
- // const customHandler = customHandlers.get('next')
58
- // if (customHandler) {
59
- // customHandler()
60
- // } else {
61
- // skipToNext()
62
- // }
63
- // })
64
-
65
- // AudioBrowser.onRemotePrevious(() => {
66
- // const customHandler = customHandlers.get('previous')
67
- // if (customHandler) {
68
- // customHandler()
69
- // } else {
70
- // skipToPrevious()
71
- // }
72
- // })
73
-
74
- // AudioBrowser.onRemoteStop(() => {
75
- // const customHandler = customHandlers.get('stop')
76
- // if (customHandler) {
77
- // customHandler()
78
- // } else {
79
- // stop()
80
- // }
81
- // })
82
-
83
- // // Seek controls
84
- // AudioBrowser.onRemoteSeek((event: any) => {
85
- // const customHandler = customHandlers.get('seek')
86
- // if (customHandler) {
87
- // customHandler(event)
88
- // } else {
89
- // seekTo(event.position)
90
- // }
91
- // })
92
-
93
- // AudioBrowser.onRemoteJumpForward((event: any) => {
94
- // const customHandler = customHandlers.get('jumpForward')
95
- // if (customHandler) {
96
- // customHandler(event)
97
- // } else {
98
- // seekBy(event.interval)
99
- // }
100
- // })
101
-
102
- // AudioBrowser.onRemoteJumpBackward((event: any) => {
103
- // const customHandler = customHandlers.get('jumpBackward')
104
- // if (customHandler) {
105
- // customHandler(event)
106
- // } else {
107
- // seekBy(-event.interval)
108
- // }
109
- // })
110
-
111
32
  // MARK: - Handler Override Functions
112
33
  //
113
34
  // Use these functions when you want to OVERRIDE the default remote control behavior.
114
35
  // These will replace the default handlers with your custom logic.
115
- // If you just want to listen to events for debugging/logging, use the onRemote* functions below.
36
+ // If you just want to listen to events for debugging/logging, use the onRemote* emitters below.
116
37
 
117
38
  /**
118
39
  * Sets a custom handler for remote play events, overriding the default behavior.
@@ -180,7 +101,7 @@ export function handleRemoteJumpBackward(callback) {
180
101
 
181
102
  // MARK: - Event Callbacks (for listening/debugging only)
182
103
  //
183
- // Use these functions when you want to LISTEN to remote control events without overriding
104
+ // Use these emitters when you want to LISTEN to remote control events without overriding
184
105
  // the default behavior. These are perfect for logging, analytics, or debugging.
185
106
  // Multiple listeners can be registered for the same event.
186
107
  // To override the default behavior, use the handleRemote* functions above.
@@ -188,77 +109,77 @@ export function handleRemoteJumpBackward(callback) {
188
109
  /**
189
110
  * Subscribes to remote jump backward events.
190
111
  * @param callback - Called when the user presses the jump backward button
191
- * @returns Cleanup function to unsubscribe
112
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
192
113
  */
193
114
  export const onRemoteJumpBackward = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemoteJumpBackward = cb);
194
115
 
195
116
  /**
196
117
  * Subscribes to remote jump forward events.
197
118
  * @param callback - Called when the user presses the jump forward button
198
- * @returns Cleanup function to unsubscribe
119
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
199
120
  */
200
121
  export const onRemoteJumpForward = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemoteJumpForward = cb);
201
122
 
202
123
  /**
203
124
  * Subscribes to remote next events.
204
125
  * @param callback - Called when the user presses the next track button
205
- * @returns Cleanup function to unsubscribe
126
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
206
127
  */
207
128
  export const onRemoteNext = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemoteNext = cb);
208
129
 
209
130
  /**
210
131
  * Subscribes to remote pause events.
211
132
  * @param callback - Called when the user presses the pause button
212
- * @returns Cleanup function to unsubscribe
133
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
213
134
  */
214
135
  export const onRemotePause = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemotePause = cb);
215
136
 
216
137
  /**
217
138
  * Subscribes to remote play events.
218
139
  * @param callback - Called when the user presses the play button
219
- * @returns Cleanup function to unsubscribe
140
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
220
141
  */
221
142
  export const onRemotePlay = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemotePlay = cb);
222
143
 
223
144
  /**
224
145
  * Subscribes to remote play ID events (Android only).
225
146
  * @param callback - Called when the user selects a track from an external device
226
- * @returns Cleanup function to unsubscribe
147
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
227
148
  */
228
149
  export const onRemotePlayId = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemotePlayId = cb);
229
150
 
230
151
  /**
231
152
  * Subscribes to remote play search events (Android only).
232
153
  * @param callback - Called when the user searches for a track (usually voice search)
233
- * @returns Cleanup function to unsubscribe
154
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
234
155
  */
235
156
  export const onRemotePlaySearch = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemotePlaySearch = cb);
236
157
 
237
158
  /**
238
159
  * Subscribes to remote previous events.
239
160
  * @param callback - Called when the user presses the previous track button
240
- * @returns Cleanup function to unsubscribe
161
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
241
162
  */
242
163
  export const onRemotePrevious = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemotePrevious = cb);
243
164
 
244
165
  /**
245
166
  * Subscribes to remote seek events.
246
167
  * @param callback - Called when the user changes the position of the timeline
247
- * @returns Cleanup function to unsubscribe
168
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
248
169
  */
249
170
  export const onRemoteSeek = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemoteSeek = cb);
250
171
 
251
172
  /**
252
173
  * Subscribes to remote skip events (Android only).
253
174
  * @param callback - Called when the user presses the skip button
254
- * @returns Cleanup function to unsubscribe
175
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
255
176
  */
256
177
  export const onRemoteSkip = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemoteSkip = cb);
257
178
 
258
179
  /**
259
180
  * Subscribes to remote stop events.
260
181
  * @param callback - Called when the user presses the stop button
261
- * @returns Cleanup function to unsubscribe
182
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
262
183
  */
263
184
  export const onRemoteStop = LazyNativeEmitter.emitterize(cb => nativeBrowser.onRemoteStop = cb);
264
185
  //# sourceMappingURL=remoteControls.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["nativeBrowser","LazyNativeEmitter","handleRemotePlay","callback","handleRemotePause","handleRemoteNext","handleRemotePrevious","handleRemoteStop","handleRemoteSeek","handleRemoteJumpForward","handleRemoteJumpBackward","onRemoteJumpBackward","emitterize","cb","onRemoteJumpForward","onRemoteNext","onRemotePause","onRemotePlay","onRemotePlayId","onRemotePlaySearch","onRemotePrevious","onRemoteSeek","onRemoteSkip","onRemoteStop"],"sourceRoot":"../../../src","sources":["features/remoteControls.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,WAAW;AACzC,SAASC,iBAAiB,QAAQ,4BAA4B;;AAE9D;;AAEA;AACA;AACA;;AAMA;AACA;AACA;;AAMA;AACA;AACA;;AAQA;AACA;AACA;;AAMA;AACA;AACA;;AAMA;AACA;AACA;;AAMA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,QAAkC,EAAE;EACnEH,aAAa,CAACE,gBAAgB,GAAGC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAACD,QAAkC,EAAE;EACpEH,aAAa,CAACI,iBAAiB,GAAGD,QAAQ;AAC5C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,gBAAgBA,CAACF,QAAkC,EAAE;EACnEH,aAAa,CAACK,gBAAgB,GAAGF,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASG,oBAAoBA,CAACH,QAAkC,EAAE;EACvEH,aAAa,CAACM,oBAAoB,GAAGH,QAAQ;AAC/C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASI,gBAAgBA,CAACJ,QAAkC,EAAE;EACnEH,aAAa,CAACO,gBAAgB,GAAGJ,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASK,gBAAgBA,CAC9BL,QAAwD,EACxD;EACAH,aAAa,CAACQ,gBAAgB,GAAGL,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASM,uBAAuBA,CACrCN,QAA+D,EAC/D;EACAH,aAAa,CAACS,uBAAuB,GAAGN,QAAQ;AAClD;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASO,wBAAwBA,CACtCP,QAAgE,EAChE;EACAH,aAAa,CAACU,wBAAwB,GAAGP,QAAQ;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMQ,oBAAoB,GAC/BV,iBAAiB,CAACW,UAAU,CACzBC,EAAE,IAAMb,aAAa,CAACW,oBAAoB,GAAGE,EAChD,CAAC;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAC9Bb,iBAAiB,CAACW,UAAU,CACzBC,EAAE,IAAMb,aAAa,CAACc,mBAAmB,GAAGD,EAC/C,CAAC;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,YAAY,GAAGd,iBAAiB,CAACW,UAAU,CACrDC,EAAE,IAAMb,aAAa,CAACe,YAAY,GAAGF,EACxC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMG,aAAa,GAAGf,iBAAiB,CAACW,UAAU,CACtDC,EAAE,IAAMb,aAAa,CAACgB,aAAa,GAAGH,EACzC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,YAAY,GAAGhB,iBAAiB,CAACW,UAAU,CACrDC,EAAE,IAAMb,aAAa,CAACiB,YAAY,GAAGJ,EACxC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMK,cAAc,GAAGjB,iBAAiB,CAACW,UAAU,CACvDC,EAAE,IAAMb,aAAa,CAACkB,cAAc,GAAGL,EAC1C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMM,kBAAkB,GAC7BlB,iBAAiB,CAACW,UAAU,CACzBC,EAAE,IAAMb,aAAa,CAACmB,kBAAkB,GAAGN,EAC9C,CAAC;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMO,gBAAgB,GAAGnB,iBAAiB,CAACW,UAAU,CACzDC,EAAE,IAAMb,aAAa,CAACoB,gBAAgB,GAAGP,EAC5C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMQ,YAAY,GAAGpB,iBAAiB,CAACW,UAAU,CACrDC,EAAE,IAAMb,aAAa,CAACqB,YAAY,GAAGR,EACxC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMS,YAAY,GAAGrB,iBAAiB,CAACW,UAAU,CACrDC,EAAE,IAAMb,aAAa,CAACsB,YAAY,GAAGT,EACxC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMU,YAAY,GAAGtB,iBAAiB,CAACW,UAAU,CACrDC,EAAE,IAAMb,aAAa,CAACuB,YAAY,GAAGV,EACxC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["nativeBrowser","LazyNativeEmitter","handleRemotePlay","callback","handleRemotePause","handleRemoteNext","handleRemotePrevious","handleRemoteStop","handleRemoteSeek","handleRemoteJumpForward","handleRemoteJumpBackward","onRemoteJumpBackward","emitterize","cb","onRemoteJumpForward","onRemoteNext","onRemotePause","onRemotePlay","onRemotePlayId","onRemotePlaySearch","onRemotePrevious","onRemoteSeek","onRemoteSkip","onRemoteStop"],"sourceRoot":"../../../src","sources":["features/remoteControls.ts"],"mappings":"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","ignoreList":[]}
@@ -63,7 +63,7 @@ export function clearSleepTimer() {
63
63
  /**
64
64
  * Subscribes to sleep timer changes.
65
65
  * @param callback - Called when the sleep timer state changes
66
- * @returns Cleanup function to unsubscribe
66
+ * @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
67
67
  */
68
68
  export const onSleepTimerChanged = NativeUpdatedValue.emitterize(cb => nativeBrowser.onSleepTimerChanged = cb);
69
69
 
@@ -78,6 +78,13 @@ export const onSleepTimerChanged = NativeUpdatedValue.emitterize(cb => nativeBro
78
78
  export function useSleepTimerActive() {
79
79
  const [isActive, setIsActive] = useState(() => getSleepTimer() !== null);
80
80
  useEffect(() => {
81
+ // Re-sync before subscribing: a change between the initial read above and this effect would
82
+ // otherwise be missed for good. `undefined` means nothing has fired yet, whereas `null` is a
83
+ // real value — the timer being cleared — so it has to re-sync too.
84
+ const {
85
+ lastValue
86
+ } = onSleepTimerChanged;
87
+ if (lastValue !== undefined) setIsActive(lastValue !== null);
81
88
  return onSleepTimerChanged.addListener(timer => {
82
89
  setIsActive(timer !== null);
83
90
  });
@@ -104,6 +111,11 @@ export function useSleepTimer(params) {
104
111
  });
105
112
  const time = state && 'time' in state ? state.time : undefined;
106
113
  useEffect(() => {
114
+ // Re-sync before subscribing — see useSleepTimerActive.
115
+ const {
116
+ lastValue
117
+ } = onSleepTimerChanged;
118
+ if (lastValue !== undefined) setState(addSecondsLeft(lastValue));
107
119
  return onSleepTimerChanged.addListener(event => {
108
120
  setState(addSecondsLeft(event));
109
121
  });
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useState","nativeBrowser","NativeUpdatedValue","getSleepTimer","setSleepTimer","seconds","options","fadeDuration","setSleepTimerToEndOfTrack","clearSleepTimer","onSleepTimerChanged","emitterize","cb","useSleepTimerActive","isActive","setIsActive","addListener","timer","useSleepTimer","params","updateInterval","inactive","state","setState","timerState","addSecondsLeft","time","undefined","event","update","sleepTimer","result","secondsLeft","clear","initialTimeoutId","setTimeout","intervalId","setInterval","clearTimeout","clearInterval","Math","max","round","Date","now"],"sourceRoot":"../../../src","sources":["features/sleepTimer.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useState","nativeBrowser","NativeUpdatedValue","getSleepTimer","setSleepTimer","seconds","options","fadeDuration","setSleepTimerToEndOfTrack","clearSleepTimer","onSleepTimerChanged","emitterize","cb","useSleepTimerActive","isActive","setIsActive","lastValue","undefined","addListener","timer","useSleepTimer","params","updateInterval","inactive","state","setState","timerState","addSecondsLeft","time","event","update","sleepTimer","result","secondsLeft","clear","initialTimeoutId","setTimeout","intervalId","setInterval","clearTimeout","clearInterval","Math","max","round","Date","now"],"sourceRoot":"../../../src","sources":["features/sleepTimer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Stands in for `react-native` under vitest, via the alias in `vitest.config.ts`.
5
+ *
6
+ * Not a convenience: `react-native/index.js` is Flow-typed (`import typeof ...`)
7
+ * and Rollup cannot parse it, so any test that reaches a module importing from
8
+ * `'react-native'` fails to load at all. Jest consumers get this from
9
+ * `@react-native/jest-preset`; vitest has no equivalent.
10
+ *
11
+ * Keep it to the surface the library actually touches. Two symbols so far —
12
+ * `AppState` (usePolledProgress) and `Image.resolveAssetSource`. Anything a test
13
+ * needs to drive should get an explicit control here rather than a cast at the
14
+ * call site.
15
+ *
16
+ * @internal — never imported by production code, only aliased in by the runner.
17
+ */
18
+
19
+ const changeListeners = new Set();
20
+ export const AppState = {
21
+ currentState: 'active',
22
+ // `type` is widened to string so the guard stays live: real AppState also
23
+ // emits 'memoryWarning' and 'focus', and silently treating one of those as a
24
+ // 'change' subscription would be a confusing way to find out this stub is thin.
25
+ addEventListener(type, listener) {
26
+ if (type !== 'change') throw new Error(`AppState stub: unhandled "${type}"`);
27
+ changeListeners.add(listener);
28
+ return {
29
+ remove: () => changeListeners.delete(listener)
30
+ };
31
+ }
32
+ };
33
+
34
+ /** Move the app to the foreground or background and notify subscribers. */
35
+ export function setAppState(status) {
36
+ AppState.currentState = status;
37
+ // Deleting from a Set mid-iteration is safe, so a listener that removes itself
38
+ // during the callback needs no defensive copy.
39
+ for (const listener of changeListeners) listener(status);
40
+ }
41
+
42
+ /**
43
+ * Drop every subscription and return to the foreground. Call between tests —
44
+ * the stub is a module singleton, so state outlives an individual test.
45
+ */
46
+ export function resetAppState() {
47
+ changeListeners.clear();
48
+ AppState.currentState = 'active';
49
+ }
50
+
51
+ /** Number of live `change` subscriptions, for asserting cleanup. */
52
+ export function appStateListenerCount() {
53
+ return changeListeners.size;
54
+ }
55
+ export const Image = {
56
+ resolveAssetSource: source => source
57
+ };
58
+ //# sourceMappingURL=reactNativeStub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["changeListeners","Set","AppState","currentState","addEventListener","type","listener","Error","add","remove","delete","setAppState","status","resetAppState","clear","appStateListenerCount","size","Image","resolveAssetSource","source"],"sourceRoot":"../../../src","sources":["test-utils/reactNativeStub.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,MAAMA,eAAe,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAEjD,OAAO,MAAMC,QAAQ,GAAG;EACtBC,YAAY,EAAE,QAA0B;EAExC;EACA;EACA;EACAC,gBAAgBA,CAACC,IAAY,EAAEC,QAAwB,EAAE;IACvD,IAAID,IAAI,KAAK,QAAQ,EAAE,MAAM,IAAIE,KAAK,CAAC,6BAA6BF,IAAI,GAAG,CAAC;IAC5EL,eAAe,CAACQ,GAAG,CAACF,QAAQ,CAAC;IAC7B,OAAO;MAAEG,MAAM,EAAEA,CAAA,KAAMT,eAAe,CAACU,MAAM,CAACJ,QAAQ;IAAE,CAAC;EAC3D;AACF,CAAC;;AAED;AACA,OAAO,SAASK,WAAWA,CAACC,MAAsB,EAAQ;EACxDV,QAAQ,CAACC,YAAY,GAAGS,MAAM;EAC9B;EACA;EACA,KAAK,MAAMN,QAAQ,IAAIN,eAAe,EAAEM,QAAQ,CAACM,MAAM,CAAC;AAC1D;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAS;EACpCb,eAAe,CAACc,KAAK,CAAC,CAAC;EACvBZ,QAAQ,CAACC,YAAY,GAAG,QAAQ;AAClC;;AAEA;AACA,OAAO,SAASY,qBAAqBA,CAAA,EAAW;EAC9C,OAAOf,eAAe,CAACgB,IAAI;AAC7B;AAEA,OAAO,MAAMC,KAAK,GAAG;EACnBC,kBAAkB,EAAGC,MAAe,IAAKA;AAC3C,CAAC","ignoreList":[]}