하나의 listener 안에 authentication 관련 코드를 모아보자.
일단 이 전에 한 코드를 지워준다.
sign-in-form에 있는 setCurrentUser를 지워준다.
sign-up-form에서도 useContext 관련을 지운다.
이제 context value가 업데이트 될 때마다 계속 re-run 할 필요가 없어졌다.
자동으로 performance가 좋아졌다.
navigation에서도 매뉴얼로 설정해 놓은
이제 sign out을 하면 onAuthStateChangeListener가 catch하기 때문에
signOutHandler 버튼이 필요가 없다.
onClick 했을 때 signOutUser만 호출해주면 된다.
이제 context로 돌아와서
listner에서 sign-in 되면 setCurrentUser에 user instance가 들어가고 sign out 되면 null이 들어간다.
로그인을 하면
콘솔에 정보가 나오고
화면의 SIGN OUT을 누르면
null이 나오는 것을 볼 수 있다.
sign in form 작업
sign-in-form 에서
signInWithGoogle 메소드에서 createUserDocumentFromAuth(user)를 떼서
user.context에 있는 listener 안으로 옮긴다.
그럼 user를 destructrue 할 필요는 없어진다.
리스너 안에서 user가 들어올 때만 이 user document를 만든다.
user가 들어오면 createUserDocumentFromAuth(user)를 리턴하고
아니면 setCurrentUser(user)를 리턴한다.
firebase에서 gmail user 정보를 authentication과 firestore에서 모두 지우고
이제 Gmail sign-in이 되는지 확인해보자.
둘 다 로그인이 잘 되는 것을 볼 수 있다.
sign up은 displayName을 받아야 해서 listener 안으로 넣지 않는다.
'React > E-commers App' 카테고리의 다른 글
의류 쇼핑몰 31 | products.context.jsx 만들기 (0) | 2022.07.01 |
---|---|
의류 쇼핑몰 30 | shop-data.json (0) | 2022.06.30 |
의류 쇼핑몰 25 | Context 2 | context에 데이터 입력과 출력 (0) | 2022.06.18 |
의류 쇼핑몰 24 | Context 1 | 쓰는 이유 (0) | 2022.06.18 |
의류 쇼핑몰 23 | Authentication 끝 | 로그인시 에러처리 | Authentication Styles (0) | 2022.06.17 |
댓글