/**
* @format
*/
import React, { Component, Fragment } from 'react';
import {
StyleSheet,
Text,
View,
DeviceEventEmitter,
Button,
Dimensions,
Platform,
Alert,
} from 'react-native';
import RNSettings from 'react-native-settings';
const Screen = {
width: Dimensions.get('window').width,
height: Dimensions.get('window').height,
};
export default class example extends Component {
state = { locationOn: false, airplaneOn: false, captioningOn: false };
componentDidMount() {
const settings = [
{
key: RNSettings.LOCATION_SETTING,
state: 'locationOn',
supported: true,
},
{
key: RNSettings.AIRPLANE_MODE_SETTING,
state: 'airplaneOn',
supported: Platform.OS === 'android',
},
{
key: RNSettings.CAPTIONING_SETTINGS,
state: 'captioningOn',
supported: Platform.OS === 'android',
},
];
settings
.filter(setting => setting.supported)
.forEach(setting =>
RNSettings.getSetting(setting.key).then(result => {
if (result[setting.key] === RNSettings.ENABLED) {
this.setState({ [setting.state]: true });
} else {
this.setState({ [setting.state]: false });
}
}),
);
if (Platform.OS === 'android') {
// Register to gps provider change event
DeviceEventEmitter.addListener(
RNSettings.GPS_PROVIDER_EVENT,
this.handleGPSProviderEvent,
);
// Register to airplane mode change event
DeviceEventEmitter.addListener(
RNSettings.AIRPLANE_MODE_EVENT,
this.handleAirplaneModeEvent,
);
// Register to captioning change event
DeviceEventEmitter.addListener(
RNSettings.CAPTIONING_EVENT,
this.handleCaptioningEvent,
);
}
}
handleGPSProviderEvent = e => {
if (e[RNSettings.LOCATION_SETTING] === RNSettings.ENABLED) {
this.setState({ locationOn: true });
} else {
this.setState({ locationOn: false });
}
};
handleAirplaneModeEvent = e => {
if (e[RNSettings.AIRPLANE_MODE_SETTING] === RNSettings.ENABLED) {
this.setState({ airplaneOn: true });
} else {
this.setState({ airplaneOn: false });
}
};
handleCaptioningEvent = e => {
if (e[RNSettings.CAPTIONING_SETTINGS] === RNSettings.ENABLED) {
this.setState({ captioningOn: true });
} else {
this.setState({ captioningOn: false });
}
};
openLocationSetting = () => {
if (Platform.OS === 'ios') {
Alert.alert(
'Not supported!',
'Not supported on IOS just yet. Stay tuned ~_~',
);
return;
}
RNSettings.openSetting(RNSettings.ACTION_LOCATION_SOURCE_SETTINGS).then(
result => {
if (result === RNSettings.ENABLED) {
this.setState({ locationOn: true });
} else {
this.setState({ locationOn: false });
}
},
);
};
openAirplaneSetting = () => {
if (Platform.OS === 'ios') {
Alert.alert(
'Not supported!',
'Not supported on IOS just yet. Stay tuned ~_~',
);
return;
}
RNSettings.openSetting(RNSettings.ACTION_AIRPLANE_MODE_SETTINGS).then(
result => {
if (result === RNSettings.ENABLED) {
this.setState({ airplaneOn: true });
} else {
this.setState({ airplaneOn: false });
}
},
);
};
openCaptioningSetting = () => {
if (Platform.OS === 'ios') {
Alert.alert(
'Not supported!',
'Not supported on IOS just yet. Stay tuned ~_~',
);
return;
}
RNSettings.openSetting(RNSettings.ACTION_CAPTIONING_SETTINGS).then(
result => {
if (result === RNSettings.ENABLED) {
this.setState({ captioningOn: true });
} else {
this.setState({ captioningOn: false });
}
},
);
};
render() {
const asterisk =
Platform.OS === 'ios' ? (
{' '}
* Not supported yet on iOS.
) : (
);
const { locationOn, airplaneOn, captioningOn } = this.state;
return (
react-native-settings
{asterisk}
);
}
}
const SettingRow = ({ name, onAvailable, onPressAvailable, onPress, on }) => {
let status = ;
if (onAvailable) {
status = on ? (
ON
) : (
OFF
);
} else {
status = N/A*;
}
return (
{name}:
{status}
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
settingRowContainer: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
width: Screen.width / 1.5,
marginBottom: 20,
},
title: { marginTop: 20, marginBottom: 20 },
notSupportedText: { marginTop: 40 },
redText: { color: 'red', fontSize: 18 },
greenText: { color: 'green', fontSize: 18 },
blackText: { color: 'black', fontSize: 18 },
text: { fontSize: 18 },
});