https://nomadcoders.co/nwitter
트위터 클론코딩 – 노마드 코더 Nomad Coders
React Firebase for Beginners
nomadcoders.co
*노마드코더 트위터 클론코딩 강의내용을 정리한 글입니다.
**강의에서는 Firebase v8 를 사용했지만 여기서는 Firebase v9을 사용하여 구현했습니다.
https://firebase.google.com/docs/reference/js/v8/firebase.auth
// fb.js
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";
const firebaseConfig = {
apiKey: process.env.REACT_APP_API_KEY,
authDomain: process.env.REACT_APP_AUTH_DOMAIN,
projectId: process.env.REACT_APP_PROJECT_ID,
storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_APP_ID,
};
const fbApp = initializeApp(firebaseConfig);
export const fbAuth = getAuth(fbApp);
// getAuth를 통해서 auth에 접근
FIrebase 콘솔 ⇒ 프로젝트 ⇒ 빌드(develop) ⇒ Authentication 섹션
https://firebase.google.com/docs/reference/node/firebase.auth.EmailAuthProvider
// Auth.js
import { createUserWithEmailAndPassword, signInWithEmailAndPassword } from "firebase/auth";
import React, { useState } from "react";
import { fbAuth } from "../fb";
export default function Auth() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [newAccount, setNewAccount] = useState(false);
const onChangeHandler = (event) => {
const { name, value } = event.target;
if (name === "email") setEmail(value);
else if (name === "password") setPassword(value);
};
const onSumitHandler = (event) => {
event.preventDefault();
if (newAccount) createAccount();
else login();
};
const login = async () => {
console.log(`login`);
try {
const res = await signInWithEmailAndPassword(fbAuth, email, password);
console.log(res);
} catch (error) {
console.log(error);
}
};
const createAccount = async () => {
console.log(`create account`);
try {
const res = await createUserWithEmailAndPassword(fbAuth, email, password);
console.log(res);
} catch (error) {
console.log(error);
}
};
return (
<div>
<form onSubmit={onSumitHandler}>
<input name="email" type="email" placeholder="Email" value={email} required autoComplete="true" onChange={onChangeHandler} />
<input name="password" type="password" placeholder="Password" value={password} required autoComplete="true" onChange={onChangeHandler} />
<input type="submit" value={!newAccount ? `Login` : `Create New Account`} />
</form>
<div>
<button onClick={() => setNewAccount((prev) => !prev)}> {newAccount ? `Login` : `Create New Account`}</button>
<button>Continue with Google</button>
</div>
</div>
);
}
// App.js
import { onAuthStateChanged } from "firebase/auth";
import { useEffect, useState } from "react";
import { fbAuth } from "./fb";
import Router from "./Router";
function App() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [loading, setLoading] = useState(true);
useEffect(() => {
onAuthStateChanged(fbAuth, (user) => {
if (user) setIsLoggedIn(true);
else setIsLoggedIn(false);
setLoading(false);
});
}, []);
return (
<div>
{loading ? `loading...` : <Router isLoggedIn={isLoggedIn} />}
<footer>© {new Date().getFullYear()} Nwitter</footer>
</div>
);
}
export default App;
// App.js
import { createUserWithEmailAndPassword, GoogleAuthProvider, signInWithEmailAndPassword, signInWithPopup } from "firebase/auth";
import { fbAuth } from "../fb";
export default function Auth() {
// ...기존코드 생략
const onSocialLogin = async () => {
const provider = new GoogleAuthProvider();
try {
const res = await signInWithPopup(fbAuth, provider);
console.log(res);
} catch (error) {
console.log(error);
}
};
return (
<div>
<button name="google" onClick={onSocialLogin}>
Continue with Google
</button>
</div>
);
}
// Profile.js
import { signOut } from "firebase/auth";
import React from "react";
import { useNavigate } from "react-router-dom";
import { fbAuth } from "../fb";
export default function Profile() {
const navigate = useNavigate();
const onClickHandler = () => {
signOut(fbAuth);
navigate("/"); // 로그아웃 후 로그인 화면으로 이동
};
return (
<div>
<button onClick={onClickHandler}>Logout</button>
</div>
);
}
[Twitter Clone Coding] #5 EDIT PROFILE (0) | 2022.11.09 |
---|---|
[Twitter Clone Coding] #4 FILE UPLOAD (2) | 2022.11.07 |
[Twitter Clone Coding] #3 NWEETING (0) | 2022.11.05 |
[Twitter Clone Coding] #1 SETUP (0) | 2022.11.01 |