diff --git a/package.json b/package.json index 0f38547..abd3a98 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "@types/react-dom": "18.0.6", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router": "^6.4.1", + "react-router-dom": "^6.4.1", "react-scripts": "5.0.1", "typescript": "4.7.4", "web-vitals": "2.1.4" diff --git a/src/App.tsx b/src/App.tsx index 9d18e93..d69c007 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,21 @@ import "./App.css"; +import TodoList from "./containers/TodoList/TodoList"; +import {BrowserRouter, Routes, Route} from "react-router-dom" +import Todo from "./components/Todo/Todo"; +import NewTodo from "./containers/TodoList/NewTodo/NewTodo"; function App() { - return
; + return
+ + + } /> + } /> + + + + + +
; } export default App; diff --git a/src/components/Todo/Todo.tsx b/src/components/Todo/Todo.tsx index cb0ff5c..3c8e680 100644 --- a/src/components/Todo/Todo.tsx +++ b/src/components/Todo/Todo.tsx @@ -1 +1,21 @@ -export {}; +import React from "react"; +import "./Todo.css" + +interface IProps { + title: string; + clicked?: React.MouseEventHandler; + done: boolean; +} + +const Todo = (props: IProps) => { + return ( +
+
+ {props.title} +
+ {props.done &&
} +
+ ); +}; + +export default Todo; diff --git a/src/components/TodoDetail/TodoDetail.tsx b/src/components/TodoDetail/TodoDetail.tsx index cb0ff5c..2074678 100644 --- a/src/components/TodoDetail/TodoDetail.tsx +++ b/src/components/TodoDetail/TodoDetail.tsx @@ -1 +1,25 @@ -export {}; +import "./TodoDetail.css"; + +type Props = { + title: string; + content: string; +} + +const TodoDetail = (props: Props) => { + return ( +
+
+
Name:
+
{props.title}
+
+
+
Content:
+
+ {props.content} +
+
+
+ ); +}; + +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 cb0ff5c..05ec736 100644 --- a/src/containers/TodoList/NewTodo/NewTodo.tsx +++ b/src/containers/TodoList/NewTodo/NewTodo.tsx @@ -1 +1,33 @@ -export {}; +import { useState} from "react"; +import { Navigate} from "react-router"; +import "./NewTodo.css" + +const postTodoHandler = () => { + const data = {title: title, content: content}; + alert("Submitted\n" + data.title + "\n" + data.content); + setSubmitted(true); +} + +export default function NewTodo() { + const [title, setTitle] = useState(""); + const [content, setContent] = useState(""); + const [submitted, setSubmitted] = useState(false); + + if (submitted) { + return ; + } + + return ( +
+

Add a Todo

+ + setTitle(event.target.value) + } + /> +
+ ); +} diff --git a/src/containers/TodoList/TodoList.tsx b/src/containers/TodoList/TodoList.tsx index cb0ff5c..7ec4250 100644 --- a/src/containers/TodoList/TodoList.tsx +++ b/src/containers/TodoList/TodoList.tsx @@ -1 +1,61 @@ -export {}; +import { useState } from "react" +import { useMemo } from "react"; +import { Link } from "react-router-dom"; + +import Todo from '../../components/Todo/Todo' +import TodoDetail from "../../components/TodoDetail/TodoDetail"; +import NewTodo from "./NewTodo/NewTodo"; + +import "./TodoList.css" + + +interface IProps { + title: string; +} + +type TodoType = { + id: number + title: string + content: string + done: boolean +} + + +export default function TodoList(props: IProps) { + const { title } = props + const [todos, setTodos] = useState([ + {id: 1, title: "SWPP", content: "take swpp class", done: true}, + {id: 2, title: "Movie", content: "watch movie", done: false}, + {id: 3, title: "Dinner", content: "eat dinner", done: false}, + ]) + const [selectedTodo, setSelectedTodo] = useState (null) + const clickTodoHandler = (td: TodoType) => { + if (selectedTodo === td) { + setSelectedTodo(null); + } else { + setSelectedTodo(td) + } + } + + const todoDetail = useMemo(() => { + return selectedTodo ? ( + + ) : null; + }, [selectedTodo]); + + return ( +
+
{title}
+
+ {todos.map( + (td) => { + return clickTodoHandler(td)}/> + } + )} + {todoDetail} + New Todo + +
+
+ ) +}; \ No newline at end of file