ํด๋ฆฐ ์ฝ๋๋ฅผ ์ค์ฒํด ๋ณด์!
์... ํ๊ธฐ๋ ์ ์ โ ๏ธ ๋ฌธ์ ๋ฐ์! ๋ฌธ์ ๋ฐ์!
์๋ ์ด๊ฒ ๋ญ์ผ.. ๋ถ๋ช
ํ prop์ผ๋ก isOwner๋ฅผ Tweet ์ปดํฌ๋ํธ์ ๋ณด๋ผ ๋ tweet.creatorId === userObj.uid๊ฐ ์ฐธ์ธ ๊ฒฝ์ฐ์๋ง ์์ /์ญ์ ํ ์ ์๋ ๋ฒํผ์ด ๋จ๋๋ก ์ค์ ํด ๋์๋๋ฐ ๋ค๋ฅธ ์ ์ ๋ก ๋ก๊ทธ์ธํด์ ๋ค์ด๊ฐ๋๋ฐ๋ ์์ /์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค.
์ด๋ ๊ฒ ๋ ๋์ ์ฝ์ง์ ์์๋์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๊ฐ๋จํ ์ค์์๋ค. ์๊ณ ๋๋ ๋๋ฌด๋ ๋จธ์ฑํ๋..
// โ
const Tweet = ({ tweetObj }, isOwner ) => { };
// โ
const Tweet = ({ tweetObj, isOwner } ) => { };
prop์ ์ด์ํ๊ฒ ๋ณด๋ด๊ณ ์์๋ค๋ ์ฌ์ค...ใ
ใ
์ด๋ฐ๊ฑฐ ์ค์ํ ์ค์ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ 2์๊ฐ์ ์ฝ์งํ ๊ฒ ๊ฐ๋ค..ใ
...ใ
ใ
ใ
..
์๊ธด๋ฐ ์ ์๊ฒจ...๐ฅฒ
Home.js ์ Auth.js์ ์๋ ์ปดํฌ๋ํธ๋ก ๋บ ์ ์๋ ์น๊ตฌ๋ค์ ๋ฐ๋ก ๋นผ์ฃผ์.
TweetFactory.js ์ปดํฌ๋ํธ๋ก ๋บ๋ค.AuthForm.js ์ปดํฌ๋ํธ๋ก ๋บ๋ค.ํ๋กญ ์ ๋น ์ง๊ฒ ์ ๋ณด๋ด์ฃผ์! ๋คํํ๋ ๋ฆฌ์กํธ๊ฐ ์น์ ํ๊ฒ ์ฝ๋์ ๋ญ ๋น ์ก๋์ง ์๋ ค์ค๋ค.
์ ์ ๋ฒ์ ํ๋กํ์์ ์ฌ์ฉ์ ๋ณธ์ธ์ด ์ ์ ํธ์๋ง ๊ฐ์ ธ์ค๋ ํจ์๋ฅผ ๋ง๋ค์๋๋ฐ ๊ฐ์ ธ์จ doc์ ๊ทธ๋ฅ ์ฝ์๋ก๊ทธ์๋ง ์ฐ์ด ๋๊ณ ์๋ ์ค์ ์ด์๋ค. ์ ๋ง๋ฌด๋ฆฌ๋ ๋ค ๋์ด๊ฐ๋ ๋ง๋น์ ์ผ๋จ ํ๋ฉด์ ์ถ๋ ฅ์ด๋ ์์ผ๋ณด์ ํ๊ณ home์์ ํ๋ ๊ฒ ์ฒ๋ผ ํธ์์ ๊ฐ์ ธ์์ map๋ฉ์๋๋ก ํธ์์ ํ๋ ์ฉ ๋์ดํ๊ฒ ๋ง๋ค์๋ค.
import Tweet from "components/Tweet";
import { authService, dbService } from "fbase";
import { updateProfile } from "firebase/auth";
import {
collection,
getDocs,
onSnapshot,
orderBy,
query,
where,
} from "firebase/firestore";
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
//์๋ต
const [tweets, setTweets] = useState([]);
//๋ด ํธ์ ๊ฐ์ ธ์ค๊ธฐ: map์ผ๋ก
useEffect(() => {
//snapshot์ ์ฟผ๋ฆฌ ๊ฐ์ ๊ฑด๋ฐ docs๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
//tweets์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ snapshot์์ ๋์ค๋ ๊ฑฐ๋ค.
//๋ฐ๋ผ์ setTweets()์
const q = query(
collection(dbService, "tweets"),
where("creatorId", "==", userObj.uid),
orderBy("createdAt", "desc")
);
const unsubscribe = onSnapshot(q, (snapshot) => {
//๋ชจ๋ docs๋ {} ์ค๋ธ์ ํธ ๋ฐํํ๋๋ก
//์์ด๋ ๊ฐ์ ธ์ค๊ณ , ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ๋ฐ์ดํฐ ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ
const tweetArr = snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
}));
//ํธ์์ด๋ ์ด ํ์ธํด๋ณด์. ์ค์ผ์ด ์ํ๋๋๋ก ํฌ๋งท๋๊ฒ์ ํ์ธํ ์ ์๋ค!
//console.log(tweetArr);
setTweets(tweetArr);
});
return () => {
unsubscribe();
};
}, [userObj.uid]);
//์๋ต
return(
<>
<div>
{tweets.map((tweet) => (
//Tweet์ ์ปดํฌ๋ํธ๋ก ๋ง๊ณ props์ผ๋ก ๊ฐ์ ธ์จ๋ค.
//tweetObj ๋ง๋ค ๋ ๊ฐ๊ฐ์ tweet์ ํ ๋นํ id ๊ฐ์ div์ key์ ๋ฃ์ด์ฃผ์
<Tweet
key={tweet.id}
tweetObj={tweet}
isOwner={tweet.creatorId === userObj.uid}
/>
))}
</div>
</>)
๊ธฐ์กด์ ์์ฑํ๋ ํ์ ์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ getDocs()๋ฉ์๋๋ก ๊ฐ์ ธ์ค๊ณ ์๊ณ , ๊ทธ๊ฑธ forEach()๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฟ๋ฆฌ๊ณ ์์๋ค.
//๋ด Tweets ์ป๋ function ์์ฑ
const getMyTweets = async () => {
//ํธ์ ๋ถ๋ฌ์ค๊ธฐ
//dbService์ ์ปฌ๋ ์
์ค "tweets" Docs ์ค์์, userObj์ uid์ ๋์ผํ creatorID๋ฅผ ๊ฐ์ง ๋ชจ๋ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ(์์ฒญ) ์์ฑ
//ํธ์ํ ์์๋๋ก ์ ๋ ฌํ๊ธฐ
const q = query(
collection(dbService, "tweets"),
where("creatorId", "==", userObj.uid),
orderBy("createdAt", "desc")
);
//getDocs()๋ฉ์๋๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
//โ
์ฝ์์ ์ฐ๊ธฐ
console.log(doc.id, "=>", doc.data());
});
};
//๋ด Tweets ์ป๋ function ํธ์ถ
useEffect(() => {
getMyTweets();
}, []);
๋๋ค ๋ฐฐ์ด(array)์ ์ฌ์ฉํ๋ค๋ ๊ณตํต์ ์ด ์๋๋ฐ,
- forEach(): ๋ฐฐ์ด ์์๋ง๋ค ํ ๋ฒ์ฉ ์ฃผ์ด์ง ํจ์(์ฝ๋ฐฑ)์ ์คํํจ, ์ฆ ๊ธฐ์กด ๋ฐฐ์ด์ ๋ณ๊ฒฝ
๊ทธ๋ฆฌ๊ณ- map(): ๋ฐฐ์ด ๋ด์ ๋ชจ๋ ์์ ๊ฐ๊ฐ์ ๋ํด ์ฃผ์ด์ง ํจ์(์ฝ๋ฐฑ)์ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํจ