이제 드디어 끝이 보입니다. task 입력까지 했으니 이번 시간에는 firestore에서 데이터를 가져오도록 하겠습니다. 그냥 가져오면 심심하니 onSnapshot
을 사용하여 실시간으로 데이터를 가져오도록 하겠습니다. 또한, 완료 버튼을 클릭하면 해당 task는 화면에서 지우는 작업까지 해보도록 하겠습니다.
- task를 입력하면 실시간으로 데이터를 화면에 출력한다.
- 완료 버튼을 클릭하면 실시간으로 화면에서 지운다.
이번에도 코드 복잡성을 방지하기 위해 todo list는 따로 컴포넌트를 만들어 관리하도록 하겠습니다.
import React, { useEffect, useState } from "react";
// FIREBASE
import { fireStoreJob } from "../initFirebase";
import {
collection,
query,
where,
orderBy,
onSnapshot,
updateDoc,
doc,
} from "firebase/firestore";
// INTERFACE
import { UserInterface } from "../interfaces/user.interface";
import { TodoInterface } from "../interfaces/todo.interface";
// CSS
import { TodoListWrap,StyledTableCell } from "../styles/todoList.styled";
import Paper from "@mui/material/Paper";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Checkbox from "@mui/material/Checkbox";
type TodoListType = {
userInfo: UserInterface;
};
export const TodoList = ({ userInfo }: TodoListType) => {
const firestore_path = "tasks";
const [list, setList] = useState<TodoInterface[]>([]);
// NOTE - 1
useEffect(() => {
const q = query(
collection(fireStoreJob, firestore_path),
where("uid", "==", userInfo.uid),
where("status", "==", "READY"),
orderBy("date_created", "desc")
);
const unsubscribe = onSnapshot(q, (querySnapshot) => {
const arr = querySnapshot.docs.map((doc) => {
return {
id: doc.id,
...doc.data(),
};
});
// @ts-ignore
setList(arr);
});
return () => {
unsubscribe();
};
}, []);
// NOTE - 2
const onClick = async (e: any) => {
const doc_id = e.target.id;
const ref = doc(fireStoreJob, firestore_path, doc_id);
await updateDoc(ref, {
status: "DONE",
});
};
return (
<TodoListWrap>
<Paper sx={{ width: "100%", overflow: "hidden" }}>
<TableContainer>
<Table stickyHeader={true}>
<TableHead>
<TableRow>
<StyledTableCell>Task</StyledTableCell>
<StyledTableCell>Dead Line</StyledTableCell>
<StyledTableCell>Done</StyledTableCell>
</TableRow>
</TableHead>
<TableBody>
{list.map((data) => {
return (
<TableRow key={data.id} id={data.id}>
<TableCell>{data.task}</TableCell>
<TableCell>{data.date}</TableCell>
<TableCell>
<Checkbox onClick={onClick} id={data.id} />
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</TableContainer>
</Paper>
</TodoListWrap>
);
};
💡 NOTE -1
메인 화면에 접속하면 유저가 작성한 task를 가져옵니다.
이때 유저별로 status == 'READY' 인 데이터를 최신 순으로 가져 옵니다.
저번 포스팅에서 작성한 task가 출력된 것을 볼 수 있습니다.
📌 Firebase 공식문서 - Cloud Firestore로 실시간 업데이트 받기
onSnapshot
을 사용했기 때문에 변화가 감지될 때마다 새로운 데이터를 출력하고 있는 것을 볼 수 있습니다.
할 일을 입력했으니 완료 처리도 해보도록 하겠습니다.
💡 NOTE -2
체크 박스를 클릭하면 해당 데이터를 찾아status = 'DONE'
으로 업데이트하고 화면에는 출력하지 않도록 하겠습니다.
status 가 DONE
으로 바뀐 걸 확인할 수 있습니다.
React와 Firebase를 통해 간단한 Todo List 만들기 프로젝트가 끝났습니다. 다음에도 간단하게 만들 수 있는 프로그램으로 찾아오겠습니다.