import { useState } from "react";
import { useAuthContext } from "./useAuthContext";
import { fireauth } from "../firebase/config";
export const useLogout = () => {
const [error, setError] = useState();
const [isPending, setIsPending] = useState(false);
const { dispatch } = useAuthContext();
const logout = async () => {
setError(null);
setIsPending(true);
try {
//ํ์ด์ด๋ฒ ์ด์ค ๋ก๊ทธ์์
await fireauth.signOut();
//๋ก๊ทธ์์ ์ก์
๋์คํจ์น
dispatch({ type: "LOGOUT" });
setIsPending(false);
setError(null);
} catch (err) {
console.log(err.message);
setError(err.message);
setIsPending(false);
}
};
return { logout, error, isPending };
};
https://firebase.google.com/?hl=ko
Firebase | Google’s Mobile and Web App Development Platform
๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์๊ฐ ์ข์ํ ๋งํ ์ฑ๊ณผ ๊ฒ์์ ๋น๋ํ๋๋ก ์ง์ํ๋ Google์ ๋ชจ๋ฐ์ผ ๋ฐ ์น ์ฑ ๊ฐ๋ฐ ํ๋ซํผ์ธ Firebase์ ๋ํด ์์๋ณด์ธ์.
firebase.google.com





์ฝ์๋ก ์ด๋

์ค๋ฅธ์ชฝ ์ค์ ์์ด์ฝ ํด๋ฆญ ํ


๊ตฌ์ฑ์ ์๋ ๋ด์ ๋ณต์ฌํ๊ธฐ

firebase8.5 ์ค์น(ํฐ๋ฏธ๋)

firebase ํด๋ ๋ด์ config.js ์์ฑ

import firebase from "firebase";
import "firebase/firestore";
const firebaseConfig = {
apiKey: import.meta.VITE_API_KEY,
authDomain: import.meta.VITE_AUTH_DOMAIN,
projectId: import.meta.VITE_PROJECTID,
storageBucket: import.meta.VITE_STORAGE_BUCKET,
messagingSenderId: import.meta.VITE_MESSAGEING_SENDERID,
appId: import.meta.VITE_APPID,
};
//๋ณธ์ธ ๊ณ์ ์ ํค ๋ฑ ์ค์ ๊ฐ์ ๊ฐ์ง๊ณ ์ด๊ธฐํ
//firebase init
firebase.initializeApp(firebaseConfig);
//ํ์ด์ด ์คํ ์ด DB์๋น์ค
//init service
const firedb = firebase.firestore();
export { firedb };
์ธ์ฆ ์๋น์ค๋ฅผ ์ถ๊ฐํ๋ค.



cors ํ์ฅ ํ๋ก๊ทธ๋จ ๊บผ์ผํจ

config.js ์์ ์ธ์ฆ์๋น์ค ์ถ๊ฐํ๋ค.
์ธ์ฆ์ ํ hooks๋ฅผ ๋ง๋ ๋ค. (์ฌ์ฌ์ฉ์ ์ํด์)

