From 9fe1a5377f441acdb60db1aed62843f1aeb39c7a Mon Sep 17 00:00:00 2001 From: 0hee0 Date: Sun, 6 Mar 2022 23:21:23 +0900 Subject: [PATCH 1/3] Remove: Forgot Password Screen --- react-native/App.tsx | 12 ++++-------- react-native/screens/ForgotPasswordScreen.tsx | 11 ----------- react-native/types.ts | 1 - 3 files changed, 4 insertions(+), 20 deletions(-) delete mode 100644 react-native/screens/ForgotPasswordScreen.tsx diff --git a/react-native/App.tsx b/react-native/App.tsx index ad4a73d..1331499 100644 --- a/react-native/App.tsx +++ b/react-native/App.tsx @@ -5,11 +5,11 @@ import { createNativeStackNavigator } from '@react-navigation/native-stack'; import { NativeBaseProvider } from 'native-base'; import { nativeBaseTheme } from './core/theme'; import AppLoading from 'expo-app-loading'; -import useFonts from './hooks/useFonts' +import useFonts from './hooks/useFonts'; +import { theme } from './core/theme'; import LoginScreen from './screens/LoginScreen'; import JoinScreen from './screens/JoinScreen'; -import ForgotPasswordScreen from './screens/ForgotPasswordScreen'; import HomeScreen from './screens/HomeScreen'; import TranslateScreen from './screens/TranslateScreen'; import SearchScreen from './screens/SearchScreen'; @@ -20,7 +20,7 @@ import SearchResultScreen from './screens/SearchResultScreen'; const Stack = createNativeStackNavigator(); export default function App() { - const [fontsLoaded, SetFontsLoaded] = React.useState(false); + const [fontsLoaded, SetFontsLoaded] = useState(false); const LoadFontsAndRestoreToken = async () => { await useFonts(); }; @@ -50,15 +50,11 @@ export default function App() { name="Join" component={JoinScreen} /> - , diff --git a/react-native/screens/ForgotPasswordScreen.tsx b/react-native/screens/ForgotPasswordScreen.tsx deleted file mode 100644 index 441ec37..0000000 --- a/react-native/screens/ForgotPasswordScreen.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import * as React from 'react'; -import { StyleSheet, Text, View, Button } from 'react-native'; -import type { Navigation } from '../types'; - -export default function ForgotPasswordScreen({ navigation }: Navigation) { - return ( - - Forgot Password Screen - - ); -} \ No newline at end of file diff --git a/react-native/types.ts b/react-native/types.ts index 15e55e6..9df87d5 100644 --- a/react-native/types.ts +++ b/react-native/types.ts @@ -3,7 +3,6 @@ import type { NativeStackScreenProps } from '@react-navigation/native-stack'; export type RootStackParamList = { Login: undefined; Join: undefined; - ForgotPassword: undefined; Home: undefined; Translate: undefined; Search: undefined; From c1ebad473127698f38394d06877593084ff7d484 Mon Sep 17 00:00:00 2001 From: 0hee0 Date: Sun, 6 Mar 2022 23:29:35 +0900 Subject: [PATCH 2/3] [#1] Feat: Implement Join Screen UI --- react-native/screens/JoinScreen.tsx | 173 ++++++++++++++++++++++++++-- 1 file changed, 166 insertions(+), 7 deletions(-) diff --git a/react-native/screens/JoinScreen.tsx b/react-native/screens/JoinScreen.tsx index 5bd0708..1c61817 100644 --- a/react-native/screens/JoinScreen.tsx +++ b/react-native/screens/JoinScreen.tsx @@ -1,11 +1,170 @@ -import * as React from 'react'; -import { StyleSheet, Text, View, Button } from 'react-native'; +import React, { useState } from 'react'; +import { StyleSheet, View, KeyboardAvoidingView, Alert, Platform, ScrollView, Image, GestureResponderEvent } from 'react-native'; +import { FormControl, Input, Button, VStack, Select, CheckIcon } from 'native-base'; +import { nameValidator } from '../core/utils'; import type { Navigation } from '../types'; +import { theme } from '../core/theme'; export default function JoinScreen({ navigation }: Navigation) { - return ( - - Join Screen - - ); + const [profileImg, setProfileImg] = useState(1); + const [username, setUsername] = useState(''); + const [language, setLanguage] = useState(''); + const [childrenNumber, setChildrenNumber] = useState('1'); + const [childrenName, setChildrenName] = useState([]); + const imgSource = [require(`../assets/images/profile-images/profile-1.png`), require(`../assets/images/profile-images/profile-2.png`), require(`../assets/images/profile-images/profile-3.png`), + require(`../assets/images/profile-images/profile-4.png`), require(`../assets/images/profile-images/profile-5.png`), require(`../assets/images/profile-images/profile-6.png`), require(`../assets/images/profile-images/profile-7.png`)]; + const childrenColor = [theme.colors.primary, theme.colors.secondary, theme.colors.skyblue, theme.colors.coral, theme.colors.gray, '#000'] + + const errorAlert = (error: string) => + Alert.alert( + "Join Failed", + error, + [ + { text: "OK", onPress: () => console.log("OK Pressed") } + ] + ); + + const handleProfileImg = (profileType: number) => (event: GestureResponderEvent) => { + setProfileImg(profileType); + } + + const handleChildName = (childNum: number, text: string) => { + let array = [...childrenName]; + array[childNum] = text; + setChildrenName(array); + } + + const onJoinPressed = () => { + const usernameError = nameValidator(username); + const childrenNameError = childrenName.length !== Number(childrenNumber); + + if (usernameError || childrenNameError || !language) { + console.log(usernameError); + errorAlert("Please fill in all the blanks!"); + return; + } + + Alert.alert( + "Success", + "Congratulations, your account has been successfully created." + ) + navigation.navigate('Home'); + }; + + return ( + + + + + Profile Image + + {Array(7).fill(1).map((num, index) => + + )} + + + + Username + setUsername(text)} + autoFocus + autoCapitalize="none" + returnKeyType={"next"} + /> + + + Select Your Language + + + + Number of Children + + + + Children name + + {Array(Number(childrenNumber)).fill(1).map((child, index) => + handleChildName(index, text)} + autoCapitalize="none" + mb={2} + InputRightElement={ + + } + /> + )} + + + + + + + + + ); } + +const styles = StyleSheet.create({ + container: { + paddingHorizontal: 25, + paddingVertical: 40, + backgroundColor: theme.colors.background, + flex: 1, + flexDirection: 'column', + }, + topView: { + flex: 5, + }, + bottomView: { + flex: 1 + }, + profileImage: { + width: 52, + height: 52, + }, + disabled: { + opacity: 0.3 + } +}); + From 16c8bae7cc5ff61540bb81c81b93e1ff72548abe Mon Sep 17 00:00:00 2001 From: 0hee0 Date: Sun, 6 Mar 2022 23:30:08 +0900 Subject: [PATCH 3/3] [#1] Feat: Implement Google sign in --- react-native/.gitignore | 3 + react-native/babel.config.js | 15 +- react-native/env.d.ts | 4 + react-native/package.json | 7 + react-native/screens/LoginScreen.tsx | 205 ++++++++++++-------------- react-native/yarn.lock | 208 ++++++++++++++++++++++++++- 6 files changed, 324 insertions(+), 118 deletions(-) create mode 100644 react-native/env.d.ts diff --git a/react-native/.gitignore b/react-native/.gitignore index ec8a36a..ca86b3e 100644 --- a/react-native/.gitignore +++ b/react-native/.gitignore @@ -12,3 +12,6 @@ web-build/ # macOS .DS_Store + +# react-native environment variables +.env \ No newline at end of file diff --git a/react-native/babel.config.js b/react-native/babel.config.js index 2900afe..8919cc2 100644 --- a/react-native/babel.config.js +++ b/react-native/babel.config.js @@ -1,6 +1,19 @@ module.exports = function(api) { api.cache(true); return { - presets: ['babel-preset-expo'], + presets: [ + 'babel-preset-expo', + 'module:metro-react-native-babel-preset', + ], + plugins: [ + ["module:react-native-dotenv", { + "moduleName": "@env", + "path": ".env", + "blacklist": null, + "whitelist": null, + "safe": false, + "allowUndefined": true + }] + ] }; }; diff --git a/react-native/env.d.ts b/react-native/env.d.ts new file mode 100644 index 0000000..73f9900 --- /dev/null +++ b/react-native/env.d.ts @@ -0,0 +1,4 @@ +declare module '@env' { + export const GOOGLE_CLIENT_ID_WEB: string; + export const ENV: 'dev' | 'prod'; +}; \ No newline at end of file diff --git a/react-native/package.json b/react-native/package.json index de9bc80..a397085 100644 --- a/react-native/package.json +++ b/react-native/package.json @@ -15,13 +15,19 @@ "@react-navigation/native-stack": "^6.5.0", "expo": "~44.0.0", "expo-app-loading": "~1.3.0", + "expo-application": "^4.0.2", + "expo-auth-session": "~3.5.0", "expo-camera": "^12.1.2", "expo-font": "~10.0.4", + "expo-random": "~12.1.1", "expo-status-bar": "~1.2.0", + "expo-web-browser": "~10.1.0", + "metro-react-native-babel-preset": "^0.69.0", "native-base": "^3.3.7", "react": "17.0.1", "react-dom": "17.0.1", "react-native": "0.64.3", + "react-native-dotenv": "^3.3.1", "react-native-elements": "^3.4.2", "react-native-safe-area-context": "3.3.2", "react-native-screens": "~3.10.1", @@ -39,6 +45,7 @@ "@babel/core": "^7.12.9", "@types/react": "~17.0.21", "@types/react-native": "~0.64.12", + "@types/react-native-dotenv": "^0.2.0", "@types/react-redux": "^7.1.22", "@types/redux": "^3.6.0", "typescript": "~4.3.5" diff --git a/react-native/screens/LoginScreen.tsx b/react-native/screens/LoginScreen.tsx index 466689a..216dce4 100644 --- a/react-native/screens/LoginScreen.tsx +++ b/react-native/screens/LoginScreen.tsx @@ -1,125 +1,106 @@ -import React, { useState } from 'react'; -import { StyleSheet, View, KeyboardAvoidingView, Alert, Image, Platform } from 'react-native'; -import { FormControl, Input, Button, Stack, VStack, Text } from 'native-base'; -import { emailValidator, passwordValidator } from '../core/utils'; +import React, { useEffect } from 'react'; +import { StyleSheet, View, KeyboardAvoidingView, Image, Platform, TouchableOpacity } from 'react-native'; +import { Button, Text } from 'native-base'; import { theme } from '../core/theme'; import type { Navigation } from '../types'; +import * as WebBrowser from 'expo-web-browser'; +import * as Google from 'expo-auth-session/providers/google'; +import { GOOGLE_CLIENT_ID_WEB } from '@env'; + +WebBrowser.maybeCompleteAuthSession(); export default function LoginScreen({ navigation }: Navigation) { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - - const errorAlert = (error: string) => - Alert.alert( - "Login Failed", - error, - [ - { text: "OK", onPress: () => console.log("OK Pressed") } - ] - ); - - const onLoginPressed = () => { - const emailError = emailValidator(email); - const passwordError = passwordValidator(password); + const [request, response, promptAsync] = Google.useAuthRequest({ + expoClientId: GOOGLE_CLIENT_ID_WEB, + webClientId: GOOGLE_CLIENT_ID_WEB, + // responseType: 'id_token' + }) - if (emailError || passwordError) { - errorAlert(emailError ? emailError : passwordError); - return; - } + useEffect(() => { + // WebBrowser.dismissAuthSession(); + if (response?.type === 'success') { + const { authentication } = response; + // console.log('success!') + console.log(authentication); + // console.log(response.params); + // TODO: fetch API + // TEST + let status = 'join'; + switch(status) { + case 'login': // if account exists + navigation.navigate('Home'); + case 'join': // if no account + navigation.navigate('Join'); + } + } + else { + console.log('fail') + console.log(response) + } + }, [response]); - navigation.navigate('Home'); - }; + const onLoginPressed = () => { + navigation.navigate('Home'); + }; - return ( - - - - Sign in - + return ( + + + + Sign in + - - - - setEmail(text)} - autoFocus - autoCapitalize="none" - returnKeyType={"next"} - /> - - - setPassword(text)} - /> - - - - + + {/* TEST: 바로 Home 화면 입장하기 위한 버튼 */} + - - - - ) -}; + { + promptAsync(); + }} + > + {/* */} + Sign In With Google + + + + ) + }; -const styles = StyleSheet.create({ - container: { - padding: 20, - backgroundColor: theme.colors.background, - flex: 1, - flexDirection: 'column', - }, - topView: { - flex: 1, - alignItems: 'center', - justifyContent: 'center' - }, - bottomView: { - flex: 1, - paddingBottom: 40 - }, - loginImage: { - width: 50, - height: 50, - }, - title: { - paddingTop: 30, - fontWeight: '700', - fontSize: 36, - fontFamily: 'Lora_700Bold', - }, - forgotPassword: { - width: '100%', - alignItems: 'flex-end', - marginBottom: 24, - }, + const styles = StyleSheet.create({ + container: { + padding: 20, + backgroundColor: theme.colors.background, + flex: 1, + flexDirection: 'column', + }, + topView: { + flex: 1, + alignItems: 'center', + justifyContent: 'center' + }, + bottomView: { + flex: 1, + paddingBottom: 40 + }, + loginImage: { + width: 50, + height: 50 + }, }); \ No newline at end of file diff --git a/react-native/yarn.lock b/react-native/yarn.lock index d29dce7..44844f1 100644 --- a/react-native/yarn.lock +++ b/react-native/yarn.lock @@ -49,6 +49,27 @@ json5 "^2.1.2" semver "^6.3.0" +"@babel/core@^7.14.0": + version "7.17.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" + integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.3" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + "@babel/generator@^7.17.3", "@babel/generator@^7.5.0": version "7.17.3" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz" @@ -295,7 +316,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": +"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== @@ -582,7 +603,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-async-to-generator@^7.16.8": +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== @@ -2371,6 +2392,11 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== +"@types/react-native-dotenv@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/react-native-dotenv/-/react-native-dotenv-0.2.0.tgz#32c58422a422c1adf68acce363ed791314d5a8e7" + integrity sha512-ZxX+dU/yoQc0jTk+/NWttkiuXceJyN5FpOSqDl0WynN5GDzxwH7OMruQ47qcY8llo2RD3irjvzJ9BwC8gDiq0A== + "@types/react-native-vector-icons@^6.4.6": version "6.4.10" resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.10.tgz#9bfd6e64dd37b8119425496b5e53ff91d034efa9" @@ -2723,7 +2749,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.5.1: +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.0, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3098,6 +3124,13 @@ commondir@^1.0.1: resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-urls/-/compare-urls-2.0.0.tgz#9b378c4abd43980a8700fffec9afb85de4df9075" + integrity sha512-eCJcWn2OYFEIqbm70ta7LQowJOOZZqq1a2YbbFCFI1uwSvj+TWMwXVn7vPR1ceFNcAIt5RSTDbwdlX82gYLTkA== + dependencies: + normalize-url "^2.0.1" + compare-versions@^3.4.0: version "3.6.0" resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz" @@ -3386,6 +3419,11 @@ domutils@^1.7.0: dom-serializer "0" domelementtype "1" +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" @@ -3530,7 +3568,7 @@ expo-app-loading@~1.3.0: dependencies: expo-splash-screen "~0.14.0" -expo-application@~4.0.2: +expo-application@^4.0.2, expo-application@~4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/expo-application/-/expo-application-4.0.2.tgz" integrity sha512-ngTaFplTkWn0X45gMC+VNXGyJfGxX4wOwKmtr17rNMVWOQUhhLlyMkTj9bAamzsuwZh35l3S/eD/N1aMWWUwMw== @@ -3546,6 +3584,18 @@ expo-asset@~8.4.6: path-browserify "^1.0.0" url-parse "^1.4.4" +expo-auth-session@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/expo-auth-session/-/expo-auth-session-3.5.0.tgz#ebb4c8263b29c207ff2db2f8a7e315ed797f4a41" + integrity sha512-Cia1NvIu1CcKuQNbhRsSmJz1YG76wDKU0NY+FHoD/0KItKd2+//oZyjrmlJXOk4m4gVohOIGWbFzt8Xe/ReZYg== + dependencies: + expo-constants "~13.0.0" + expo-crypto "~10.1.0" + expo-linking "~3.0.0" + expo-web-browser "~10.1.0" + invariant "^2.2.4" + qs "6.9.1" + expo-camera@^12.1.2: version "12.1.2" resolved "https://registry.yarnpkg.com/expo-camera/-/expo-camera-12.1.2.tgz#b549a8054ce5778fbf37a45b5d41003f36f5bb3c" @@ -3555,7 +3605,7 @@ expo-camera@^12.1.2: "@koale/useworker" "^4.0.2" invariant "^2.2.4" -expo-constants@~13.0.2: +expo-constants@~13.0.0, expo-constants@~13.0.2: version "13.0.2" resolved "https://registry.npmjs.org/expo-constants/-/expo-constants-13.0.2.tgz" integrity sha512-vGs/kI65vplPFvG8z4W1ariGEtVHHp9Avl28G0zJprt2v/q1E/BnXjwvFSBPc1GB+Zb/7crWSHWRwjaFULBjsg== @@ -3563,6 +3613,11 @@ expo-constants@~13.0.2: "@expo/config" "^6.0.6" uuid "^3.3.2" +expo-crypto@~10.1.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-10.1.2.tgz#5dfc0f0a5b4aa94dae2ecfb744d4aa8c001660b7" + integrity sha512-TYaBtV9oK5OH+EfsAUHQkWkRPifZjCMDn6Yf9gk3/LyHdJHDYnB6NQWTJo9Qkl6vzI9svQ6PMnQTm2Yxrb3ZfQ== + expo-error-recovery@~3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/expo-error-recovery/-/expo-error-recovery-3.0.5.tgz" @@ -3588,6 +3643,16 @@ expo-keep-awake@~10.0.2: resolved "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-10.0.2.tgz" integrity sha512-Ro1lgyKldbFs4mxhWM+goX9sg0S2SRR8FiJJeOvaRzf8xNhrZfWA00Zpr+/3ocCoWQ3eEL+X9UF4PXXHf0KoOg== +expo-linking@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-3.0.0.tgz#67f06b0be4ac1da911c46535a704d24eca34e344" + integrity sha512-TgRB4JTdhMRo79rTu9E9zwzWyBUJxHpSbHFlv0ZfMAwU+qFCsL9zZsL44R/yj7xrvcLOjqbCVmBszLQ0pFOt1g== + dependencies: + expo-constants "~13.0.0" + invariant "^2.2.4" + qs "^6.9.1" + url-parse "^1.4.4" + expo-modules-autolinking@0.5.5, expo-modules-autolinking@~0.5.1: version "0.5.5" resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-0.5.5.tgz" @@ -3607,6 +3672,13 @@ expo-modules-core@0.6.5: compare-versions "^3.4.0" invariant "^2.2.4" +expo-random@~12.1.1: + version "12.1.2" + resolved "https://registry.yarnpkg.com/expo-random/-/expo-random-12.1.2.tgz#ed4e7f85728b609bcb373bc4c4a1a05192ec44b9" + integrity sha512-ajB+Mwff9PdglsyLliaU4K9BtVwKvAVVI2hQhnvlS3QgsAhHf+jQVUfAysQJHuioF6ADMEsab/kRUy4Dy03aoQ== + dependencies: + base64-js "^1.3.0" + expo-splash-screen@~0.14.0: version "0.14.2" resolved "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.14.2.tgz" @@ -3620,6 +3692,13 @@ expo-status-bar@~1.2.0: resolved "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.2.0.tgz" integrity sha512-pVZZ/kDCXFK79E4dCtRecs3XLC8aiwlciutSd/fFmUPJSQZ1Txia6hlKajPt0GAYft8/YnT0V3URXzWZOBniYQ== +expo-web-browser@~10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-10.1.1.tgz#0fa74ac57605b8b2a30aee747c423ce3827fa183" + integrity sha512-SRG7TzqLgsDjL9PzLppdUdBi49r2xos2aLD63+zB6ZAvNQTszmCfddkPMQH8vSq7m2fg7YReotVdWwcZtR/YZA== + dependencies: + compare-urls "^2.0.0" + expo@~44.0.0: version "44.0.6" resolved "https://registry.npmjs.org/expo/-/expo-44.0.6.tgz" @@ -4254,6 +4333,11 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" @@ -4881,6 +4965,52 @@ metro-react-native-babel-preset@0.64.0, metro-react-native-babel-preset@~0.64.0: "@babel/template" "^7.0.0" react-refresh "^0.4.0" +metro-react-native-babel-preset@^0.69.0: + version "0.69.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.69.0.tgz#5f651a027d3ced57fb1ef93e2e5a5a4a90059a93" + integrity sha512-AEvyI6h3ltvc3/hY+v7DhV3pFSSE3jhtebjYEX+ffXQ/oT3U3pbFvLXa24TCe7cTljM6eEMtmpYS+6UkGE9BKQ== + dependencies: + "@babel/core" "^7.14.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + metro-react-native-babel-transformer@0.64.0, metro-react-native-babel-transformer@^0.64.0: version "0.64.0" resolved "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz" @@ -5261,6 +5391,15 @@ normalize-path@^3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" @@ -5299,6 +5438,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" @@ -5552,6 +5696,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + pretty-format@^26.5.2, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" @@ -5606,6 +5755,27 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +qs@6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" + integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== + +qs@^6.9.1: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + query-string@^6.13.6: version "6.14.1" resolved "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz" @@ -5682,6 +5852,13 @@ react-native-codegen@^0.0.6: jscodeshift "^0.11.0" nullthrows "^1.1.1" +react-native-dotenv@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-3.3.1.tgz#8f399cf28ca77d860d8e7f7323e439fa60a8ca0b" + integrity sha512-gAKXout1XCwCqJ3QPGoQAF2eRzOHgOnwg3x19z+ssow8bDIksJeKBqvoHDyGziVilAIP1J0bEC9Jf+VF8nFang== + dependencies: + dotenv "^10.0.0" + react-native-elements@^3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/react-native-elements/-/react-native-elements-3.4.2.tgz#66602be9c5e0e0a2a831913adec80ff6518d1ee2" @@ -6229,6 +6406,15 @@ shelljs@^0.8.4: interpret "^1.0.0" rechoir "^0.6.2" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" @@ -6304,6 +6490,13 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" @@ -6395,6 +6588,11 @@ stream-buffers@2.2.x: resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz"