ItemInput.jsx
import React from "react";
import { StyleSheet } from "react-native";
import { Item, Input, Label } from "native-base";
export default function ItemInput({ title, type, setFunc }) {
return (
<Item floatingLabel last>
<Label style={styles.label}>{title}</Label>
<Input
style={styles.input}
// type이 패스워드면 화면상에 텍스트가 안보이게 처리하는 속성
secureTextEntry={type == "password" ? true : false}
//태그에 값이 입력되는 동시에 어떤 값이 입력되는 지 바로바로 뱉는 속성함수
onChangeText={(text) => {
setFunc(text);
}}
/>
</Item>
);
}
SignInPage.jsx
export default function SignInPage({ navigation }) {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const goSignUp = () => {
navigation.navigate('SignUpPage');
};
const doSignIn = () => {
//Email 로그인 버튼을 누를 때 실행되는 함수
//관리하는 상태 값을 확인
console.log(email);
console.log(password);
};
const setEmailFunc = (itemInputEmail) => {
//이메일 상태값을 관리하는 함수
setEmail(itemInputEmail);
};
const setPasswordFunc = (itemInputPassword) => {
//패스워드 상태값을 관리하는 함수
setPassword(itemInputPassword);
};
return (
<Container style={styles.container}>
<ImageBackground source={bImage} style={styles.backgroundImage}>
<Content contentContainerStyle={styles.content} scrollEnabled={false}>
<Text style={styles.title}>
<Text style={styles.highlite}>we</Text>gram
</Text>
<Form style={styles.form}>
<ItemInput title={'이메일'} type={'email'} setFunc={setEmailFunc} />
<ItemInput
title={'비밀번호'}
type={'password'}
setFunc={setPasswordFunc}
/>
</Form>
...
function Loading({ title, type, setFunc })
형태로 넘겨받은 값을 컴포넌트 내부에서 사용secureTextEntry
onChangeText
는 사용자가 한 글자 한 글자 입력할 때마다 입력 란에 입력된 값을 내뱉는 속성 함수
ItemInput.jsx
export default function Loading({ title, type, setFunc, error }) {
...
<>
<Item floatingLabel last>
<Label style={styles.label}>{title}</Label>
<Input
style={styles.input}
secureTextEntry={type == "password" ? true : false}
onChangeText={(text) => {
setFunc(text);
}}
/>
</Item>
<Item style={{ borderColor: "transparent" }}>
<Text style={{ color: "deeppink" }}>{error}</Text>
</Item>
</>
SingInPage.jsx
const [emailError, setEmailError] = useState("");
const [passwordError, setPasswordError] = useState("");
const doSignIn = () => {
if (email == "") {
setEmailError("이메일을 입력해주세요");
} else {
setEmailError("");
}
if (password == "") {
setPasswordError("비밀번호를 입력해주세요");
} else {
setPasswordError("");
}
};
...
<ItemInput
title={'E-mail'}
type={'email'}
setFunc={setEmailFunc}
error={emailError}
/>
<ItemInput
title={'Password'}
type={'password'}
setFunc={setPasswordFunc}
error={passwordError}
/>
...
UI = Component(state)
UI 화면은 컴포넌트에 상태가 주입 / 변경될 때 변한다
파이어베이스 expo 도구 설치
expo install firebase
설치 후 config 폴더 생성 > key.js 파일 생성
expo start로 앱 실행 시 터미널에서 컨트롤 + c 를 눌러 엑스포 앱 종료 후 파이어베이스 라이브러리 설치
key.js
export default {
firebaseConfig: {
<-- 생성한 계정 firebaseConfig 붙여넣기 -->
},
};
App.jsx
//파이어베이스 라이브러리
import firebase from 'firebase/compat/app'
//파이어베이스 접속 키값
import apiKeys from './config/key';
...
export default function App() {
//파이어베이스 라이브러리가 준비 되면 연결하는 조건문
if (!firebase.apps.length) {
console.log('Connected with Firebase');
firebase.initializeApp(apiKeys.firebaseConfig);
}
...
SignUpPage.jsx
const doSignUp = () => {
if (password == "") {
setPasswordError("비밀번호를 입력해주세요");
return false;
} else {
setPasswordError("");
}
if (passwordConfirm == "") {
setPasswordConfirmError("비밀번호 확인을 입력해주세요");
return false;
} else {
setPasswordConfirmError("");
}
if (password !== passwordConfirm) {
setPasswordConfirmError("비밀번호가 서로 일치하지 않습니다");
return false;
} else {
setPasswordConfirmError("");
}
};
return false
실행return false
는 자바스크립트 코드가 진행되다 중간에 멈추는 기능config / firebaseFunctions.js
import firebase from "firebase/compat";
import "firebase/compat/firestore";
import { Alert } from "react-native";
export async function registration(nickName, email, password) {
try {
await firebase.auth().createUserWithEmailAndPassword(email, password);
const currentUser = firebase.auth().currentUser;
Alert.alert("회원가입 성공");
} catch (err) {
Alert.alert("회원가입 실패 -> ", err.message);
}
}
export
async / await
파이어베이스 회원가입 함수 API
await firebase.auth().createUserWithEmailAndPassword(email, password);
const currentUser = firebase.auth().currentUser;
import firebase from 'firebase/compat/app'
파이어베이스 라이브러리에서 auth()
함수 호출auth()
함수 안의 createUserWithEmailAndPassword
함수 사용firebase.auth()
에서 currentUser 값 변수 생성 < 쿠키, 세션
기능으로 관리쿠키 & 세션
브라우저에 데이터를 저장해두고 사용하는 기능
SignUpPage.jsx
import { registration } from '../config/firebaseFunctions';
...
const doSignUp = () => {
...
registration(nickName, email, password);
};
Authentication
Cloud Firestore
두 서비스 모두 사용자 UID를 보유하여 로그인할 땐 Authentication에서 인증 진행 후 구체적 회원 정보를 가져올 땐 Cloud Firestore에서 관리
firebaseFunctions
export async function registration(nickName, email, password) {
try {
await firebase.auth().createUserWithEmailAndPassword(email, password);
const currentUser = firebase.auth().currentUser;
const db = firebase.firestore();
db.collection("users").doc(currentUser.uid).set({
email: currentUser.email,
nickName: nickName,
});
Alert.alert("회원가입 성공");
} catch (err) {
Alert.alert("회원가입 실패 -> ", err.message);
}
}
collection
은 책과 같은 개념doc
은 목차set
은 안에 삽입할 내용을 딕셔너리 형태로 저장 및 관리
firebaseFunctions
...
export async function signIn(email, password, navigation) {
try {
await firebase.auth().signInWithEmailAndPassword(email, password);
navigation.replace("TabNavigator");
} catch (err) {
Alert.alert("로그인 실패 -> ", err.message);
}
}
try...catch
문으로 로그인 성공 시 TanNavigator로 화면 전환email.trim()
과 같이 trim 함수를 이용해 문자열 앞뒤의 공백 제거export async function registration(nickName, email, password, navigation) {
try {
...
navigation.navigate('TabNavigator');
...
MainPage.jsx & SignInPage.jsx
...
useEffect(() => {
navigation.addListener('beforeRemove', (e) => {
e.preventDefault();
});
}, []);
...
firebaseFunctions.js
navigation.navigate('TabNavigator'); -> navigation.push('TabNavigator');
navigation.replace('TabNavigator'); -> navigation.push('TabNavigator');
iOS는 기본적으로 gesture 옵션 true
왼쪽에서 오른쪽을 쓸어넘겨 뒤로가기
StackNavigator.jsx
...
<Stack.Screen
name="SignInPage"
component={SignInPage}
options={{ gestureEnabled: false }}
/>
...