diff --git a/.prettierrc.js b/.prettierrc.js
index 5c4de1a4f6..355e7d1e4b 100644
--- a/.prettierrc.js
+++ b/.prettierrc.js
@@ -1,5 +1,5 @@
module.exports = {
- bracketSpacing: false,
+ bracketSpacing: true,
jsxBracketSameLine: true,
singleQuote: true,
trailingComma: 'all',
diff --git a/App.js b/App.js
index 1f5e6f53fe..4721698b1d 100644
--- a/App.js
+++ b/App.js
@@ -7,17 +7,15 @@
*/
import React from 'react';
-import {
- StatusBar
-} from 'react-native';
-
+import { StatusBar } from 'react-native';
+import { MenuProvider } from 'react-native-popup-menu';
import Entry from './app/Entry';
const App: () => React$Node = () => {
return (
- <>
-
- >
+
+
+
);
};
diff --git a/app/Entry.js b/app/Entry.js
index 91ea6564aa..723eb64c3d 100644
--- a/app/Entry.js
+++ b/app/Entry.js
@@ -8,6 +8,7 @@ import Welcome from './views/Welcome';
import NewsScreen from './views/News';
import ExportScreen from './views/Export';
import ImportScreen from './views/Import';
+import LicencesScreen from './views/Licenses';
import Slider from './views/welcomeScreens/Slider';
import {GetStoreData, SetStoreData} from './helpers/General';
@@ -50,18 +51,16 @@ class Entry extends Component {
options={{headerShown:false}}
/>
)}
-
-
-
+ />
+ />
+
diff --git a/app/assets/images/kebabIcon.png b/app/assets/images/kebabIcon.png
new file mode 100644
index 0000000000..8b3d663aa5
Binary files /dev/null and b/app/assets/images/kebabIcon.png differ
diff --git a/app/locales/en/index.js b/app/locales/en/index.js
index 77d79a8a10..3b0f20127c 100644
--- a/app/locales/en/index.js
+++ b/app/locales/en/index.js
@@ -1,11 +1,13 @@
import intro from './intro.json';
import locationTracking from './locationTracking.json';
-import importFile from './import.json'
-import exportFile from './exportscreen.json'
+import importFile from './import.json';
+import exportFile from './exportscreen.json';
+import licensesFile from './licensesscreen.json';
export default {
- ...intro,
- ...locationTracking,
- ...importFile,
- ...exportFile
+ ...intro,
+ ...locationTracking,
+ ...importFile,
+ ...exportFile,
+ ...licensesFile,
};
diff --git a/app/locales/en/licensesscreen.json b/app/locales/en/licensesscreen.json
new file mode 100644
index 0000000000..9be7837196
--- /dev/null
+++ b/app/locales/en/licensesscreen.json
@@ -0,0 +1,3 @@
+{
+ "license_placeholder": "This app is built under the MIT license."
+}
\ No newline at end of file
diff --git a/app/views/Licenses.js b/app/views/Licenses.js
new file mode 100644
index 0000000000..4d8b047433
--- /dev/null
+++ b/app/views/Licenses.js
@@ -0,0 +1,160 @@
+import React, { Component } from 'react';
+import {
+ SafeAreaView,
+ StyleSheet,
+ ScrollView,
+ View,
+ Text,
+ Image,
+ Dimensions,
+ TouchableOpacity,
+ BackHandler,
+} from 'react-native';
+
+import colors from '../constants/colors';
+import WebView from 'react-native-webview';
+import Button from '../components/Button';
+import { GetStoreData } from '../helpers/General';
+import { convertPointsToString } from '../helpers/convertPointsToString';
+import Share from 'react-native-share';
+import RNFetchBlob from 'rn-fetch-blob';
+import LocationServices from '../services/LocationService';
+import backArrow from './../assets/images/backArrow.png';
+import languages from './../locales/languages';
+
+const width = Dimensions.get('window').width;
+
+const base64 = RNFetchBlob.base64;
+
+class LicensesScreen extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ backToMain() {
+ this.props.navigation.navigate('LocationTrackingScreen', {});
+ }
+
+ handleBackPress = () => {
+ this.props.navigation.navigate('LocationTrackingScreen', {});
+ return true;
+ };
+
+ componentDidMount() {
+ BackHandler.addEventListener('hardwareBackPress', this.handleBackPress);
+ }
+
+ componentWillUnmount() {
+ BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress);
+ }
+
+ render() {
+ return (
+
+
+ this.backToMain()}>
+
+
+ Licenses
+
+
+
+
+ {/* This screen is a placeholder for complete license content, or a link */}
+ {languages.t('label.license_placeholder')}
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ // Container covers the entire screen
+ container: {
+ flex: 1,
+ flexDirection: 'column',
+ color: colors.PRIMARY_TEXT,
+ backgroundColor: colors.WHITE,
+ },
+ headerTitle: {
+ textAlign: 'center',
+ fontWeight: 'bold',
+ fontSize: 38,
+ padding: 0,
+ },
+ subHeaderTitle: {
+ textAlign: 'center',
+ fontWeight: 'bold',
+ fontSize: 22,
+ padding: 5,
+ },
+ main: {
+ flex: 1,
+ flexDirection: 'column',
+ textAlignVertical: 'top',
+ // alignItems: 'center',
+ padding: 20,
+ width: '96%',
+ alignSelf: 'center',
+ },
+ buttonTouchable: {
+ borderRadius: 12,
+ backgroundColor: '#665eff',
+ height: 52,
+ alignSelf: 'center',
+ width: width * 0.7866,
+ marginTop: 30,
+ justifyContent: 'center',
+ },
+ buttonText: {
+ fontFamily: 'OpenSans-Bold',
+ fontSize: 14,
+ lineHeight: 19,
+ letterSpacing: 0,
+ textAlign: 'center',
+ color: '#ffffff',
+ },
+ mainText: {
+ fontSize: 18,
+ lineHeight: 24,
+ fontWeight: '400',
+ textAlignVertical: 'center',
+ padding: 20,
+ },
+ smallText: {
+ fontSize: 10,
+ lineHeight: 24,
+ fontWeight: '400',
+ textAlignVertical: 'center',
+ padding: 20,
+ },
+
+ headerContainer: {
+ flexDirection: 'row',
+ height: 60,
+ borderBottomWidth: 1,
+ borderBottomColor: 'rgba(189, 195, 199,0.6)',
+ alignItems: 'center',
+ },
+ backArrowTouchable: {
+ width: 60,
+ height: 60,
+ paddingTop: 21,
+ paddingLeft: 20,
+ },
+ backArrow: {
+ height: 18,
+ width: 18.48,
+ },
+ sectionDescription: {
+ fontSize: 16,
+ lineHeight: 24,
+ marginTop: 12,
+ fontFamily: 'OpenSans-Regular',
+ },
+});
+
+export default LicensesScreen;
diff --git a/app/views/LocationTracking.js b/app/views/LocationTracking.js
index ac66986c4b..e09eade4c6 100644
--- a/app/views/LocationTracking.js
+++ b/app/views/LocationTracking.js
@@ -1,287 +1,399 @@
-import React, {
- Component
-} from 'react';
+import React, { Component } from 'react';
import {
- SafeAreaView,
- StyleSheet,
- Linking,
- View,
- Text,
- TouchableOpacity,
- Dimensions,
- Image,
- ScrollView,
- BackHandler,
- Button
+ SafeAreaView,
+ StyleSheet,
+ Linking,
+ View,
+ Text,
+ TouchableOpacity,
+ Dimensions,
+ Image,
+ ScrollView,
+ BackHandler,
} from 'react-native';
-import colors from "../constants/colors";
+import {
+ Menu,
+ MenuOptions,
+ MenuOption,
+ MenuTrigger,
+} from 'react-native-popup-menu';
+import colors from '../constants/colors';
import LocationServices from '../services/LocationService';
import BackgroundGeolocation from '@mauron85/react-native-background-geolocation';
import exportImage from './../assets/images/export.png';
import news from './../assets/images/newspaper.png';
-
+import kebabIcon from './../assets/images/kebabIcon.png';
import pkLogo from './../assets/images/PKLogo.png';
-import {GetStoreData, SetStoreData} from '../helpers/General';
-import languages from './../locales/languages'
+import { GetStoreData, SetStoreData } from '../helpers/General';
+import languages from './../locales/languages';
const width = Dimensions.get('window').width;
class LocationTracking extends Component {
- constructor(props) {
- super(props);
-
- this.state = {
- isLogging:''
- }
- }
+ constructor(props) {
+ super(props);
- componentDidMount() {
- BackHandler.addEventListener("hardwareBackPress", this.handleBackPress);
- GetStoreData('PARTICIPATE')
- .then(isParticipating => {
- console.log(isParticipating);
-
- if(isParticipating === 'true'){
- this.setState({
- isLogging:true
- })
- this.willParticipate()
- }
- else{
- this.setState({
- isLogging:false
- })
- }
- })
- .catch(error => console.log(error))
- }
- componentWillUnmount() { BackHandler.removeEventListener("hardwareBackPress", this.handleBackPress); }
+ this.state = {
+ isLogging: '',
+ };
+ }
- handleBackPress = () => {
- BackHandler.exitApp(); // works best when the goBack is async
- return true;
- };
- export() {
- this.props.navigation.navigate('ExportScreen', {})
- }
+ componentDidMount() {
+ BackHandler.addEventListener('hardwareBackPress', this.handleBackPress);
+ GetStoreData('PARTICIPATE')
+ .then(isParticipating => {
+ console.log(isParticipating);
- import() {
- this.props.navigation.navigate('ImportScreen', {})
- }
+ if (isParticipating === 'true') {
+ this.setState({
+ isLogging: true,
+ });
+ this.willParticipate();
+ } else {
+ this.setState({
+ isLogging: false,
+ });
+ }
+ })
+ .catch(error => console.log(error));
+ }
+ componentWillUnmount() {
+ BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress);
+ }
- news() {
- this.props.navigation.navigate('NewsScreen', {})
- }
+ handleBackPress = () => {
+ BackHandler.exitApp(); // works best when the goBack is async
+ return true;
+ };
+ export() {
+ this.props.navigation.navigate('ExportScreen', {});
+ }
- willParticipate =()=> {
- SetStoreData('PARTICIPATE', 'true').then(() =>
- LocationServices.start()
- );
+ import() {
+ this.props.navigation.navigate('ImportScreen', {});
+ }
- // Check and see if they actually authorized in the system dialog.
- // If not, stop services and set the state to !isLogging
- // Fixes tripleblindmarket/private-kit#129
- BackgroundGeolocation.checkStatus(({ authorization }) => {
- if (authorization === BackgroundGeolocation.AUTHORIZED) {
- this.setState({
- isLogging:true
- })
- } else if (authorization === BackgroundGeolocation.NOT_AUTHORIZED) {
- LocationServices.stop(this.props.navigation)
- this.setState({
- isLogging:false
- })
- }
- });
- }
+ willParticipate = () => {
+ SetStoreData('PARTICIPATE', 'true').then(() => LocationServices.start());
- setOptOut =()=>{
- LocationServices.stop(this.props.navigation)
+ // Check and see if they actually authorized in the system dialog.
+ // If not, stop services and set the state to !isLogging
+ // Fixes tripleblindmarket/private-kit#129
+ BackgroundGeolocation.checkStatus(({ authorization }) => {
+ if (authorization === BackgroundGeolocation.AUTHORIZED) {
this.setState({
- isLogging:false
- })
- }
+ isLogging: true,
+ });
+ } else if (authorization === BackgroundGeolocation.NOT_AUTHORIZED) {
+ LocationServices.stop(this.props.navigation);
+ this.setState({
+ isLogging: false,
+ });
+ }
+ });
+ };
+
+ news() {
+ this.props.navigation.navigate('NewsScreen', {});
+ }
- render() {
- return (
-
+ licenses() {
+ this.props.navigation.navigate('LicensesScreen', {});
+ }
-
-
-
+ willParticipate = () => {
+ SetStoreData('PARTICIPATE', 'true').then(() => LocationServices.start());
+ this.setState({
+ isLogging: true,
+ });
+ };
- {languages.t('label.private_kit')}
+ setOptOut = () => {
+ LocationServices.stop(this.props.navigation);
+ this.setState({
+ isLogging: false,
+ });
+ };
- {
- this.state.isLogging ? (
- <>
-
+ render() {
+ return (
+
+
+
+ {/* A modal menu. Currently only used for license info */}
+
+
+
+ {languages.t('label.private_kit')}
+
- this.setOptOut()} style={styles.stopLoggingButtonTouchable} >
- {languages.t('label.stop_logging')}
-
- >
- ) : (
- <>
-
- this.willParticipate()} style={styles.startLoggingButtonTouchable} >
- {languages.t('label.start_logging')}
-
- >)
- }
+ {this.state.isLogging ? (
+ <>
+
-
- {this.state.isLogging ?
- {languages.t('label.logging_message')} :
- {languages.t('label.not_logging_message')} }
-
+ this.setOptOut()}
+ style={styles.stopLoggingButtonTouchable}>
+
+ {languages.t('label.stop_logging')}
+
+
+ >
+ ) : (
+ <>
+
+ this.willParticipate()}
+ style={styles.startLoggingButtonTouchable}>
+
+ {languages.t('label.start_logging')}
+
+
+ >
+ )}
-
-
+ {this.state.isLogging ? (
+
+ {languages.t('label.logging_message')}
+
+ ) : (
+
+ {languages.t('label.not_logging_message')}
+
+ )}
+
+
-
- this.import()} style={styles.actionButtonsTouchable}>
-
- {languages.t('label.import')}
-
+
+ this.import()}
+ style={styles.actionButtonsTouchable}>
+
+
+ {languages.t('label.import')}
+
+
- this.export()} style={styles.actionButtonsTouchable}>
-
- {languages.t('label.export')}
-
+ this.export()}
+ style={styles.actionButtonsTouchable}>
+
+
+ {languages.t('label.export')}
+
+
- this.news()} style={styles.actionButtonsTouchable}>
-
- {languages.t('label.news')}
-
-
-
+ this.news()}
+ style={styles.actionButtonsTouchable}>
+
+
+ {languages.t('label.news')}
+
+
+
+
-
- {languages.t('label.url_info')}
- Linking.openURL('https://privatekit.mit.edu')}>{languages.t('label.private_kit_url')}
-
-
- )
- }
+
+
+ {languages.t('label.url_info')}{' '}
+
+ Linking.openURL('https://privatekit.mit.edu')}>
+ {languages.t('label.private_kit_url')}
+
+
+
+ );
+ }
}
const styles = StyleSheet.create({
- // Container covers the entire screen
- container: {
- flex: 1,
- flexDirection: 'column',
- justifyContent: 'center',
- alignItems: 'center',
- color: colors.PRIMARY_TEXT,
- backgroundColor: colors.WHITE,
- },
- headerTitle: {
- textAlign: 'center',
- fontSize: 38,
- padding: 0,
- fontFamily:'OpenSans-Bold'
- },
- subHeaderTitle: {
- textAlign: 'center',
- fontWeight: "bold",
- fontSize: 22,
- padding: 5
- },
- main: {
- flex: 1,
- flexDirection: 'column',
- justifyContent: 'center',
- alignItems: 'center',
- width: "80%"
- },
- block: {
- margin: 20,
- width: "100%"
- },
- footer: {
- textAlign: 'center',
- fontSize: 12,
- fontWeight: '600',
- padding: 4,
- paddingBottom: 10
- },
- intro: {
- flexDirection: 'column',
- justifyContent: 'center',
- alignItems: 'stretch',
- },
- sectionDescription: {
- fontSize: 12,
- lineHeight: 24,
- fontFamily:'OpenSans-Regular',
- marginTop: 20,
- marginLeft: 10,
- marginRight: 10
- },
- startLoggingButtonTouchable:{
- borderRadius: 12,
- backgroundColor: "#665eff",
- height:52,
- alignSelf:'center',
- width:width*.7866,
- marginTop:30,
- justifyContent:'center'
- },
- startLoggingButtonText:{
- fontFamily: "OpenSans-Bold",
- fontSize: 14,
- lineHeight: 19,
- letterSpacing: 0,
- textAlign: "center",
- color: "#ffffff"
- },
- stopLoggingButtonTouchable:{
- borderRadius: 12,
- backgroundColor: "#fd4a4a",
- height:52,
- alignSelf:'center',
- width:width*.7866,
- marginTop:30,
- justifyContent:'center',
- },
- stopLoggingButtonText:{
- fontFamily: "OpenSans-Bold",
- fontSize: 14,
- lineHeight: 19,
- letterSpacing: 0,
- textAlign: "center",
- color: "#ffffff"
- },
- actionButtonsView:{
- width:width*.7866,
- flexDirection:'row',
- justifyContent:'space-between',
- marginTop:64
- },
- actionButtonsTouchable:{
- height: 76,
- borderRadius: 8,
- backgroundColor: "#454f63",
- width:width*.23,
- justifyContent:'center',
- alignItems:'center'
- },
- actionButtonImage:{
- height:21.6,
- width:32.2
- },
- actionButtonText:{
- opacity: 0.56,
- fontFamily: "OpenSans-Bold",
- fontSize: 12,
- lineHeight: 17,
- letterSpacing: 0,
- textAlign: "center",
- color: "#ffffff",
- marginTop:6
- }
+ // Container covers the entire screen
+ container: {
+ flex: 1,
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ color: colors.PRIMARY_TEXT,
+ backgroundColor: colors.WHITE,
+ },
+ headerTitle: {
+ textAlign: 'center',
+ fontSize: 38,
+ padding: 0,
+ fontFamily: 'OpenSans-Bold',
+ },
+ subHeaderTitle: {
+ textAlign: 'center',
+ fontWeight: 'bold',
+ fontSize: 22,
+ padding: 5,
+ },
+ main: {
+ flex: 1,
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ width: '80%',
+ },
+ block: {
+ margin: 20,
+ width: '100%',
+ },
+ footer: {
+ textAlign: 'center',
+ fontSize: 12,
+ fontWeight: '600',
+ padding: 4,
+ paddingBottom: 10,
+ },
+ intro: {
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'stretch',
+ },
+ sectionDescription: {
+ fontSize: 12,
+ lineHeight: 24,
+ fontFamily: 'OpenSans-Regular',
+ marginTop: 20,
+ marginLeft: 10,
+ marginRight: 10,
+ },
+ startLoggingButtonTouchable: {
+ borderRadius: 12,
+ backgroundColor: '#665eff',
+ height: 52,
+ alignSelf: 'center',
+ width: width * 0.7866,
+ marginTop: 30,
+ justifyContent: 'center',
+ },
+ startLoggingButtonText: {
+ fontFamily: 'OpenSans-Bold',
+ fontSize: 14,
+ lineHeight: 19,
+ letterSpacing: 0,
+ textAlign: 'center',
+ color: '#ffffff',
+ },
+ stopLoggingButtonTouchable: {
+ borderRadius: 12,
+ backgroundColor: '#fd4a4a',
+ height: 52,
+ alignSelf: 'center',
+ width: width * 0.7866,
+ marginTop: 30,
+ justifyContent: 'center',
+ },
+ stopLoggingButtonText: {
+ fontFamily: 'OpenSans-Bold',
+ fontSize: 14,
+ lineHeight: 19,
+ letterSpacing: 0,
+ textAlign: 'center',
+ color: '#ffffff',
+ },
+ actionButtonsView: {
+ width: width * 0.7866,
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ marginTop: 64,
+ },
+ actionButtonsTouchable: {
+ height: 76,
+ borderRadius: 8,
+ backgroundColor: '#454f63',
+ width: width * 0.23,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ actionButtonImage: {
+ height: 21.6,
+ width: 32.2,
+ },
+ actionButtonText: {
+ opacity: 0.56,
+ fontFamily: 'OpenSans-Bold',
+ fontSize: 12,
+ lineHeight: 17,
+ letterSpacing: 0,
+ textAlign: 'center',
+ color: '#ffffff',
+ marginTop: 6,
+ },
+ menuOptionText: {
+ fontFamily: 'OpenSans-Regular',
+ fontSize: 14,
+ padding: 10,
+ },
});
export default LocationTracking;
diff --git a/dev_setup.sh b/dev_setup.sh
old mode 100644
new mode 100755
diff --git a/package.json b/package.json
index 1aeac2a3c4..c28896897f 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"react-native-fs": "^2.16.6",
"react-native-gesture-handler": "~1.5.0",
"react-native-i18n": "^2.0.15",
+ "react-native-popup-menu": "^0.15.7",
"react-native-push-notification": "^3.1.9",
"react-native-safe-area-context": "0.6.0",
"react-native-screens": "2.0.0-alpha.12",
diff --git a/yarn.lock b/yarn.lock
index 252a04061a..0c17a4914e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -631,6 +631,13 @@
dependencies:
regenerator-runtime "^0.13.2"
+"@babel/runtime@^7.3.1":
+ version "7.9.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
+ integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/template@^7.0.0", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
version "7.8.6"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
@@ -1074,6 +1081,11 @@
dependencies:
invariant "^2.2.4"
+"@react-native-community/viewpager@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@react-native-community/viewpager/-/viewpager-3.3.0.tgz#e613747a43a31a6f3278f817ba96fdaaa7941f23"
+ integrity sha512-tyzh79l4t/hxiyS9QD3LRmWMs8KVkZzjrkQ8U8+8To1wmvVCBtp8BenvNsDLTBO7CpO/YmiThpmIdEZMr1WuVw==
+
"@react-navigation/core@^5.2.1":
version "5.2.1"
resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.2.1.tgz#8fae1b40b3fbaeb70c6182e00899a2e4d281a12f"
@@ -2175,6 +2187,11 @@ cross-spawn@^7.0.0:
shebang-command "^2.0.0"
which "^2.0.1"
+css-mediaquery@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0"
+ integrity sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=
+
cssom@^0.4.1:
version "0.4.4"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
@@ -3304,6 +3321,18 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+i18n-js@3.0.11:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/i18n-js/-/i18n-js-3.0.11.tgz#f9e96bdb641c5b9d6be12759d7c422089987ef02"
+ integrity sha512-v7dG3kYJTQTyox3NqDabPDE/ZotWntyMI9kh4cYi+XlCSnsIR+KBTS2opPyObL8WndnklcLzbNU92FP/mLge3Q==
+
+i18next@^19.3.3:
+ version "19.3.3"
+ resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.3.3.tgz#04bd79b315e5fe2c87ab8f411e5d55eda0a17bd8"
+ integrity sha512-CnuPqep5/JsltkGvQqzYN4d79eCe0TreCBRF3a8qHHi8x4SON1qqZ/pvR2X7BfNkNqpA5HXIqw0E731H+VsgSg==
+ dependencies:
+ "@babel/runtime" "^7.3.1"
+
iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -5102,6 +5131,11 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+object-resolve-path@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-resolve-path/-/object-resolve-path-1.1.1.tgz#a7f8f93e8a20af80e44217ba7db54316d9d12232"
+ integrity sha1-p/j5Poogr4DkQhe6fbVDFtnRIjI=
+
object-visit@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
@@ -5623,6 +5657,19 @@ react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527"
integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==
+react-native-app-intro-slider@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/react-native-app-intro-slider/-/react-native-app-intro-slider-3.0.0.tgz#c3620b967503ce410b3d767252392bb6fb2edf97"
+ integrity sha512-2XXUYnSeMYZTLhdRYHSwv8mhoyuEaYxmQfXrWQInH1QvjsnJtKgvORI3bJuJN+tNPg3aut6JYYCNOFsI5of32A==
+
+react-native-extended-stylesheet@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/react-native-extended-stylesheet/-/react-native-extended-stylesheet-0.12.0.tgz#ebacf22d78a8e2173bdef2a08cbf1acba4dc051f"
+ integrity sha512-y4MEI+a9F8qtAKEjxKbwqotJg1FqKfl6vaiF25ULZ/VGkWI4GNTnsFunU9x6B3XJ6ly1E8O9fybO63u6UazL/A==
+ dependencies:
+ css-mediaquery "^0.1.2"
+ object-resolve-path "^1.1.0"
+
react-native-fs@^2.16.6:
version "2.16.6"
resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.16.6.tgz#2901789a43210a35a0ef0a098019bbef3af395fd"
@@ -5642,11 +5689,23 @@ react-native-gesture-handler@~1.5.0:
invariant "^2.2.4"
prop-types "^15.7.2"
+react-native-i18n@^2.0.15:
+ version "2.0.15"
+ resolved "https://registry.yarnpkg.com/react-native-i18n/-/react-native-i18n-2.0.15.tgz#09b5a9836116fa7dbd0054c46e2d1014c1ef3c65"
+ integrity sha512-V8VwUP0TLda3oJvgt5tdnFaOV7WXPhTjCTLO7sXI3C2SHggSbD4bCUryMzNJhesimJidH21V2Owvj4zAylHoQQ==
+ dependencies:
+ i18n-js "3.0.11"
+
react-native-iphone-x-helper@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz#645e2ffbbb49e80844bb4cbbe34a126fda1e6772"
integrity sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ==
+react-native-popup-menu@^0.15.7:
+ version "0.15.7"
+ resolved "https://registry.yarnpkg.com/react-native-popup-menu/-/react-native-popup-menu-0.15.7.tgz#ddffa8aa6e5d7d11533947921e9bdf94cd7fc7d0"
+ integrity sha512-TgPVGQdsHPgynn+mMpTX51QKKhavDXI3tA879zylRUBMrxfNiR3gAWNanI1Sd5X4Sv0tZ1/A33k/gNTwciMDDg==
+
react-native-push-notification@^3.1.9:
version "3.1.9"
resolved "https://registry.yarnpkg.com/react-native-push-notification/-/react-native-push-notification-3.1.9.tgz#760ee06e743fef74fc9fcb672dac40794fdc4c47"
@@ -5797,6 +5856,11 @@ regenerator-runtime@^0.13.2:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
+regenerator-runtime@^0.13.4:
+ version "0.13.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
+ integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
+
regenerator-transform@^0.14.0:
version "0.14.1"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb"