Home.js
import {
addDoc,
collection,
onSnapshot,
orderBy,
query,
} from "firebase/firestore";
import React, { useEffect, useState } from "react";
import { dbService } from "./firebase";
import Nweett from "./Nweett";
const Home = ({ userObj }) => {
const [nweet, setNweet] = useState("");
const [nweets, setNweets] = useState([]);
useEffect(() => {
const q = query(
collection(dbService, "nweets"),
orderBy("createdAt", "desc")
);
onSnapshot(q, (snapshot) => {
const nweetArray = snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
}));
setNweets(nweetArray);
});
}, []);
const onSubmit = async (event) => {
event.preventDefault();
await addDoc(collection(dbService, "nweets"), {
text: nweet,
createdAt: Date.now(),
createdId: userObj.uid,
});
setNweet("");
};
const onChange = (e) => {
const {
target: { value },
} = e;
setNweet(value);
};
return (
<div>
<form onSubmit={onSubmit}>
<input
type="text"
placeholder="What's on your mind?"
maxLength={120}
value={nweet}
onChange={onChange}
/>
<input type="submit" value="트윗" />
</form>
<div>
{nweets.map((nweet) => (
<Nweett
nweetObj={nweet}
key={nweet.id}
isOwner={(nweet.createdId = userObj.uid)}
/>
))}
</div>
</div>
);
};
export default Home;
Nweett.js
import { deleteDoc, doc, updateDoc } from "firebase/firestore";
import React, { useState } from "react";
import { dbService } from "./firebase";
const Nweett = ({ nweetObj, isOwner }) => {
const [editing, setEditing] = useState(false);
const [newNweet, setNewNweet] = useState(nweetObj.text);
console.log("newNweet", newNweet);
const nweetTextRef = doc(dbService, "nweets", `${nweetObj.id}`);
const onDeleteClick = async () => {
const ok = window.confirm("are you sure 삭제?");
console.log("newNweet", newNweet);
if (ok) {
await deleteDoc(nweetTextRef);
}
};
const toggleEditting = () => {
setEditing((prev) => !prev);
};
const onSubmit = async (e) => {
e.preventDefault();
console.log(nweetObj, newNweet);
await updateDoc(nweetTextRef, {
text: newNweet,
});
setEditing(false);
};
const onChange = (e) => {
setNewNweet(e.target.value);
};
return (
<div>
{editing ? (
<>
{isOwner && (
<>
<form onSubmit={onSubmit}>
<input
type="text"
placeholder="Edit Your tweet "
value={newNweet}
required
onChange={onChange}
/>
<input type="submit" value="Update tweet" />
</form>
<button onClick={toggleEditting}>Cancel</button>
</>
)}
</>
) : (
<>
<h4>{nweetObj.text}</h4>
{isOwner && (
<>
<button onClick={onDeleteClick}>Delete</button>
<button onClick={toggleEditting}>Edit</button>
</>
)}
</>
)}
</div>
);
};
export default Nweett;