/** * タスク一覧を表示・管理するページコンポーネント * タスクの表示、作成、完了状態の切り替え、削除などの機能を提供 */ import React, { useState, useEffect } from 'react'; import { taskApi } from '../services/api'; import { Container, Typography, List, ListItem, ListItemText, ListItemSecondaryAction, IconButton, Checkbox, Fab, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Button, Box, } from '@mui/material'; import { Add as AddIcon, Delete as DeleteIcon } from '@mui/icons-material'; import { Task } from '../types/types'; import { TASK_ERRORS } from '../constants/errorMessages'; // 新規タスクの初期状態 const EMPTY_TASK = { title: '', description: '', completed: false }; const TaskListPage: React.FC = () => { // タスク一覧の状態管理 const [tasks, setTasks] = useState([]); // 新規タスク作成ダイアログの表示状態 const [openDialog, setOpenDialog] = useState(false); // 新規タスクの入力内容 const [newTask, setNewTask] = useState(EMPTY_TASK); // コンポーネントマウント時にタスク一覧を取得 useEffect(() => { fetchTasks(); }, []); /** * APIからタスク一覧を取得する関数 * 取得したタスクをstate(tasks)に設定 */ const fetchTasks = async () => { try { const tasks = await taskApi.getTasks(); setTasks(tasks); } catch (error) { console.error(`${TASK_ERRORS.FETCH_FAILED}:`, error); } }; /** * タスクの完了状態を切り替えるハンドラー * 対象タスクの完了状態を反転させてAPIに更新を要求 */ const handleToggleComplete = async (taskId: number) => { try { const task = tasks.find(t => t.id === taskId); if (!task) return; await taskApi.updateTask(taskId, { ...task, completed: !task.completed }); fetchTasks(); // 更新後のタスク一覧を再取得 } catch (error) { console.error(`${TASK_ERRORS.UPDATE_FAILED}:`, error); } }; /** * タスクを削除するハンドラー * 指定されたIDのタスクをAPIを通じて削除 */ const handleDeleteTask = async (taskId: number) => { try { await taskApi.deleteTask(taskId); fetchTasks(); // 削除後のタスク一覧を再取得 } catch (error) { console.error(`${TASK_ERRORS.DELETE_FAILED}:`, error); } }; /** * 新規タスクを作成するハンドラー * 入力されたタスク情報をAPIに送信して新規作成 * 作成後はダイアログを閉じ、入力内容をリセット */ const handleCreateTask = async () => { try { await taskApi.createTask(newTask); setOpenDialog(false); // ダイアログを閉じる setNewTask(EMPTY_TASK); // 入力内容をリセット fetchTasks(); // 作成後のタスク一覧を再取得 } catch (error) { console.error(`${TASK_ERRORS.CREATE_FAILED}:`, error); } }; return ( タスク一覧 {/* タスク一覧表示エリア - 青い背景のコンテナ */}
{/* タスク一覧をマップして各タスクをリストアイテムとして表示 */} {tasks.map((task) => ( {/* タスク完了状態を切り替えるチェックボックス */} handleToggleComplete(task.id)} /> {/* タスクのタイトルと説明 - 完了状態に応じて取り消し線を表示 */} {/* タスク削除ボタン */} handleDeleteTask(task.id)} > ))}
{/* 新規タスク作成ボタン - 画面下部に固定表示 */} setOpenDialog(true)} > {/* 新規タスク作成ダイアログ */} setOpenDialog(false)} disableScrollLock={true}> 新規タスク {/* タスクタイトル入力フィールド */} setNewTask({ ...newTask, title: e.target.value })} /> {/* タスク説明入力フィールド - 複数行入力可能 */} setNewTask({ ...newTask, description: e.target.value })} />
); }; export default TaskListPage;