App.js 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. * @format
  3. * @flow
  4. * @lint-ignore-every XPLATJSCOPYRIGHT1
  5. */
  6. import * as React from "react";
  7. import { Appbar, List, TouchableRipple, Snackbar } from "react-native-paper";
  8. import * as RNPermissions from "react-native-permissions";
  9. import type { PermissionStatus } from "react-native-permissions";
  10. import theme from "./theme";
  11. import {
  12. AppState,
  13. Platform,
  14. StatusBar,
  15. ScrollView,
  16. StyleSheet,
  17. Text,
  18. View,
  19. } from "react-native";
  20. // $FlowFixMe
  21. let platformPermissions: string[] = Object.values(
  22. Platform.OS === "ios"
  23. ? RNPermissions.IOS_PERMISSIONS
  24. : RNPermissions.ANDROID_PERMISSIONS,
  25. ).filter(permission => permission !== "SIRI");
  26. const statusColors: { [PermissionStatus]: string } = {
  27. granted: "#43a047",
  28. denied: "#ff9800",
  29. never_ask_again: "#e53935",
  30. unavailable: "#cfd8dc",
  31. };
  32. const statusIcons: { [PermissionStatus]: string } = {
  33. granted: "check-circle",
  34. denied: "error",
  35. never_ask_again: "cancel",
  36. unavailable: "lens",
  37. };
  38. type AppStateType = "active" | "background" | "inactive";
  39. type Props = {};
  40. // RNPermissions.checkMultiple([
  41. // RNPermissions.ANDROID_PERMISSIONS.ACCESS_FINE_LOCATION,
  42. // RNPermissions.ANDROID_PERMISSIONS.PROCESS_OUTGOING_CALLS,
  43. // ]).then(result => {
  44. // console.log(result);
  45. // });
  46. type State = {|
  47. snackBarVisible: boolean,
  48. watchAppState: boolean,
  49. statuses: { [string]: PermissionStatus },
  50. |};
  51. export default class App extends React.Component<Props, State> {
  52. constructor(props: Props) {
  53. super(props);
  54. this.state = {
  55. snackBarVisible: false,
  56. watchAppState: false,
  57. statuses: {},
  58. };
  59. setTimeout(() => {
  60. this.checkAllPermissions();
  61. }, 2000);
  62. }
  63. componentDidMount() {
  64. AppState.addEventListener("change", this.onAppStateChange);
  65. }
  66. componentWillUnmount() {
  67. AppState.removeEventListener("change", this.onAppStateChange);
  68. }
  69. checkAllPermissions = () => {
  70. RNPermissions.checkMultiple(platformPermissions)
  71. .then(statuses => {
  72. console.log(statuses);
  73. this.setState({ statuses });
  74. })
  75. .catch(error => {
  76. console.error(error);
  77. });
  78. };
  79. onAppStateChange = (nextAppState: AppStateType) => {
  80. if (this.state.watchAppState && nextAppState === "active") {
  81. this.setState({
  82. snackBarVisible: true,
  83. watchAppState: false,
  84. });
  85. setTimeout(() => {
  86. // @TODO don't fire setState on unmounted component
  87. this.setState({ snackBarVisible: false });
  88. }, 3000);
  89. }
  90. };
  91. render() {
  92. return (
  93. <View style={styles.container}>
  94. <StatusBar
  95. backgroundColor={theme.colors.primary}
  96. barStyle="light-content"
  97. />
  98. <Appbar.Header>
  99. <Appbar.Content
  100. title="react-native-permissions"
  101. subtitle="Example application"
  102. />
  103. <Appbar.Action
  104. icon="settings-applications"
  105. onPress={() => {
  106. this.setState({ watchAppState: true }, () => {
  107. RNPermissions.openSettings();
  108. });
  109. }}
  110. />
  111. </Appbar.Header>
  112. <ScrollView>
  113. <List.Section>
  114. {platformPermissions.map(permission => {
  115. const status = this.state.statuses[permission];
  116. return (
  117. <TouchableRipple
  118. key={permission}
  119. disabled={
  120. status === RNPermissions.RESULTS.UNAVAILABLE ||
  121. status === RNPermissions.RESULTS.NEVER_ASK_AGAIN
  122. }
  123. onPress={() => {
  124. RNPermissions.request(permission).then(status => {
  125. this.setState(prevState => ({
  126. ...prevState,
  127. statuses: {
  128. ...prevState.statuses,
  129. [permission]: status,
  130. },
  131. }));
  132. });
  133. }}
  134. >
  135. <List.Item
  136. title={permission}
  137. description={status}
  138. right={() => (
  139. <List.Icon
  140. color={statusColors[status]}
  141. icon={statusIcons[status]}
  142. />
  143. )}
  144. />
  145. </TouchableRipple>
  146. );
  147. })}
  148. </List.Section>
  149. </ScrollView>
  150. <Snackbar
  151. onDismiss={() => this.setState({ snackBarVisible: false })}
  152. visible={this.state.snackBarVisible}
  153. >
  154. Welcome back ! Refreshing permissions…
  155. </Snackbar>
  156. </View>
  157. );
  158. }
  159. }
  160. const styles = StyleSheet.create({
  161. container: {
  162. flex: 1,
  163. backgroundColor: theme.colors.background,
  164. },
  165. });