더북(TheBook)

Firebase에서 제공하는 함수들을 컴포넌트에 바로 사용하지 않고 임의의 함수를 따로 만들어 호출해줄 건데요. 이 방식을 권장하는 이유는 이렇게 함수를 감싸는 작업을 한 번 하면 추후 firebase를 사용하지 않고 다른 방식으로 인증할 경우에도 코드를 쉽게 전환할 수 있기 때문입니다.

signIn: 로그인을 하는 함수

signUp: 회원가입을 하는 함수

subscribeAuth: 앱을 가동할 때 또는 로그인 상태가 변경될 때 현재 사용자의 정보를 파라미터로 받아오는 특정 콜백 함수를 등록하는 함수

signOut: 로그아웃을 하는 함수

앞의 함수가 모두 준비됐으면 SignInScreen에서 사용해봅시다.

screens/SignInScreen.js

import React, {useState} from 'react';
import {
  Alert,
  Keyboard,
  KeyboardAvoidingView,
  Platform,
  StyleSheet,
  Text,
  View,
} from 'react-native';
import {SafeAreaView} from 'react-native-safe-area-context';
import SignButtons from '../components/SignButtons';
import SignInForm from '../components/SignForm';
import {signIn, signUp} from '../lib/auth';

function SignInScreen({navigation, route}) {
  const {isSignUp} = route.params || {};
  const [form, setForm] = useState({
    email: '',
    password: '',
    confirmPassword: '',
  });
  const [loading, setLoading] = useState();

  const createChangeTextHandler = (name) => (value) => {
    setForm({...form, [name]: value});
};

  const onSubmit = async () => {
    Keyboard.dismiss();
    const {email, password} = form;
    const info = {email, password};
    setLoading(true);
    try {
      const {user} = isSignUp ? await signUp(info) : await signIn(info);
      console.log(user);
    } catch (e) {
      Alert.alert('실패');
      console.log(e);
    } finally {
      setLoading(false);
    }
  };

(...)

  <SignButtons
    isSignUp={isSignUp}
    onSubmit={onSubmit}
    loading={loading}
  />

(...)

onSubmit에서 isSignUp 값에 따라 signUp 또는 signIn 함수를 호출하도록 해줬습니다. 이 함수들은 Promise를 반환하므로 async/await 문법을 사용해 작업이 끝날 때까지 기다렸다가 특정 작업을 수행할 수 있습니다. 이 함수가 처음 호출될 때는 loading 상태를 true로 만들고, 작업이 끝나면 loading 상태를 false로 만듭니다.

작업이 실패할 수 있는 상황은 다양한데요. 이에 대한 대처는 나중에 해주겠습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.