add dashboard layout and routing

This commit is contained in:
2025-04-14 20:16:52 +00:00
parent a6ced69393
commit f8e498557e
4 changed files with 115 additions and 0 deletions

33
dashboard/src/App.tsx Normal file
View File

@@ -0,0 +1,33 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { Layout } from './components/layout/Layout';
import { ReviewsPage } from './pages/ReviewsPage';
import { ReviewDetailPage } from './pages/ReviewDetailPage';
import { MetricsPage } from './pages/MetricsPage';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 30 * 1000,
retry: 1,
},
},
});
function App() {
return (
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<ReviewsPage />} />
<Route path="reviews/:id" element={<ReviewDetailPage />} />
<Route path="metrics" element={<MetricsPage />} />
</Route>
</Routes>
</BrowserRouter>
</QueryClientProvider>
);
}
export default App;

View File

@@ -0,0 +1,30 @@
import { Link } from 'react-router-dom';
export function Header() {
return (
<header className="bg-white border-b border-gray-200 px-6 py-4">
<div className="flex items-center justify-between">
<Link to="/" className="flex items-center gap-2">
<div className="w-8 h-8 bg-indigo-600 rounded-lg flex items-center justify-center">
<span className="text-white font-bold text-sm">A</span>
</div>
<span className="text-xl font-semibold text-gray-900">Arbiter</span>
</Link>
<nav className="flex items-center gap-6">
<Link
to="/"
className="text-sm font-medium text-gray-600 hover:text-gray-900"
>
Reviews
</Link>
<Link
to="/metrics"
className="text-sm font-medium text-gray-600 hover:text-gray-900"
>
Metrics
</Link>
</nav>
</div>
</header>
);
}

View File

@@ -0,0 +1,17 @@
import { Outlet } from 'react-router-dom';
import { Header } from './Header';
import { Sidebar } from './Sidebar';
export function Layout() {
return (
<div className="min-h-screen bg-gray-50">
<Header />
<div className="flex">
<Sidebar />
<main className="flex-1 p-6">
<Outlet />
</main>
</div>
</div>
);
}

View File

@@ -0,0 +1,35 @@
import { NavLink } from 'react-router-dom';
const navItems = [
{ to: '/', label: 'Reviews', icon: '📋' },
{ to: '/metrics', label: 'Metrics', icon: '📊' },
];
export function Sidebar() {
return (
<aside className="w-64 bg-white border-r border-gray-200 min-h-screen">
<nav className="p-4">
<ul className="space-y-1">
{navItems.map((item) => (
<li key={item.to}>
<NavLink
to={item.to}
end={item.to === '/'}
className={({ isActive }) =>
`flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
isActive
? 'bg-indigo-50 text-indigo-700'
: 'text-gray-700 hover:bg-gray-100'
}`
}
>
<span>{item.icon}</span>
<span>{item.label}</span>
</NavLink>
</li>
))}
</ul>
</nav>
</aside>
);
}