import { initializeApp } from 'firebase/app';
import { firebaseConfig } from '../env';

export const initFirebase = () => {
	return initializeApp(firebaseConfig);
};

위와 같이 사용하면 됨. 결과는 key 값들 가져옴.

app.js에서 가져오는게 좋겠고

인증하기

Firebase -> Authentification

1. 시작하기

이메일 비밀번호, 사용하고 저장해주면 됨

2. 사용하는 방법

firebase 문서에서 signInWithEmailAndPassword 를 찾아 아래와 같이 사용한다.

auth.js

import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';

export const signIn = async ({ email, password }) => {
	const { user } = await signInWithEmailAndPassword(
		getAuth(),
		email,
		password,
	);
	return user;
};

저러면 user 정보로 잘 가져오는 것을 확인할 수 있다.

LogBox 무시

LogBox.ignoreLogs(['AsyncStorage has been extracted from react-native core']);

위와 같이 사용하면 LogBox를 무시할 수 있다. 당연히 남용은 금물

로그인 실패 시 Alert

export const getAuthErrorMessage = errorCode => {
	switch (errorCode) {
		case AuthErrorCodes.USER_DELETED:
			return '계정을 찾을 수 없습니다.';
		case AuthErrorCodes.INVALID_EMAIL:
			return '유효하지 않은 이메일 주소입니다.';
		case AuthErrorCodes.INVALID_PASSWORD:
			return '잘못된 비밀번호입니다.';
		default:
			return '로그인에 실패하였습니다.';
	}
};

위와 같이 AuthErrorCodes 에서 Validate 넘겨서 Alert Message 만들어주면 됨.

try {
	const user = await signIn(form);
	console.log(user);
} catch (error) {
	const message = getAuthErrorMessage(error.code);
	Alert.alert('로그인 실패', message);
}

회원가입 기능 만들기

createUserWithEmailAndPassword 를 사용하면 됨.

export const signUp = async ({ email, password }) => {
	const { user } = await createUserWithEmailAndPassword(
		getAuth(),
		email,
		password,
	);
	return user;
};

그 외엔 로그인과 동일하게 처리해주면 됨.

상태변수 수정에 대하여

예를들어 아래와 같은 코드가 있다고 가정하자.

dispatch({ type: AuthFormTypes.TOGGLE_LOADING });
try {
	const user = await signUp(form);
	setUser(user);
} catch (error) {
	const message = getAuthErrorMessage(error.code);
	Alert.alert('회원가입 실패', message);
}
dispatch({ type: AuthFormTypes.TOGGLE_LOADING });

그러면 setUser가 정상적으로 진행되었을 때 Stack 자체가 하나는 unmount 하나는 mount 되면서

그 이후에 dispatch 함수는 실행이 되지 않는다. (상태변수는 수정이 되지 않는다.)

그래서 실패한 경우에만 dispatch를 넣어주면 된다.

dispatch({ type: AuthFormTypes.TOGGLE_LOADING });
try {
	const user = await signUp(form);
	setUser(user);
} catch (error) {
	const message = getAuthErrorMessage(error.code);
	Alert.alert('회원가입 실패', message, [
		{
			text: '확인',
			onPress: () => dispatch({ type: AuthFormTypes.TOGGLE_LOADING }),
		},
	]);
}

로그인 유지하기

firebase에서 로그인 유지하는 기능이 있음.

onAuthStateChanged()를 사용할 것! 그리구 expo48 버전부터는 AsyncStorage랑 같이 써야한다고 함.

export const onAuthStateChanged = callback => {
	return onAuthStateChangedFirebase(getAuth(), callback);
};

일단 위와 같이 함수 만들어서

  • 참고로 onAuthStateChangedFirebase 는 onAuthStateChanged as onAuthStateChangedFirebase, 위와 같이 가져왔음. (이름 같게 만들고 싶어서)
const unsubscribe = onAuthStateChanged(user => {
	if (user) {
		setUser(user);
	}
	setIsReady(true);
	unsubscribe();
});

위와 같이 사용해주면, 해당 사용자가 변경되었는지를 감지하여준다.

그 후에 setIsReady (SplashScreen 제거) 해줌으로써 로직 마무리