-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTaskManager.tsx
More file actions
70 lines (59 loc) · 2.21 KB
/
TaskManager.tsx
File metadata and controls
70 lines (59 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
* ===================================================
* Q4: コンポーネント設計・リファクタリング
* (制限時間 30分 / 配点 25点)
* ===================================================
*
* TODO: TaskManager.original.tsx を参考に、
* 分割したコンポーネントを組み合わせてこのファイルを実装してください
*
* 要件:
* - 状態管理(tasks, filter, nextId)はここに集約
* - stats の計算と表示もここで行う
* - data-testid="stats" の表示:
* 全体: {total} / 未完了: {active} / 完了: {completed}
* - TaskForm, TaskFilter, TaskList を使って構成
* - default export すること
*/
import React, { useState } from "react";
import { Task, Priority, Filter } from "./types";
import TaskForm from "./components/TaskForm";
import TaskFilter from "./components/TaskFilter";
import TaskList from "./components/TaskList";
const TaskManager: React.FC = () => {
const [tasks, setTasks] = useState<Task[]>([]);
const [filter, setFilter] = useState<Filter>("all");
const [nextId, setNextId] = useState(1);
const addTask = (title: string, priority: Priority) => {
setTasks([...tasks, { id: nextId, title, completed: false, priority }]);
setNextId(nextId + 1);
};
const toggleTask = (id: number) => {
setTasks(tasks.map((t) => (t.id === id ? { ...t, completed: !t.completed } : t)));
};
const deleteTask = (id: number) => {
setTasks(tasks.filter((t) => t.id !== id));
};
const filteredTasks = tasks.filter((t) => {
if (filter === "active") return !t.completed;
if (filter === "completed") return t.completed;
return true;
});
const stats = {
total: tasks.length,
active: tasks.filter((t) => !t.completed).length,
completed: tasks.filter((t) => t.completed).length,
};
return (
<div>
<h1>タスク管理</h1>
<div data-testid="stats">
全体: {stats.total} / 未完了: {stats.active} / 完了: {stats.completed}
</div>
<TaskForm onAdd={addTask} />
<TaskFilter current={filter} onChange={setFilter} />
<TaskList tasks={filteredTasks} onToggle={toggleTask} onDelete={deleteTask} />
</div>
);
};
export default TaskManager;