-
+
{props.title}
{props.done &&
✓
}
+
+
);
};
-export default Todo;
+export default Todo;
\ No newline at end of file
diff --git a/src/components/TodoDetail/TodoDetail.tsx b/src/components/TodoDetail/TodoDetail.tsx
index dd6fc30..483b7ae 100644
--- a/src/components/TodoDetail/TodoDetail.tsx
+++ b/src/components/TodoDetail/TodoDetail.tsx
@@ -1,22 +1,31 @@
+import { useEffect } from "react";
+import { useDispatch, useSelector } from "react-redux";
+import { useParams } from "react-router";
+import { AppDispatch } from "../../store";
+import { selectTodo, fetchTodo } from "../../store/slices/todo";
import "./TodoDetail.css";
-type Props = {
- title: string;
- content: string;
-};
+const TodoDetail = () => {
+ const { id } = useParams();
+ const dispatch = useDispatch
();
+ const todoState = useSelector(selectTodo);
+
+ useEffect(() => {
+ dispatch(fetchTodo(Number(id)));
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [id]);
-const TodoDetail = (props: Props) => {
return (
Name:
-
{props.title}
+
{todoState.selectedTodo?.title}
Content:
-
{props.content}
+
{todoState.selectedTodo?.content}
);
};
-export default TodoDetail;
+export default TodoDetail;
\ No newline at end of file
diff --git a/src/containers/TodoList/NewTodo/NewTodo.tsx b/src/containers/TodoList/NewTodo/NewTodo.tsx
index c23a5fb..b26873d 100644
--- a/src/containers/TodoList/NewTodo/NewTodo.tsx
+++ b/src/containers/TodoList/NewTodo/NewTodo.tsx
@@ -1,12 +1,16 @@
import { useState } from "react";
+import { useDispatch } from "react-redux";
import { Navigate } from "react-router-dom";
// import { useNavigate } from "react-router-dom";
+import { AppDispatch } from "../../../store";
+import { postTodo } from "../../../store/slices/todo";
import "./NewTodo.css";
export default function NewTodo() {
const [title, setTitle] = useState("");
const [content, setContent] = useState("");
const [submitted, setSubmitted] = useState(false);
+ const dispatch = useDispatch();
// const navigate = useNavigate()
// const postTodoHandler = () => {
@@ -16,10 +20,14 @@ export default function NewTodo() {
// navigate('/todos')
// };
- const postTodoHandler = () => {
+ const postTodoHandler = async () => {
const data = { title: title, content: content };
- alert("Submitted\n" + data.title + "\n" + data.content);
- setSubmitted(true);
+ const result = await dispatch(postTodo(data));
+ if (result.type === `${postTodo.typePrefix}/fulfilled`) {
+ setSubmitted(true);
+ } else {
+ alert("Error on post Todo");
+ }
};
if (submitted) {
@@ -44,4 +52,4 @@ export default function NewTodo() {
);
}
-}
+}
\ No newline at end of file
diff --git a/src/containers/TodoList/TodoList.tsx b/src/containers/TodoList/TodoList.tsx
index fa0fe61..bd5f084 100644
--- a/src/containers/TodoList/TodoList.tsx
+++ b/src/containers/TodoList/TodoList.tsx
@@ -1,8 +1,15 @@
-import { useMemo, useState } from "react";
-import { NavLink } from "react-router-dom";
+import { useEffect } from "react";
+import { useDispatch, useSelector } from "react-redux";
+import { NavLink, useNavigate } from "react-router-dom";
import Todo from "../../components/Todo/Todo";
-import TodoDetail from "../../components/TodoDetail/TodoDetail";
+import {
+ fetchTodos,
+ selectTodo,
+ toggleDone,
+ deleteTodo,
+} from "../../store/slices/todo";
import "./TodoList.css";
+import { AppDispatch } from "../../store";
interface IProps {
title: string;
@@ -11,46 +18,39 @@ interface IProps {
type TodoType = { id: number; title: string; content: string; done: boolean };
export default function TodoList(props: IProps) {
+ const navigate = useNavigate();
const { title } = props;
- const [selectedTodo, setSelectedTodo] = useState