diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..9a0bd5c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,7 @@
+*.pdf filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
+*.jpg filter=lfs diff=lfs merge=lfs -text
+*.jpeg filter=lfs diff=lfs merge=lfs -text
+*.heic filter=lfs diff=lfs merge=lfs -text
+*.otf filter=lfs diff=lfs merge=lfs -text
+*.ttf filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
index 05647d5..b7369fe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,6 @@ yarn-error.*
# typescript
*.tsbuildinfo
+/reference
+/secrets
+/android
diff --git a/App.tsx b/App.tsx
deleted file mode 100644
index 0329d0c..0000000
--- a/App.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { StatusBar } from 'expo-status-bar';
-import { StyleSheet, Text, View } from 'react-native';
-
-export default function App() {
- return (
-
- Open up App.tsx to start working on your app!
-
-
- );
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- backgroundColor: '#fff',
- alignItems: 'center',
- justifyContent: 'center',
- },
-});
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8d1108f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# Essentory Login Mockup
+
+## Firebase Setup
+
+Create the directory `./secrets` and download `google-services.json` and
+`GoogleService-Info.plist` into there.
diff --git a/app.json b/app.json
index f566f57..2290c59 100644
--- a/app.json
+++ b/app.json
@@ -1,30 +1,55 @@
{
"expo": {
- "name": "loginmockup2",
- "slug": "loginmockup2",
+ "name": "loginmockup",
+ "slug": "loginmockup",
+ "scheme": "loginmockup",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
- "userInterfaceStyle": "light",
+ "userInterfaceStyle": "dark",
"splash": {
- "image": "./assets/splash.png",
+ "image": "./assets/splash2.png",
"resizeMode": "contain",
- "backgroundColor": "#ffffff"
+ "backgroundColor": "#333333"
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
- "supportsTablet": true
+ "googleServicesFile": "./secrets/GoogleService-Info.plist",
+ "supportsTablet": true,
+ "package": "com.v1.client.app.essentory"
},
"android": {
- "adaptiveIcon": {
- "foregroundImage": "./assets/adaptive-icon.png",
- "backgroundColor": "#ffffff"
- }
+ "googleServicesFile": "./secrets/google-services.json",
+ "package": "com.estrclient"
},
"web": {
"favicon": "./assets/favicon.png"
- }
+ },
+ "plugins": [
+ "@react-native-firebase/app",
+ "@react-native-firebase/auth",
+ "@react-native-google-signin/google-signin",
+ [
+ "expo-font",
+ {
+ "fonts": [
+ "./assets/fonts/Pretendard-Bold.ttf",
+ "./assets/fonts/Pretendard-Thin.ttf",
+ "./assets/fonts/Pretendard-Black.ttf",
+ "./assets/fonts/Pretendard-Light.ttf",
+ "./assets/fonts/Pretendard-Medium.ttf",
+ "./assets/fonts/Pretendard-Regular.ttf",
+ "./assets/fonts/Pretendard-SemiBold.ttf",
+ "./assets/fonts/Pretendard-ExtraBold.ttf",
+ "./assets/fonts/Pretendard-ExtraLight.ttf",
+ "./assets/fonts/Axiforma-ExtraBold.otf",
+ "./assets/fonts/Axiforma-ExtraBoldItalic.otf"
+ ]
+ }
+ ],
+ "expo-router"
+ ]
}
}
diff --git a/app/_layout.tsx b/app/_layout.tsx
new file mode 100644
index 0000000..1b9658f
--- /dev/null
+++ b/app/_layout.tsx
@@ -0,0 +1,44 @@
+import React from "react";
+import { SafeAreaView } from 'react-native-safe-area-context';
+import { StatusBar } from "react-native";
+
+import { ScrollView } from "react-native";
+import AuthProvider from "@components/AuthProvider";
+import * as SplashScreen from 'expo-splash-screen';
+import { Slot, Stack } from "expo-router";
+
+SplashScreen.preventAutoHideAsync();
+
+export const unstable_settings = {
+ initialRouteName: 'auth/login',
+}
+
+function App() {
+ const backgroundStyle = {
+ backgroundColor: "#333333",
+ fontFamily: "Pretendard-Regular",
+ color: "white",
+ };
+ SplashScreen.hideAsync();
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/app/auth/createpassword.tsx b/app/auth/createpassword.tsx
new file mode 100644
index 0000000..e90976f
--- /dev/null
+++ b/app/auth/createpassword.tsx
@@ -0,0 +1,82 @@
+import React, { useMemo, useState } from "react";
+import { View } from "react-native";
+import ETextInput, { ETextInputBorder } from "@components/ETextInput";
+import EFullButton from "@components/EButton";
+import EText, { ECaptionText, ELabelText, ETitleText } from "@components/EText";
+import ENavButtons from "@components/ENavButtons";
+
+// implement logic here later.
+export default function CreatePassword(props: any) {
+ const [password, setPassword] = useState("");
+ const [validation, setValidation] = useState("");
+ const [visible, setVisible] = useState(true);
+ const border = useMemo(() => {
+ if (password.length === 0 && validation.length === 0)
+ return ETextInputBorder.Nothing;
+ if (validation !== password) return ETextInputBorder.Fail;
+ if (validation.length >= 8) return ETextInputBorder.Success;
+ return ETextInputBorder.Fail;
+ }, [password, validation]);
+ return (
+ <>
+
+
+
+
+
+ 비밀번호 설정하기
+
+
+ 비밀번호를 설정해주세요. 영문, 숫자를 조합한 8자 이상으로
+ 만들어주세요
+
+
+
+ 비밀번호
+
+
+ {border === ETextInputBorder.Nothing && (
+
+ 영문/숫자 조합 8자 이상으로 만들어주세요
+
+ )}
+ {border === ETextInputBorder.Fail && (
+ <>
+
+ 영문/숫자 조합 8자 이상으로 만들어주세요
+
+
+ 비밀번호가 일치하는지 확인해주세요
+
+ >
+ )}
+
+
+
+
+ >
+ );
+}
diff --git a/app/auth/login.tsx b/app/auth/login.tsx
new file mode 100644
index 0000000..4953e53
--- /dev/null
+++ b/app/auth/login.tsx
@@ -0,0 +1,140 @@
+import React, { useState } from "react";
+import { Button, Text, View } from "react-native";
+import ELogo from "@components/ELogo";
+import ETextInput from "@components/ETextInput";
+import EFullButton, { EIconButton } from "@components/EButton";
+import { ColorScheme } from "@components/Design";
+import { AppleIcon, GoogleIcon } from "@components/EIcons";
+import { ECaptionText, ELabelText } from "@components/EText";
+import auth from "@react-native-firebase/auth";
+import { useRouter } from "expo-router";
+import { GoogleSignin } from "@react-native-google-signin/google-signin";
+import { useAuthState } from "@components/AuthProvider";
+
+GoogleSignin.configure({
+ webClientId:
+ "406674810515-l8a40f83kl5hnvflvcjrabmjmbvda7am.apps.googleusercontent.com",
+});
+
+export default function LoginScreen(props: any) {
+ const [email, setEmail] = useState("");
+ const [password, setPassword] = useState("");
+ const [error, setError] = useState(false);
+ const router = useRouter();
+ const [loginAttempting, setLoginAttempting] = useState(false);
+ const signInWithEmail = async () => {
+ setLoginAttempting(true);
+ try {
+ await auth().signInWithEmailAndPassword(email, password);
+ router.replace("/");
+ } catch (e) {
+ setError(true);
+ }
+ setLoginAttempting(false);
+ };
+ const signInWithGoogle = async () => {
+ setLoginAttempting(true);
+ await GoogleSignin.hasPlayServices({ showPlayServicesUpdateDialog: true });
+ const { idToken } = await GoogleSignin.signIn();
+ const googleCredential = auth.GoogleAuthProvider.credential(idToken);
+ return auth().signInWithCredential(googleCredential);
+ };
+ const [user, loginstate, setLoginState] = useAuthState();
+ return (
+ <>
+
+
+
+ setError(false)}
+ />
+ setError(false)}
+ />
+ {error && (
+
+ 이메일 혹은 비밀번호가 일치하지 않습니다
+
+ )}
+
+
+ signInWithEmail()}
+ />
+ {
+ setLoginState &&
+ setLoginState({ ...loginstate, passwordReset: true });
+ router.push("auth/passwordresetemail");
+ }}
+ active={true}
+ text={"비밀번호를 모르겠어요"}
+ />
+
+
+
+
+ {
+ signInWithGoogle()
+ .then((d) => {
+ console.log("worked!");
+ setLoginAttempting(false);
+ router.replace("");
+ })
+ .catch((e) => {
+ console.error(e);
+ setLoginAttempting(false);
+ });
+ }}
+ >
+
+
+
+
+
+
+
+ 아직 회원이 아니신가요?
+
+ {
+ setLoginState &&
+ setLoginState({ ...loginstate, passwordReset: false });
+ router.push("auth/registeremail");
+ }}
+ style={{ backgroundColor: ColorScheme.frostedfill.white[10] }}
+ active={true}
+ text={"회원가입"}
+ />
+
+ >
+ );
+}
diff --git a/app/auth/passwordresetemail.tsx b/app/auth/passwordresetemail.tsx
new file mode 100644
index 0000000..6ac62a8
--- /dev/null
+++ b/app/auth/passwordresetemail.tsx
@@ -0,0 +1,35 @@
+import React, { useState } from 'react';
+import {View} from 'react-native'
+import ETextInput from '@components/ETextInput';
+import EFullButton, { ESmallButton } from '@components/EButton';
+import EText, { ELabelText, ETitleText } from '@components/EText';
+import ENavButtons from '@components/ENavButtons';
+
+// implement logic here later.
+export default function PasswordResetEmailInput(props:any) {
+ const [email, setEmail] = useState('');
+ const emailre = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
+ return (
+ <>
+
+
+
+
+ 비밀번호 재설정하기
+ 비밀번호를 다시 설정하려면 회원가입 때 사용하신 이메일 주소로 비밀번호 재설정 링크를 보내드립니다
+
+
+ 이메일
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/auth/registeremail.tsx b/app/auth/registeremail.tsx
new file mode 100644
index 0000000..cb67dbc
--- /dev/null
+++ b/app/auth/registeremail.tsx
@@ -0,0 +1,51 @@
+import React, { useEffect, useState } from "react";
+import { Text, View } from "react-native";
+import ETextInput from "@components/ETextInput";
+import EFullButton from "@components/EButton";
+import { ELabelText, ETitleText } from "@components/EText";
+import ENavButtons from "@components/ENavButtons";
+import { useAuthState } from "@components/AuthProvider";
+import { useRouter } from "expo-router";
+
+// implement logic here later.
+export default function RegisterEmail(props: any) {
+ const [email, setEmail] = useState('');
+ const emailre =
+ /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
+ const [user, loginState, setLoginState] = useAuthState();
+ useEffect(() => {
+ setEmail(loginState?.tempEmail || '')
+ }, [])
+ const router = useRouter();
+ return (
+ <>
+
+
+
+
+ 이메일을 입력해주세요
+
+
+ 이메일
+ setLoginState && setLoginState({ ...loginState, tempEmail: v })}
+ />
+
+
+ router.push('auth/createpassword', )}
+ />
+
+ >
+ );
+}
diff --git a/app/index.tsx b/app/index.tsx
new file mode 100644
index 0000000..ab0239e
--- /dev/null
+++ b/app/index.tsx
@@ -0,0 +1,35 @@
+import React, { useEffect, useState } from 'react';
+import {Button, Text, View} from 'react-native';
+import ELogo from '@components/ELogo';
+import { useAuthState } from '@components/AuthProvider';
+import { Redirect, useRouter } from 'expo-router';
+import auth from '@react-native-firebase/auth';
+
+export default function LoginScreen(props:any) {
+ const [user, _, setLoginState, init] = useAuthState();
+ const [redirect, setRedirect] = useState(false);
+ const router = useRouter();
+ useEffect(() => {
+ if (!init) {
+ if (user === null) setRedirect(true);
+ }
+ }, [init])
+ if (redirect) {
+ return
+ }
+ return (
+ <>
+
+
+ {JSON.stringify(user)} , {JSON.stringify(init)}
+
+ >
+ );
+}
diff --git a/assets/fonts/Axiforma-ExtraBold.otf b/assets/fonts/Axiforma-ExtraBold.otf
new file mode 100644
index 0000000..1da1f1e
--- /dev/null
+++ b/assets/fonts/Axiforma-ExtraBold.otf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a98f65d4fc5a6f23e7ee9a154a1fffa888757f6575add8d4035e84c7b3101d4b
+size 115273
diff --git a/assets/fonts/Axiforma-ExtraBoldItalic.otf b/assets/fonts/Axiforma-ExtraBoldItalic.otf
new file mode 100644
index 0000000..0752ef0
--- /dev/null
+++ b/assets/fonts/Axiforma-ExtraBoldItalic.otf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:079a2ad7762542ce69b68050b12109b64f028d970fa3aeb0f9a3c92a15a3d3ca
+size 117672
diff --git a/assets/fonts/Pretendard-Black.ttf b/assets/fonts/Pretendard-Black.ttf
new file mode 100644
index 0000000..2272266
--- /dev/null
+++ b/assets/fonts/Pretendard-Black.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a7c1fd65a599f9d25de860cc832ea9ac40c207775e33eb4344a4647392a2b5d
+size 2665004
diff --git a/assets/fonts/Pretendard-Bold.ttf b/assets/fonts/Pretendard-Bold.ttf
new file mode 100644
index 0000000..673532c
--- /dev/null
+++ b/assets/fonts/Pretendard-Bold.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c16b88c670d23e83fa1170c954cbc4822d3b8dad3c3cde15d798a94b43d97985
+size 2661752
diff --git a/assets/fonts/Pretendard-ExtraBold.ttf b/assets/fonts/Pretendard-ExtraBold.ttf
new file mode 100644
index 0000000..413b986
--- /dev/null
+++ b/assets/fonts/Pretendard-ExtraBold.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eedbd2877218242323bdff816684f7f5c325e54ae820d5b78eec9a5e5c7edef6
+size 2669648
diff --git a/assets/fonts/Pretendard-ExtraLight.ttf b/assets/fonts/Pretendard-ExtraLight.ttf
new file mode 100644
index 0000000..cf3a986
--- /dev/null
+++ b/assets/fonts/Pretendard-ExtraLight.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:041fad1c6a532208d52def16576f0d1dd7f1b77b9306c657f69bf619f2b638cc
+size 2838808
diff --git a/assets/fonts/Pretendard-Light.ttf b/assets/fonts/Pretendard-Light.ttf
new file mode 100644
index 0000000..cad44fc
--- /dev/null
+++ b/assets/fonts/Pretendard-Light.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ba73b22955754bb9ed6bbf7678416af647f90704e9064661f7924da578dad3e
+size 2813692
diff --git a/assets/fonts/Pretendard-Medium.ttf b/assets/fonts/Pretendard-Medium.ttf
new file mode 100644
index 0000000..5761c7a
--- /dev/null
+++ b/assets/fonts/Pretendard-Medium.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3bae579377eb8e9ac412cb4809ebc3de1d956ed75995c1e346f0c1311053f4e2
+size 2701192
diff --git a/assets/fonts/Pretendard-Regular.ttf b/assets/fonts/Pretendard-Regular.ttf
new file mode 100644
index 0000000..c9af195
--- /dev/null
+++ b/assets/fonts/Pretendard-Regular.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d0af5258997aec7354a6e340fc2325ba321c410ca48b3af858c8c3d6e92a324
+size 2725828
diff --git a/assets/fonts/Pretendard-SemiBold.ttf b/assets/fonts/Pretendard-SemiBold.ttf
new file mode 100644
index 0000000..21e29f8
--- /dev/null
+++ b/assets/fonts/Pretendard-SemiBold.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e1c548732af70873103066c16e1369b9a8a871f0b38c321a1d5bc73e43cea2d
+size 2671468
diff --git a/assets/fonts/Pretendard-Thin.ttf b/assets/fonts/Pretendard-Thin.ttf
new file mode 100644
index 0000000..c45ddea
--- /dev/null
+++ b/assets/fonts/Pretendard-Thin.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5f65cfe7d99934ee73de983df26154666c65418d73a62f634110945f2ddc0caf
+size 2868924
diff --git a/assets/splash2.png b/assets/splash2.png
new file mode 100644
index 0000000..980447a
--- /dev/null
+++ b/assets/splash2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c39c7615c2e05129b66f22c51111de732e04a320252e999edc7387f84590ca46
+size 9995
diff --git a/components/AuthProvider.tsx b/components/AuthProvider.tsx
new file mode 100644
index 0000000..97c8682
--- /dev/null
+++ b/components/AuthProvider.tsx
@@ -0,0 +1,42 @@
+import React, { createContext, useContext, useEffect, useState } from "react";
+import auth, { FirebaseAuthTypes } from "@react-native-firebase/auth";
+import { useRouter } from "expo-router";
+
+interface LoginState {
+ tempEmail?: string;
+ passwordReset?: boolean
+}
+
+const AuthContext = createContext<
+ [
+ FirebaseAuthTypes.User | null,
+ LoginState | null,
+ React.Dispatch> | null,
+ boolean
+ ]
+>([null, null, null, false]);
+
+export default function AuthProvider(props: { children: React.ReactNode }) {
+ const [user, setUser] = useState(null);
+ const [init, setInit] = useState(true);
+ const [loginstate, setLogInState] = useState(null);
+ useEffect(() => {
+ const subscriber = auth().onAuthStateChanged((u) => {
+ setUser(u);
+ if (init) {
+ setInit(false);
+ }
+ return subscriber;
+ });
+ }, []);
+ if (init) return null;
+ return (
+
+ {props.children}
+
+ );
+}
+
+export function useAuthState() {
+ return useContext(AuthContext);
+}
diff --git a/components/Design.ts b/components/Design.ts
new file mode 100644
index 0000000..644a40e
--- /dev/null
+++ b/components/Design.ts
@@ -0,0 +1,60 @@
+import React from "react";
+
+export const ColorScheme = {
+ frostedfill: {
+ black: {
+ 10: 'rgba(0,0,0,0.6)',
+ 20: 'rgba(0,0,0,0.2)',
+ },
+ white: {
+ 10: 'rgba(255,255,255,0.15)',
+ 20: 'rgba(255,255,255,0.5)',
+ },
+ },
+ fill: {
+ 10: 'rgba(255,255,255,0.85)',
+ 20: 'rgba(255,255,255,0.5)',
+ 30: 'rgba(255,255,255,0.3)',
+ 40: 'rgba(255,255,255,0.15)',
+ 50: 'rgba(255,255,255,0.08)',
+ 60: 'rgba(255,255,255,0.05)',
+ black: '#000000',
+ accent: '#40FF4F',
+ background: '#090909',
+ },
+ text: {
+ 10: 'rgba(255,255,255,0.95)',
+ 20: 'rgba(255,255,255,0.55)',
+ 30: 'rgba(255,255,255,0.30)',
+ inverse: 'rgba(0,0,0,0.9)',
+ },
+ divider: {
+ 10: 'rgba(255,255,255,0.30)',
+ 20: 'rgba(255,255,255,0.08)',
+ },
+ success: {
+ fill: '#00B23B',
+ text: '#16D956',
+ 10: '#00802A',
+ 20: '#009933',
+ 30: '#00591E',
+ 40: '#003311',
+ },
+ warning: {
+ fill: '#FF9F40',
+ text: '#FF9F40',
+ 10: '#CC8033',
+ 20: '#E58F39',
+ 30: '#592D00',
+ 40: '#331A00',
+ },
+ critical: {
+ fill: '#FF264B',
+ text: '#CC0023',
+ 10: '#99001A',
+ 20: '#B2001E',
+ 30: '#59000F',
+ 40: '#330009',
+ },
+ passthrough: '#00000000',
+}
diff --git a/components/EButton.tsx b/components/EButton.tsx
new file mode 100644
index 0000000..d64c404
--- /dev/null
+++ b/components/EButton.tsx
@@ -0,0 +1,93 @@
+import React from 'react';
+import {Pressable, StyleProp, ViewStyle} from 'react-native';
+import {ColorScheme} from './Design';
+import {Text} from 'react-native';
+
+export default function EFullButton(props: {
+ text: string;
+ active?: boolean;
+ onPress?: () => void;
+ style?: StyleProp;
+}) {
+ return (
+ props.active && props.onPress && props.onPress()}>
+
+ {props.text}
+
+
+ );
+}
+
+export function ESmallButton(props: {
+ text: string;
+ active?: boolean;
+ onPress?: () => void;
+ style?: StyleProp;
+}) {
+ return (
+ props.active && props.onPress && props.onPress()}>
+
+ {props.text}
+
+
+ );
+}
+
+export function EIconButton(props: {
+ children: React.ReactNode,
+ active?: boolean;
+ onPress?: () => void;
+ style?: StyleProp;
+}) {
+ return (
+ props.active && props.onPress && props.onPress()}>
+ {props.children}
+
+ );
+}
diff --git a/components/EIcons.tsx b/components/EIcons.tsx
new file mode 100644
index 0000000..db49ff7
--- /dev/null
+++ b/components/EIcons.tsx
@@ -0,0 +1,100 @@
+import React from 'react';
+import Svg, {G, Path, Defs, ClipPath, Rect} from 'react-native-svg';
+
+export const CrossIcon = (props: any) => (
+
+);
+
+export const EyeIcon = (props: any) => (
+
+);
+
+export const SuccessIcon = (props: any) => (
+
+);
+
+export const FailIcon = (props: any) => (
+
+);
+
+export const AppleIcon = (props:any) => (
+
+);
+
+export const GoogleIcon = (props:any) => (
+
+);
+
+
+
+export default {CrossIcon, EyeIcon};
diff --git a/components/ELogo.tsx b/components/ELogo.tsx
new file mode 100644
index 0000000..083aa6f
--- /dev/null
+++ b/components/ELogo.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import {Text} from 'react-native';
+import {ColorScheme} from './Design';
+
+export default function ELogo() {
+ return (
+
+ essentory
+
+ );
+}
diff --git a/components/ENavButtons.tsx b/components/ENavButtons.tsx
new file mode 100644
index 0000000..6362e02
--- /dev/null
+++ b/components/ENavButtons.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import {Pressable, StyleProp, Text, View, ViewStyle} from 'react-native';
+import {Svg, Path} from 'react-native-svg';
+import {ColorScheme} from './Design';
+import { useRouter } from 'expo-router';
+
+const BackButton = (props: any) => (
+
+);
+
+// fill in logic for moving back later.
+export default function ENavButtons(props: {
+ back?: boolean;
+ style?: StyleProp,
+}) {
+ const router = useRouter();
+ return (
+
+ {props.back && router.back()}>}
+
+ );
+}
diff --git a/components/EText.tsx b/components/EText.tsx
new file mode 100644
index 0000000..09cf73e
--- /dev/null
+++ b/components/EText.tsx
@@ -0,0 +1,76 @@
+import React from 'react';
+import {StyleProp, Text, TextStyle, ViewStyle} from 'react-native';
+import {ColorScheme} from './Design';
+
+export default function EText(props: {
+ children: React.ReactNode;
+ style?: StyleProp;
+}) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+export function ETitleText(props: {
+ children: React.ReactNode;
+ style?: StyleProp;
+}) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+export function ELabelText(props: {
+ children: React.ReactNode;
+ style?: StyleProp;
+}) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+export function ECaptionText(props: {
+ children: React.ReactNode;
+ error?: boolean;
+ style?: StyleProp;
+}) {
+ return (
+
+ {props.children}
+
+ );
+}
diff --git a/components/ETextInput.tsx b/components/ETextInput.tsx
new file mode 100644
index 0000000..2ffc7d5
--- /dev/null
+++ b/components/ETextInput.tsx
@@ -0,0 +1,113 @@
+import React, {useState} from 'react';
+import {StyleProp, Text, TextInput, View, ViewStyle} from 'react-native';
+import {ColorScheme} from './Design';
+import {CrossIcon, EyeIcon, FailIcon, SuccessIcon} from './EIcons';
+
+export enum ETextInputBorder {
+ Nothing = 0,
+ Border = 1,
+ Success = 2,
+ Fail = 3,
+}
+
+const borderColorScheme = [
+ 'rgba(0,0,0,0)',
+ ColorScheme.fill[30],
+ ColorScheme.success.fill,
+ ColorScheme.critical.fill,
+];
+
+export default function ETextInput(props: {
+ placeholder: string;
+ value: string;
+ setValue: any;
+ passwordHidden?: boolean;
+ setPasswordHidden?: (newState: boolean) => void;
+ checkFailStatus?: boolean;
+ border?: ETextInputBorder;
+ style?: StyleProp;
+ onChange?: (value: string) => void;
+}) {
+ const border =
+ props.border === undefined ? ETextInputBorder.Nothing : props.border;
+ const [focused, setFocused] = useState(false);
+
+ const clear = () => {
+ props.setValue('');
+ props.onChange !== undefined && props.onChange('');
+ };
+
+ const sideIcon = () => {
+ if (props.setPasswordHidden !== undefined) {
+ return (
+
+ props.setPasswordHidden &&
+ props.setPasswordHidden(!props.passwordHidden)
+ }
+ />
+ );
+ } else if (props.checkFailStatus !== undefined) {
+ return props.checkFailStatus ? (
+
+ ) : (
+
+ );
+ } else {
+ return (
+ props.value &&
+ );
+ }
+ };
+
+ return (
+
+ setFocused(true)}
+ onBlur={() => setFocused(false)}
+ onChangeText={text => {
+ props.setValue(text);
+ props.onChange !== undefined && props.onChange(text);
+ }}
+ value={props.value}
+ placeholder={props.placeholder}
+ placeholderTextColor={ColorScheme.fill[30]}
+ secureTextEntry={props.passwordHidden}
+ style={{
+ fontFamily: 'Pretendard-SemiBold',
+ fontSize: 17,
+ fontWeight: '300',
+ color: ColorScheme.fill[10],
+ margin: 0,
+ padding: 0,
+ flex: 1,
+ }}>
+ {sideIcon()}
+
+ );
+}
diff --git a/package-lock.json b/package-lock.json
index 468577a..53f010b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,10 +8,22 @@
"name": "loginmockup2",
"version": "1.0.0",
"dependencies": {
+ "@react-native-firebase/app": "^19.1.2",
+ "@react-native-firebase/auth": "^19.1.2",
+ "@react-native-google-signin/google-signin": "^11.0.1",
"expo": "~50.0.14",
+ "expo-constants": "~15.4.5",
+ "expo-dev-client": "~3.3.11",
+ "expo-font": "~11.10.3",
+ "expo-linking": "~6.2.2",
+ "expo-router": "~3.4.8",
+ "expo-splash-screen": "~0.26.4",
"expo-status-bar": "~1.11.1",
"react": "18.2.0",
- "react-native": "0.73.6"
+ "react-native": "0.73.6",
+ "react-native-safe-area-context": "4.8.2",
+ "react-native-screens": "~3.29.0",
+ "react-native-svg": "14.1.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
@@ -3038,6 +3050,14 @@
"node": ">= 8"
}
},
+ "node_modules/@expo/metro-runtime": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-3.1.3.tgz",
+ "integrity": "sha512-u1CaQJJlSgvxBB5NJ6YMVvSDTTRzjT71dHpEBnKPZhpFv5ebVry52FZ2sEeEEA6mHG5zGxWXmHImW3hNKHh8EA==",
+ "peerDependencies": {
+ "react-native": "*"
+ }
+ },
"node_modules/@expo/osascript": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.0.tgz",
@@ -3253,6 +3273,17 @@
"resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz",
"integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ=="
},
+ "node_modules/@expo/server": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@expo/server/-/server-0.3.1.tgz",
+ "integrity": "sha512-cCKyVA2IR9J4hDFPXzj3L08+Ngd/7z2F+JtdW0NLy03qShXBI5NSEEcaiHtjrgsLXPDe9PBw5Xgsfmxuduyggg==",
+ "dependencies": {
+ "@remix-run/node": "^1.19.3",
+ "abort-controller": "^3.0.0",
+ "debug": "^4.3.4",
+ "source-map-support": "~0.5.21"
+ }
+ },
"node_modules/@expo/spawn-async": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz",
@@ -3698,6 +3729,29 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz",
+ "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz",
+ "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0"
+ }
+ },
"node_modules/@react-native-community/cli": {
"version": "12.3.6",
"resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.6.tgz",
@@ -5458,6 +5512,57 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
+ "node_modules/@react-native-firebase/app": {
+ "version": "19.1.2",
+ "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-19.1.2.tgz",
+ "integrity": "sha512-5PJSbsdl6xvWq+V5/MfmeLWkpf1tcIheP6UYHgIy8p/mfsQRQIzUSDD7MMKdJqSQOrjdu91hWGdDvnRIdk+f1g==",
+ "dependencies": {
+ "opencollective-postinstall": "^2.0.3",
+ "superstruct": "^0.6.2"
+ },
+ "peerDependencies": {
+ "expo": ">=47.0.0",
+ "react": "*",
+ "react-native": "*"
+ },
+ "peerDependenciesMeta": {
+ "expo": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-native-firebase/auth": {
+ "version": "19.1.2",
+ "resolved": "https://registry.npmjs.org/@react-native-firebase/auth/-/auth-19.1.2.tgz",
+ "integrity": "sha512-rZJLGBDimw+JT+RwRyqm/HtotJ19qoeyw/qTClnHeh8cRzvq6PAB4f+y52V/kFqzuZtly/xRNmKBdAIAq94/5Q==",
+ "dependencies": {
+ "plist": "^3.1.0"
+ },
+ "peerDependencies": {
+ "@react-native-firebase/app": "19.1.2",
+ "expo": ">=47.0.0"
+ },
+ "peerDependenciesMeta": {
+ "expo": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-native-google-signin/google-signin": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/@react-native-google-signin/google-signin/-/google-signin-11.0.1.tgz",
+ "integrity": "sha512-ZRSEd1ME31XZ+azS3Qe6TRb8NRicGmtRdD1vT4Tz2birnlTfNfRgy4qLrEKNZyMUTodA6+J2UvA2JWwT8ZQ/dw==",
+ "peerDependencies": {
+ "expo": ">=47.0.0",
+ "react": "*",
+ "react-native": "*"
+ },
+ "peerDependenciesMeta": {
+ "expo": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@react-native/assets-registry": {
"version": "0.73.1",
"resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.73.1.tgz",
@@ -6002,6 +6107,210 @@
"react-native": "*"
}
},
+ "node_modules/@react-navigation/bottom-tabs": {
+ "version": "6.5.20",
+ "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.20.tgz",
+ "integrity": "sha512-ow6Z06iS4VqBO8d7FP+HsGjJLWt2xTWIvuWjpoCvsM/uQXzCRDIjBv9HaKcXbF0yTW7IMir0oDAbU5PFzEDdgA==",
+ "dependencies": {
+ "@react-navigation/elements": "^1.3.30",
+ "color": "^4.2.3",
+ "warn-once": "^0.1.0"
+ },
+ "peerDependencies": {
+ "@react-navigation/native": "^6.0.0",
+ "react": "*",
+ "react-native": "*",
+ "react-native-safe-area-context": ">= 3.0.0",
+ "react-native-screens": ">= 3.0.0"
+ }
+ },
+ "node_modules/@react-navigation/core": {
+ "version": "6.4.16",
+ "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.16.tgz",
+ "integrity": "sha512-UDTJBsHxnzgFETR3ZxhctP+RWr4SkyeZpbhpkQoIGOuwSCkt1SE0qjU48/u6r6w6XlX8OqVudn1Ab0QFXTHxuQ==",
+ "dependencies": {
+ "@react-navigation/routers": "^6.1.9",
+ "escape-string-regexp": "^4.0.0",
+ "nanoid": "^3.1.23",
+ "query-string": "^7.1.3",
+ "react-is": "^16.13.0",
+ "use-latest-callback": "^0.1.9"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/@react-navigation/core/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@react-navigation/core/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/@react-navigation/elements": {
+ "version": "1.3.30",
+ "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.30.tgz",
+ "integrity": "sha512-plhc8UvCZs0UkV+sI+3bisIyn78wz9O/BiWZXpounu72k/R/Sj5PuZYFJ1fi6psvriUveMCGh4LeZckAZu2qiQ==",
+ "peerDependencies": {
+ "@react-navigation/native": "^6.0.0",
+ "react": "*",
+ "react-native": "*",
+ "react-native-safe-area-context": ">= 3.0.0"
+ }
+ },
+ "node_modules/@react-navigation/native": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.17.tgz",
+ "integrity": "sha512-mer3OvfwWOHoUSMJyLa4vnBH3zpFmCwuzrBPlw7feXklurr/ZDiLjLxUScOot6jLRMz/67GyilEYMmP99LL0RQ==",
+ "dependencies": {
+ "@react-navigation/core": "^6.4.16",
+ "escape-string-regexp": "^4.0.0",
+ "fast-deep-equal": "^3.1.3",
+ "nanoid": "^3.1.23"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/@react-navigation/native-stack": {
+ "version": "6.9.26",
+ "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.26.tgz",
+ "integrity": "sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw==",
+ "dependencies": {
+ "@react-navigation/elements": "^1.3.30",
+ "warn-once": "^0.1.0"
+ },
+ "peerDependencies": {
+ "@react-navigation/native": "^6.0.0",
+ "react": "*",
+ "react-native": "*",
+ "react-native-safe-area-context": ">= 3.0.0",
+ "react-native-screens": ">= 3.0.0"
+ }
+ },
+ "node_modules/@react-navigation/native/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@react-navigation/routers": {
+ "version": "6.1.9",
+ "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz",
+ "integrity": "sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==",
+ "dependencies": {
+ "nanoid": "^3.1.23"
+ }
+ },
+ "node_modules/@remix-run/node": {
+ "version": "1.19.3",
+ "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-1.19.3.tgz",
+ "integrity": "sha512-z5qrVL65xLXIUpU4mkR4MKlMeKARLepgHAk4W5YY3IBXOreRqOGUC70POViYmY7x38c2Ia1NwqL80H+0h7jbMw==",
+ "dependencies": {
+ "@remix-run/server-runtime": "1.19.3",
+ "@remix-run/web-fetch": "^4.3.6",
+ "@remix-run/web-file": "^3.0.3",
+ "@remix-run/web-stream": "^1.0.4",
+ "@web3-storage/multipart-parser": "^1.0.0",
+ "abort-controller": "^3.0.0",
+ "cookie-signature": "^1.1.0",
+ "source-map-support": "^0.5.21",
+ "stream-slice": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz",
+ "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@remix-run/server-runtime": {
+ "version": "1.19.3",
+ "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-1.19.3.tgz",
+ "integrity": "sha512-KzQ+htUsKqpBgKE2tWo7kIIGy3MyHP58Io/itUPvV+weDjApwr9tQr9PZDPA3yAY6rAzLax7BU0NMSYCXWFY5A==",
+ "dependencies": {
+ "@remix-run/router": "1.7.2",
+ "@types/cookie": "^0.4.1",
+ "@web3-storage/multipart-parser": "^1.0.0",
+ "cookie": "^0.4.1",
+ "set-cookie-parser": "^2.4.8",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@remix-run/web-blob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/web-blob/-/web-blob-3.1.0.tgz",
+ "integrity": "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==",
+ "dependencies": {
+ "@remix-run/web-stream": "^1.1.0",
+ "web-encoding": "1.1.5"
+ }
+ },
+ "node_modules/@remix-run/web-fetch": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz",
+ "integrity": "sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==",
+ "dependencies": {
+ "@remix-run/web-blob": "^3.1.0",
+ "@remix-run/web-file": "^3.1.0",
+ "@remix-run/web-form-data": "^3.1.0",
+ "@remix-run/web-stream": "^1.1.0",
+ "@web3-storage/multipart-parser": "^1.0.0",
+ "abort-controller": "^3.0.0",
+ "data-uri-to-buffer": "^3.0.1",
+ "mrmime": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.17 || >=12.3"
+ }
+ },
+ "node_modules/@remix-run/web-file": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/web-file/-/web-file-3.1.0.tgz",
+ "integrity": "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==",
+ "dependencies": {
+ "@remix-run/web-blob": "^3.1.0"
+ }
+ },
+ "node_modules/@remix-run/web-form-data": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz",
+ "integrity": "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==",
+ "dependencies": {
+ "web-encoding": "1.1.5"
+ }
+ },
+ "node_modules/@remix-run/web-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/web-stream/-/web-stream-1.1.0.tgz",
+ "integrity": "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==",
+ "dependencies": {
+ "web-streams-polyfill": "^3.1.1"
+ }
+ },
"node_modules/@segment/loosely-validate-event": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz",
@@ -6050,6 +6359,11 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+ },
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
@@ -6071,6 +6385,11 @@
"@types/istanbul-lib-report": "*"
}
},
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+ },
"node_modules/@types/node": {
"version": "20.12.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.6.tgz",
@@ -6137,6 +6456,11 @@
"graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
}
},
+ "node_modules/@web3-storage/multipart-parser": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz",
+ "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw=="
+ },
"node_modules/@xmldom/xmldom": {
"version": "0.7.13",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz",
@@ -6145,6 +6469,12 @@
"node": ">=10.0.0"
}
},
+ "node_modules/@zxing/text-encoding": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz",
+ "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==",
+ "optional": true
+ },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -6202,6 +6532,48 @@
"node": ">=8"
}
},
+ "node_modules/ajv": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+ "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
"node_modules/anser": {
"version": "1.4.10",
"resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
@@ -6681,6 +7053,11 @@
"resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
"integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w=="
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ },
"node_modules/bplist-creator": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
@@ -7161,6 +7538,18 @@
"node": ">=6"
}
},
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -7174,6 +7563,31 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/color/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
"node_modules/colorette": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
@@ -7294,6 +7708,22 @@
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
},
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz",
+ "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
"node_modules/core-js-compat": {
"version": "3.36.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
@@ -7372,6 +7802,52 @@
"node": ">=8"
}
},
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -7383,6 +7859,14 @@
"resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz",
"integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw=="
},
+ "node_modules/data-uri-to-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
+ "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/data-view-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
@@ -7460,6 +7944,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -7647,19 +8139,70 @@
"node": ">=8"
}
},
- "node_modules/dotenv": {
- "version": "16.4.5",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
- "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
- "engines": {
- "node": ">=12"
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
},
"funding": {
- "url": "https://dotenvx.com"
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "node_modules/dotenv-expand": {
- "version": "11.0.6",
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "11.0.6",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz",
"integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==",
"dependencies": {
@@ -7703,6 +8246,17 @@
"once": "^1.4.0"
}
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/env-editor": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
@@ -8001,6 +8555,116 @@
"expo": "*"
}
},
+ "node_modules/expo-dev-client": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-3.3.11.tgz",
+ "integrity": "sha512-9nhhbfbskfmjp/tlRS5KvDpCoW0BREJBxpu2GyjKu7nDB33W8fJLL0wXgNhP+QEb93r37o3uezKmUm2kibOvTw==",
+ "dependencies": {
+ "expo-dev-launcher": "3.6.9",
+ "expo-dev-menu": "4.5.8",
+ "expo-dev-menu-interface": "1.7.2",
+ "expo-manifests": "~0.13.0",
+ "expo-updates-interface": "~0.15.1"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/expo-dev-launcher": {
+ "version": "3.6.9",
+ "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-3.6.9.tgz",
+ "integrity": "sha512-MBDMAqjCMVYt1Zv47u2dJTp4d8gCZMfM4GWAFhfQy3G6XzkUlFtewaQefAqy93FcYOv6BYdC9yZOLOb06tqTfA==",
+ "dependencies": {
+ "ajv": "8.11.0",
+ "expo-dev-menu": "4.5.8",
+ "expo-manifests": "~0.13.0",
+ "resolve-from": "^5.0.0",
+ "semver": "^7.5.3"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/expo-dev-launcher/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-dev-launcher/node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-dev-launcher/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/expo-dev-menu": {
+ "version": "4.5.8",
+ "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-4.5.8.tgz",
+ "integrity": "sha512-GXfI0CmYlqjOqyFjtplXO9PSoJQoy89+50lbUSNZykDsGyvzCPzl4txdQcdHHSglKYr7lWV7aeMVeehuSct60w==",
+ "dependencies": {
+ "expo-dev-menu-interface": "1.7.2",
+ "semver": "^7.5.3"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/expo-dev-menu-interface": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-1.7.2.tgz",
+ "integrity": "sha512-V/geSB9rW0IPTR+d7E5CcvkV0uVUCE7SMHZqE/J0/dH06Wo8AahB16fimXeh5/hTL2Qztq8CQ41xpFUBoA9TEw==",
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/expo-dev-menu/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-dev-menu/node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/expo-dev-menu/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
"node_modules/expo-file-system": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-16.0.8.tgz",
@@ -8020,6 +8684,11 @@
"expo": "*"
}
},
+ "node_modules/expo-json-utils": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.12.3.tgz",
+ "integrity": "sha512-4pypQdinpNc6XY9wsZk56njvzDh+B/9mISr7FPP3CVk1QGB1nSLh883/BCDSgnsephATZkC5HG+cdE60kCAR6A=="
+ },
"node_modules/expo-keep-awake": {
"version": "12.8.2",
"resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-12.8.2.tgz",
@@ -8028,6 +8697,27 @@
"expo": "*"
}
},
+ "node_modules/expo-linking": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-6.2.2.tgz",
+ "integrity": "sha512-FEe6lP4f7xFT/vjoHRG+tt6EPVtkEGaWNK1smpaUevmNdyCJKqW0PDB8o8sfG6y7fly8ULe8qg3HhKh5J7aqUQ==",
+ "dependencies": {
+ "expo-constants": "~15.4.3",
+ "invariant": "^2.2.4"
+ }
+ },
+ "node_modules/expo-manifests": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-0.13.2.tgz",
+ "integrity": "sha512-l0Sia1WmLULx8V41K8RzGLsFoTe4qqthPRGpHjItsYn8ZB6lRrdTBM9OYp2McIflgqN1HAimUCQMFIwJyH+UmA==",
+ "dependencies": {
+ "@expo/config": "~8.5.0",
+ "expo-json-utils": "~0.12.0"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
"node_modules/expo-modules-autolinking": {
"version": "1.10.3",
"resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.10.3.tgz",
@@ -8149,11 +8839,72 @@
"invariant": "^2.2.4"
}
},
+ "node_modules/expo-router": {
+ "version": "3.4.8",
+ "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-3.4.8.tgz",
+ "integrity": "sha512-fOOAWHH4LSPjPFtIZbApxdTNU8xSS8qKvhZ7PfWNMfx9510J1R1Ce/nwENPzcRLHRuVofDsSAEBfi4kV03fJwg==",
+ "dependencies": {
+ "@expo/metro-runtime": "3.1.3",
+ "@expo/server": "^0.3.0",
+ "@radix-ui/react-slot": "1.0.1",
+ "@react-navigation/bottom-tabs": "~6.5.7",
+ "@react-navigation/native": "~6.1.6",
+ "@react-navigation/native-stack": "~6.9.12",
+ "expo-splash-screen": "0.26.4",
+ "react-helmet-async": "^1.3.0",
+ "schema-utils": "^4.0.1"
+ },
+ "peerDependencies": {
+ "@react-navigation/drawer": "^6.5.8",
+ "expo": "*",
+ "expo-constants": "*",
+ "expo-linking": "*",
+ "expo-status-bar": "*",
+ "react-native-reanimated": "*",
+ "react-native-safe-area-context": "*",
+ "react-native-screens": "*"
+ },
+ "peerDependenciesMeta": {
+ "@react-navigation/drawer": {
+ "optional": true
+ },
+ "@testing-library/jest-native": {
+ "optional": true
+ },
+ "react-native-reanimated": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/expo-splash-screen": {
+ "version": "0.26.4",
+ "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.26.4.tgz",
+ "integrity": "sha512-2DwofTQ0FFQCsvDysm/msENsbyNsJiAJwK3qK/oXeizECAPqD7bK19J4z9kuEbr7ORPX9MLnTQYKl6kmX3keUg==",
+ "dependencies": {
+ "@expo/prebuild-config": "6.7.4"
+ },
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
"node_modules/expo-status-bar": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.11.1.tgz",
"integrity": "sha512-ddQEtCOgYHTLlFUe/yH67dDBIoct5VIULthyT3LRJbEwdpzAgueKsX2FYK02ldh440V87PWKCamh7R9evk1rrg=="
},
+ "node_modules/expo-updates-interface": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-0.15.3.tgz",
+ "integrity": "sha512-uLvsbaCmUsXgJqeen8rYH/jPr874ZUCXEvWpKHxrCv5/XATPlYEaDuecbNSGQ+cu78i6MdtB4BHOwZmoH2d47A==",
+ "peerDependencies": {
+ "expo": "*"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
"node_modules/fast-glob": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -8249,6 +9000,14 @@
"node": ">=8"
}
},
+ "node_modules/filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
@@ -8341,6 +9100,25 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==",
+ "dependencies": {
+ "for-in": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
@@ -8949,6 +9727,21 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-array-buffer": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
@@ -9072,6 +9865,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -9088,6 +9889,20 @@
"node": ">=4"
}
},
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -9912,6 +10727,11 @@
"is-buffer": "~1.1.1"
}
},
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -10451,6 +11271,11 @@
"resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz",
"integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ=="
},
+ "node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
"node_modules/memoize-one": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
@@ -11043,6 +11868,26 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
+ "node_modules/mixin-object": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+ "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
+ "dependencies": {
+ "for-in": "^0.1.3",
+ "is-extendable": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-object/node_modules/for-in": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+ "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -11054,6 +11899,14 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -11271,6 +12124,17 @@
"node": ">=4"
}
},
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/nullthrows": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
@@ -11379,6 +12243,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/opencollective-postinstall": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+ "bin": {
+ "opencollective-postinstall": "index.js"
+ }
+ },
"node_modules/ora": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
@@ -11970,6 +12842,23 @@
"qrcode-terminal": "bin/qrcode-terminal.js"
}
},
+ "node_modules/query-string": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+ "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+ "dependencies": {
+ "decode-uri-component": "^0.2.2",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/queue": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
@@ -12059,6 +12948,60 @@
}
}
},
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-dom/node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+ },
+ "node_modules/react-freeze": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz",
+ "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=17.0.0"
+ }
+ },
+ "node_modules/react-helmet-async": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
+ "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.2.0",
+ "shallowequal": "^1.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.6.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@@ -12118,6 +13061,41 @@
"react": "18.2.0"
}
},
+ "node_modules/react-native-safe-area-context": {
+ "version": "4.8.2",
+ "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.8.2.tgz",
+ "integrity": "sha512-ffUOv8BJQ6RqO3nLml5gxJ6ab3EestPiyWekxdzO/1MQ7NF8fW1Mzh1C5QE9yq573Xefnc7FuzGXjtesZGv7cQ==",
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-screens": {
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.29.0.tgz",
+ "integrity": "sha512-yB1GoAMamFAcYf4ku94uBPn0/ani9QG7NdI98beJ5cet2YFESYYzuEIuU+kt+CNRcO8qqKeugxlfgAa3HyTqlg==",
+ "dependencies": {
+ "react-freeze": "^1.0.0",
+ "warn-once": "^0.1.0"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-svg": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-14.1.0.tgz",
+ "integrity": "sha512-HeseElmEk+AXGwFZl3h56s0LtYD9HyGdrpg8yd9QM26X+d7kjETrRQ9vCjtxuT5dCZEIQ5uggU1dQhzasnsCWA==",
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "css-tree": "^1.1.3"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native/node_modules/@react-native/codegen": {
"version": "0.73.3",
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz",
@@ -12568,6 +13546,24 @@
"loose-envify": "^1.1.0"
}
},
+ "node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -12674,6 +13670,11 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
},
+ "node_modules/set-cookie-parser": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
+ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ=="
+ },
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
@@ -12725,6 +13726,11 @@
"node": ">=8"
}
},
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+ },
"node_modules/shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -12795,6 +13801,19 @@
"node": ">= 5.10.0"
}
},
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
@@ -12873,6 +13892,14 @@
"node": "*"
}
},
+ "node_modules/split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -12948,6 +13975,19 @@
"node": ">= 0.10.0"
}
},
+ "node_modules/stream-slice": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz",
+ "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA=="
+ },
+ "node_modules/strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -13140,6 +14180,50 @@
"resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz",
"integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw=="
},
+ "node_modules/superstruct": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.6.2.tgz",
+ "integrity": "sha512-lvA97MFAJng3rfjcafT/zGTSWm6Tbpk++DP6It4Qg7oNaeM+2tdJMuVgGje21/bIpBEs6iQql1PJH6dKTjl4Ig==",
+ "dependencies": {
+ "clone-deep": "^2.0.1",
+ "kind-of": "^6.0.1"
+ }
+ },
+ "node_modules/superstruct/node_modules/clone-deep": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+ "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
+ "dependencies": {
+ "for-own": "^1.0.0",
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.0",
+ "shallow-clone": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/superstruct/node_modules/shallow-clone": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+ "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
+ "dependencies": {
+ "is-extendable": "^0.1.1",
+ "kind-of": "^5.0.0",
+ "mixin-object": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/superstruct/node_modules/shallow-clone/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -13726,11 +14810,39 @@
"browserslist": ">= 4.21.0"
}
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/url-join": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz",
"integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA=="
},
+ "node_modules/use-latest-callback": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.1.9.tgz",
+ "integrity": "sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw==",
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -13786,6 +14898,11 @@
"makeerror": "1.0.12"
}
},
+ "node_modules/warn-once": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz",
+ "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q=="
+ },
"node_modules/wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
@@ -13794,6 +14911,25 @@
"defaults": "^1.0.3"
}
},
+ "node_modules/web-encoding": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz",
+ "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==",
+ "dependencies": {
+ "util": "^0.12.3"
+ },
+ "optionalDependencies": {
+ "@zxing/text-encoding": "0.9.0"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
diff --git a/package.json b/package.json
index 70021b9..25903a2 100644
--- a/package.json
+++ b/package.json
@@ -1,18 +1,30 @@
{
"name": "loginmockup2",
"version": "1.0.0",
- "main": "node_modules/expo/AppEntry.js",
+ "main": "expo-router/entry",
"scripts": {
"start": "expo start",
- "android": "expo start --android",
- "ios": "expo start --ios",
+ "android": "expo run:android",
+ "ios": "expo run:ios",
"web": "expo start --web"
},
"dependencies": {
+ "@react-native-firebase/app": "^19.1.2",
+ "@react-native-firebase/auth": "^19.1.2",
+ "@react-native-google-signin/google-signin": "^11.0.1",
"expo": "~50.0.14",
+ "expo-constants": "~15.4.5",
+ "expo-dev-client": "~3.3.11",
+ "expo-font": "~11.10.3",
+ "expo-linking": "~6.2.2",
+ "expo-router": "~3.4.8",
+ "expo-splash-screen": "~0.26.4",
"expo-status-bar": "~1.11.1",
"react": "18.2.0",
- "react-native": "0.73.6"
+ "react-native": "0.73.6",
+ "react-native-safe-area-context": "4.8.2",
+ "react-native-screens": "~3.29.0",
+ "react-native-svg": "14.1.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
diff --git a/tsconfig.json b/tsconfig.json
index b9567f6..c452833 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,9 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
- "strict": true
+ "strict": true,
+ "paths": {
+ "@components/*": ["components/*"]
+ }
}
}