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 */} + + + + + + { + this.licenses(); + }}> + Licenses + + + + + + {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"