import { Audio, AudioMode, InterruptionModeIOS } from 'expo-av'; import React from 'react'; import { PixelRatio, Switch, Text, View } from 'react-native'; import Button from '../../components/Button'; import ListButton from '../../components/ListButton'; interface State { modeToSet: Partial; setMode: Partial; } export default class AudioModeSelector extends React.Component { readonly state: State = { modeToSet: { interruptionModeIOS: InterruptionModeIOS.MixWithOthers, playsInSilentModeIOS: false, allowsRecordingIOS: false, staysActiveInBackground: false, }, setMode: { interruptionModeIOS: InterruptionModeIOS.MixWithOthers, playsInSilentModeIOS: false, allowsRecordingIOS: false, staysActiveInBackground: false, }, }; _applyMode = async () => { try { await Audio.setAudioModeAsync({ ...this.state.modeToSet }); const { modeToSet } = this.state; this.setState({ setMode: modeToSet }); } catch (error) { alert(error.message); } }; _modesEqual = (modeA: Partial, modeB: Partial) => modeA.interruptionModeIOS === modeB.interruptionModeIOS && modeA.playsInSilentModeIOS === modeB.playsInSilentModeIOS && modeA.allowsRecordingIOS === modeB.allowsRecordingIOS && modeA.staysActiveInBackground === modeB.staysActiveInBackground; _setMode = (interruptionModeIOS: number) => () => this.setState((state) => ({ modeToSet: { ...state.modeToSet, interruptionModeIOS } })); _renderToggle = ({ title, disabled, valueName, value, }: { title: string; disabled?: boolean; valueName: keyof AudioMode; value?: boolean; }) => ( {title} this.setState((state) => ({ modeToSet: { ...state.modeToSet, [valueName]: !state.modeToSet[valueName] }, })) } /> ); _renderModeSelector = ({ title, disabled, value, }: { title: string; disabled?: boolean; value: number; }) => ( ); render() { return ( {this._renderToggle({ title: 'Plays in silent mode', valueName: 'playsInSilentModeIOS', })} {this._renderToggle({ title: 'Allows recording', valueName: 'allowsRecordingIOS', disabled: !this.state.modeToSet.playsInSilentModeIOS, value: !this.state.modeToSet.playsInSilentModeIOS ? false : undefined, })} {this._renderToggle({ title: 'Stay active in background', valueName: 'staysActiveInBackground', disabled: !this.state.modeToSet.playsInSilentModeIOS, value: !this.state.modeToSet.playsInSilentModeIOS ? false : undefined, })} {this._renderModeSelector({ title: 'Mix with others', value: InterruptionModeIOS.MixWithOthers, })} {this._renderModeSelector({ title: 'Do not mix', value: InterruptionModeIOS.DoNotMix, })} {this._renderModeSelector({ disabled: this.state.modeToSet.playsInSilentModeIOS === false, title: 'Duck others', value: InterruptionModeIOS.DuckOthers, })}