import { useState } from "react";
import { fireauth } from "../firebase/config";
export const useSignup = () => {
const [error, setError] = useState();
const [isPending, setIsPending] = useState(false);
const signup = async (email, password, displayName) => {
setError(null);
setIsPending(true);
try {
// ์ด๋ฉ์ผ,ํจ์ค์๋๋ก ๊ฐ์
const res = await fireauth.createUserWithEmailAndPassword(email, password);
console.log(res.user);
if (!res) {
throw new Error("๊ฐ์
์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
// ์ ์ ํ๋กํ์ผ์ ์ด๋ฆ์ ์
๋ฐ์ดํธ
await res.user.updateProfile({ displayName: displayName });
setError(null);
setIsPending(false);
}
catch (err) {
console.log(err.message);
setError(err.message);
setIsPending(false);
}
};
return { signup, error, isPending };
};
config.js์์ fireauth๊ฐ์ ธ์ด
signup ํจ์๋ฅผ ๋ง๋ฌ
email๊ณผ password๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์ ์ ์งํํจ.
๊ฐ์ ์ด ๋์ง ์์์ผ๋ฉด ์๋ฌ ์ถ๋ ฅ
Signup.jsx์์ ์ฌ์ฉํ๋ค.
๋ก๋ฉ์ค์๋ ๊ฐ์ ํ๊ธฐ ๋ฒํผ ํด๋ฆญํ ์ ์๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ก๋ฉ์ค์ผ๋๋ ๋ฒํผ์ disabled๋ก ํด๋ฆญํ์ง ๋ชปํ๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฌ๋ฅผ ์ถ๋ ฅํ๋ค.
1. ์๋ฌ ๋์๋ณด๊ธฐ

๋น๋ฐ๋ฒํธ 6์ ์ด์ ์ ๋ ฅํ๋ผ๊ณ ์๋ฌ ๋ธ ( ์ด๊ฑฐ๋ ๋ด๊ฐ ์ ํ๊ฒ ์๋๋ผ ํ์ด์ด๋ฒ ์ด์ค์์ ์ ๊ณตํ๋ ์ ํจ์ฑ๊ฒ์ฌ์)
์ ๋๋ก ์ ๋ ฅํ๋ฉด ์ฝ์์ ๋ฌ๋ค.
์ฝ์๋ก ํ์ธํ๊ธฐ


๊ฐ์ ๋ ์ ์ ๋ ํ์ด์ด ๋ฒ ์ด์ค์์ ํ์ธ ๊ฐ๋ฅํจ

๊ทธ๋ฆฌ๊ณ ์ปจํ ์คํธ๋ก ๋ง๋ค์ด์ ์ ์ญ์ผ๋ก ๊ณต์ ๋ฅผ ํ์

import { createContext, useReducer } from "react";
//์ธ์ฆ ์ปจํ
์คํธ ๋ง๋ค๊ธฐ
export const AuthContext = createContext();
//๋ฆฌ๋์ ๋ฉ์๋
export const authReducer = (state, action) => {
switch (action.type) {
case "":
default:
return state;
}
};
// ์ธ์ฆ ํ๋ก๋ฐ์ด๋์์ useReducer๋ฅผ ์ฌ์ฉํ๊ณ ์คํ
์ดํธ์ ๋์คํจ์น๋ฅผ ์ ๊ณต
export const AuthContextProvider = ({ children }) => {
const [state, dispatch] = useReducer(authReducer, {
user: null,
});
return (
<AuthContext.Provider value={{ ...state, dispatch }}>
{children}
</AuthContext.Provider>
);
};
๋ง๋ AuthContextProvider ์ ์ฉํ๊ธฐ


import { useContext } from "react";
import { AuthContext } from "../context/AuthContext";
export const useAuthContext = () => {
const context = useContext(AuthContext);
if (!context) {
throw Error(
"useAuthContext๋ AuthContextProvider ๋ด์์๋ง ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค."
);
}
return context;
};
AuthContext๋ฅผ ์ข๋ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ํ์ผ useAuthContext ์ hooks ํด๋์ ๋ง๋ฌ
โ
useAuthContext ๋ฅผ import ํ์ฌ AuthContext๋ฅผ ์ฌ์ฉ
โ
useSignup.js

์ปจํ ์คํธ์์ dispatch๊ฐ์ ธ์ด

์ ์ ์ ๋ณด๋ฅผ dispatch๋ก ์ ์ฅํ๋ค.
ํ์ ์ LOGIN . payload(๊ฐ) ์ user ์ ๋ณด
AuthContext.jsx ์์ LOGIN ํ์ ์ ์ถ๊ฐํ๋ค..

.

์ฝ์๋ก state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ถ๋ ฅํ๊ฒ ํ ์คํธํ๋ค.
๊ฐ์ ์ ํด๋ณธ๋ค.


ํ์ด์ด๋ฒ ์ด์ค ํํ์ด์ง์์ ๊ฐ์ ๋๋์ง ํ์ธํ์.

์ด์ hooks์์ logout ํ ์ ๋ง๋ค์ด๋ด

import { useState } from "react";
import { useAuthContext } from "./useAuthContext";
import { fireauth } from "../firebase/config";
export const useLogout = () => {
const [error, setError] = useState();
const [isPending, setIsPending] = useState(false);
const { dispatch } = useAuthContext();
const logout = async () => {
setError(null);
setIsPending(true);
try {
//ํ์ด์ด๋ฒ ์ด์ค ๋ก๊ทธ์์
await fireauth.signOut();
//๋ก๊ทธ์์ ์ก์
๋์คํจ์น
dispatch({ type: "LOGOUT" });
setIsPending(false);
setError(null);
} catch (err) {
console.log(err.message);
setError(err.message);
setIsPending(false);
}
};
return { logout, error, isPending };
};
AuthContext.jsx์์ logout case์ถ๊ฐ

Navbar.jsx์์ ์ฌ์ฉํ๋ค.
ํ ์คํธํ๊ธฐ
1. ์ฒ์ ์ํ๋ state ์ ์ -> null
2. ํ์๊ฐ์ ์ state ์ ์ -> ์ ์ ์ ๋ณด
3. ๋ก๊ทธ์์ ํด๋ฆญ์ state ์ ์ -> null
