/** * アプリケーションの共通レイアウトを提供するコンポーネント * ヘッダー(AppBar)とメインコンテンツ領域を含む基本的なページ構造を定義 */ import React, { useState } from 'react'; import { AppBar, Toolbar, Typography, Container, Box, Button, Drawer, List, ListItemText, ListItemIcon, ListItemButton, Divider, IconButton } from '@mui/material'; import { Menu as MenuIcon, ListAlt as ListAltIcon, } from '@mui/icons-material'; import { useNavigate, Outlet, useLocation } from 'react-router-dom'; const Layout: React.FC = () => { const navigate = useNavigate(); const location = useLocation(); const [drawerOpen, setDrawerOpen] = useState(false); /** * ログアウト処理を行うハンドラー関数 * ローカルストレージからトークンを削除し、ログインページにリダイレクト */ const handleLogout = () => { localStorage.removeItem('token'); navigate('/login'); }; /** * 画面遷移処理を行うハンドラー関数 * 指定されたパスに遷移し、サイドメニューを閉じる */ const handleNavigate = (path: string) => { navigate(path); setDrawerOpen(false); }; // 現在のパスに基づいてメニュー項目が選択状態かどうかを判定 const isSelected = (path: string): boolean => { return location.pathname === path; }; // メニューを開閉するハンドラー const toggleDrawer = () => { setDrawerOpen(!drawerOpen); }; return ( {/* ヘッダー部分 - アプリ名とログアウトボタンを表示 */} ToDoアプリ {/* サイドメニュー */} setDrawerOpen(false)} > handleNavigate('/tasks')} selected={isSelected('/tasks')} > {/* メインコンテンツ領域 - 子ルートのコンポーネントがここに表示される */} {/* React Router の Outlet - 子ルートのコンポーネントがここにレンダリングされる */} ); }; export default Layout;