/** * アプリケーションのルートコンポーネント * ルーティング設定、テーマ設定、認証保護などの基本構成を提供する */ import React from 'react'; import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; import { ThemeProvider, createTheme, CssBaseline, Box } from '@mui/material'; import Layout from './components/Layout'; import LoginPage from './pages/LoginPage'; import RegisterPage from './pages/RegisterPage'; import TaskListPage from './pages/TaskListPage'; import StockPage from './pages/StockPage'; import './App.css'; /** * アプリケーション全体のMaterial UIテーマを定義 * カラーパレット、タイポグラフィ、コンポーネントのスタイルオーバーライドを設定 */ const theme = createTheme({ palette: { mode: 'light', primary: { main: '#1976d2', }, secondary: { main: '#dc004e', }, background: { default: '#f5f5f5', paper: '#ffffff', }, }, typography: { fontFamily: [ '-apple-system', 'BlinkMacSystemFont', '"Segoe UI"', 'Roboto', '"Helvetica Neue"', 'Arial', 'sans-serif', ].join(','), }, components: { MuiPaper: { styleOverrides: { root: { boxShadow: '0px 2px 4px rgba(0, 0, 0, 0.1)', }, }, }, }, }); /** * 認証が必要なルートを保護するためのコンポーネント * ローカルストレージにトークンがない場合はログインページにリダイレクト * トークンがある場合は子コンポーネントをレンダリング */ const PrivateRoute: React.FC<{ children: React.ReactNode }> = ({ children }) => { const token = localStorage.getItem('token'); if (!token) { return ; } return <>{children}; }; /** * アプリケーションのメインコンポーネント * ルーティング構造を定義し、適切なページコンポーネントを表示 * - 未認証ユーザー: ログイン/登録ページにアクセス可能 * - 認証済みユーザー: タスク一覧ページにアクセス可能 * - ルートパスへのアクセスは自動的にタスク一覧にリダイレクト */ const App: React.FC = () => { return ( {/* MUIのリセットCSSを適用 */} } /> } /> }> {/* ルートパスへのアクセスはタスク一覧にリダイレクト */} } /> {/* タスク一覧は認証が必要なため、PrivateRouteでラップ */} } /> }> {/* ルートパスへのアクセスはタスク一覧にリダイレクト */} } /> {/* タスク一覧は認証が必要なため、PrivateRouteでラップ */} } /> {/* テストページへのルートを追加 */} } /> ); }; export default App;