UNPKG

react-native-audio-api

Version:

react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification

125 lines (109 loc) 3.47 kB
import { AudioEventEmitter, AudioEventSubscription } from '../../events'; import { NativeAudioAPIModule } from '../../specs'; import type { NotificationCallback, NotificationManager, PlaybackControlName, PlaybackNotificationEventName, PlaybackNotificationInfo, } from './types'; import { AudioApiError } from '../../errors'; class PlaybackNotificationManager implements NotificationManager< PlaybackNotificationInfo, PlaybackNotificationEventName > { private notificationKey = 'playback'; private audioEventEmitter: AudioEventEmitter; constructor() { this.audioEventEmitter = new AudioEventEmitter( globalThis.AudioEventEmitter ); } /** * Show the notification with metadata or update if already visible. * Automatically creates the notification on first call. * * @param info - The info to be displayed. * @returns Promise that resolves after creating notification. */ async show(info: PlaybackNotificationInfo): Promise<void> { if (!NativeAudioAPIModule) { throw new AudioApiError('NativeAudioAPIModule is not available'); } const result = await NativeAudioAPIModule.showNotification( 'playback', this.notificationKey, info as Record<string, string | number | boolean | undefined> ); if (result.error) { throw new AudioApiError(result.error); } } /** * Hide the notification. * * @returns Promise that resolves after hiding notification. */ async hide(): Promise<void> { if (!NativeAudioAPIModule) { throw new AudioApiError('NativeAudioAPIModule is not available'); } const result = await NativeAudioAPIModule.hideNotification( this.notificationKey ); if (result.error) { throw new AudioApiError(result.error); } } /** * Enable or disable a specific playback control. * * @param control - The control to enable or disable on the notification. * @param enabled - Whether to enable (true) or disable (false) the control. * @returns Promise that resolves after showing modified notification. */ async enableControl( control: PlaybackControlName, enabled: boolean ): Promise<void> { if (!NativeAudioAPIModule) { throw new AudioApiError('NativeAudioAPIModule is not available'); } const params = { control, enabled }; const result = await NativeAudioAPIModule.showNotification( 'playback', this.notificationKey, params as Record<string, string | number | boolean | undefined> ); if (result.error) { throw new AudioApiError(result.error); } } /** * Check if the notification is currently active. * * @returns Promise that resolves to whether notification is active. */ async isActive(): Promise<boolean> { if (!NativeAudioAPIModule) { return false; } return await NativeAudioAPIModule.isNotificationActive( this.notificationKey ); } /** * Add an event listener for notification actions. * * @param eventName - The event name to listen for. * @param callback - The callback to invoke on event. * @returns Class that represents the subscription. */ addEventListener<T extends PlaybackNotificationEventName>( eventName: T, callback: NotificationCallback<T> ): AudioEventSubscription { return this.audioEventEmitter.addAudioEventListener(eventName, callback); } } export default new PlaybackNotificationManager();