// components/Navbar.js
import { Link } from "react-router-dom";
import { FiShoppingBag, FiMenu } from "react-icons/fi";
import Button from "./ui/Button";
import { login, logout } from "../api/firebase;
import { useState } from "react";
function Navbar() {
const [user, setUser]=useState();
const handleLogin=()=>{
login().then(setUser); //then( user => setUser(user))
};
const handleLogout=()=>{
logout().then(setUser);
};
useEffect(()=>{
onUserStateChange((user)=>{
setUser(user); // user가 변경될때마다 컴포넌트에 state를 변경
})
}, [])
return (
<header>
<Link to="/">
<h1>MIOGY STUDIO</h1>
</Link>
<nav>
<Link to="/products">Products</Link>
{!user && <Button text="Login" onClick={login}></Button>}
{user && <Button text="Logout" onClick={logout}></Button>}
</nav>
</header>
);
}
export default Navbar;
// components/Navbar.js
useEffect(()=>{
onUserStateChange((user)=>{
setUser(user); // user가 변경될때마다 컴포넌트에 state를 변경
})
}, [])
//코드수정
useEffect(()=>{
onUserStateChange(setUser) // 인자와 동일하므로 참조값만 전달
}, [])
// components/Navbar.js
const handleLogin=()=>{
login().then(setUser); //then( user => setUser(user))
};
const handleLogout=()=>{
logout().then(setUser);
};
//코드수정
const handleLogin=()=>{
login();
};
const handleLogout=()=>{
logout();
};
// components/Navbar.js
{!user && <Button text="Login" onClick={login}></Button>}
{user && <Button text="Logout" onClick={logout}></Button>}
// components/Navbar.js
//로그인
export async function login() {
return signInWithPopup(auth, provider)
.then((result) => {
const user = result.user;
console.log(user);
return user;
})
.catch(console.error);
}
//로그아웃
export async function logout() {
return signOut(auth);
}
//사용자의 상태를 확인
export function onUserStateChange(callback) {
onAuthStateChanged(auth, async (user) => {
callback(user);
});
}
//코드수정
//명령형 함수로 변경됨.
export function login() {
signInWithPopup(auth, provider).catch(console.error);
}
export function logout() {
signOut(auth);
}
//사용자의 상태를 확인해야하는 컴포넌트가 사용할 함수
export function onUserStateChange(callback) {
// onUserStateChange를 호출할때마다 콜백함수를 호출
onAuthStateChanged(auth, async (user) => {
callback(user);
});
}
기능하나하나 완료될때마다 코드정리하는 습관을 들여야겠다.
초보 개발자는 부지런하기라도 해야지!!
정리한 부분