Refactor: expand the menu sidebar and add the server and docker detail page

This commit is contained in:
Tola Leng
2025-06-30 23:06:38 +07:00
parent 0b029dc914
commit 460fcbc7dc
4 changed files with 82 additions and 108 deletions
+61 -105
View File
@@ -1,115 +1,71 @@
import React, { useState } from 'react';
import React from 'react'; import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ThemeProvider } from '@/contexts/ThemeContext'; import { Toaster } from '@/components/ui/sonner';
import { LanguageProvider } from '@/contexts/LanguageContext';
import { SidebarProvider } from '@/contexts/SidebarContext';
import { Toaster } from '@/components/ui/toaster';
import { ErrorBoundary } from '@/components/ErrorBoundary';
// Pages import { ThemeProvider } from './contexts/ThemeContext';
import Index from '@/pages/Index'; import { LanguageProvider } from './contexts/LanguageContext';
import Login from '@/pages/Login'; import { SidebarProvider } from './contexts/SidebarContext';
import Dashboard from '@/pages/Dashboard';
import ServiceDetail from '@/pages/ServiceDetail';
import Settings from '@/pages/Settings';
import Profile from '@/pages/Profile';
import SslDomain from '@/pages/SslDomain';
import ScheduleIncident from '@/pages/ScheduleIncident';
import OperationalPage from '@/pages/OperationalPage';
import PublicStatusPage from '@/pages/PublicStatusPage';
import RegionalMonitoring from '@/pages/RegionalMonitoring';
import NotFound from '@/pages/NotFound';
import { authService } from '@/services/authService'; import Index from './pages/Index';
import Login from './pages/Login';
const queryClient = new QueryClient({ import Dashboard from './pages/Dashboard';
defaultOptions: { import InstanceMonitoring from './pages/InstanceMonitoring';
queries: { import ContainerMonitoring from './pages/ContainerMonitoring';
retry: 2, import ServiceDetail from './pages/ServiceDetail';
staleTime: 5 * 60 * 1000, // 5 minutes import SslDomain from './pages/SslDomain';
}, import ScheduleIncident from './pages/ScheduleIncident';
}, import OperationalPage from './pages/OperationalPage';
}); import RegionalMonitoring from './pages/RegionalMonitoring';
import Settings from './pages/Settings';
// Protected Route wrapper import Profile from './pages/Profile';
const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { import NotFound from './pages/NotFound';
const isAuthenticated = authService.isAuthenticated(); import PublicStatusPage from './pages/PublicStatusPage';
return isAuthenticated ? <>{children}</> : <Navigate to="/login" replace />; import { ProtectedRoute } from './components/auth/ProtectedRoute';
}; import ServerDetail from './pages/ServerDetail';
function App() { function App() {
const [queryClient] = useState(() => new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000
}
}
}));
return ( return (
<ErrorBoundary> <BrowserRouter>
<QueryClientProvider client={queryClient}> <ThemeProvider>
<ThemeProvider> <LanguageProvider>
<LanguageProvider> <SidebarProvider>
<SidebarProvider> <QueryClientProvider client={queryClient}>
<Router>
<Routes>
<Route path="/" element={<Index />} />
<Route path="/login" element={<Login />} />
<Route path="/public/:slug" element={<PublicStatusPage />} />
{/* Protected Routes */}
<Route path="/dashboard" element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
} />
<Route path="/service/:id" element={
<ProtectedRoute>
<ServiceDetail />
</ProtectedRoute>
} />
<Route path="/settings" element={
<ProtectedRoute>
<Settings />
</ProtectedRoute>
} />
<Route path="/profile" element={
<ProtectedRoute>
<Profile />
</ProtectedRoute>
} />
<Route path="/ssl-domain" element={
<ProtectedRoute>
<SslDomain />
</ProtectedRoute>
} />
<Route path="/schedule-incident" element={
<ProtectedRoute>
<ScheduleIncident />
</ProtectedRoute>
} />
<Route path="/operational-page" element={
<ProtectedRoute>
<OperationalPage />
</ProtectedRoute>
} />
<Route path="/regional-monitoring" element={
<ProtectedRoute>
<RegionalMonitoring />
</ProtectedRoute>
} />
<Route path="*" element={<NotFound />} />
</Routes>
</Router>
<Toaster /> <Toaster />
</SidebarProvider> <Routes>
</LanguageProvider> {/* Public routes */}
</ThemeProvider> <Route path="/public/:slug" element={<PublicStatusPage />} />
</QueryClientProvider>
</ErrorBoundary> {/* Protected routes */}
<Route path="/login" element={<Login />} />
<Route path="/" element={<ProtectedRoute><Index /></ProtectedRoute>} />
<Route path="/dashboard" element={<ProtectedRoute><Dashboard /></ProtectedRoute>} />
<Route path="/instance-monitoring" element={<ProtectedRoute><InstanceMonitoring /></ProtectedRoute>} />
<Route path="/server-detail/:serverId" element={<ProtectedRoute><ServerDetail /></ProtectedRoute>} />
<Route path="/container-monitoring" element={<ProtectedRoute><ContainerMonitoring /></ProtectedRoute>} />
<Route path="/container-monitoring/:serverId" element={<ProtectedRoute><ContainerMonitoring /></ProtectedRoute>} />
<Route path="/service/:id" element={<ProtectedRoute><ServiceDetail /></ProtectedRoute>} />
<Route path="/ssl-domain" element={<ProtectedRoute><SslDomain /></ProtectedRoute>} />
<Route path="/schedule-incident" element={<ProtectedRoute><ScheduleIncident /></ProtectedRoute>} />
<Route path="/operational-page" element={<ProtectedRoute><OperationalPage /></ProtectedRoute>} />
<Route path="/regional-monitoring" element={<ProtectedRoute><RegionalMonitoring /></ProtectedRoute>} />
<Route path="/settings" element={<ProtectedRoute><Settings /></ProtectedRoute>} />
<Route path="/profile" element={<ProtectedRoute><Profile /></ProtectedRoute>} />
<Route path="*" element={<NotFound />} />
</Routes>
</QueryClientProvider>
</SidebarProvider>
</LanguageProvider>
</ThemeProvider>
</BrowserRouter>
); );
} }
@@ -0,0 +1,16 @@
import { ReactNode } from 'react';
import { Navigate } from 'react-router-dom';
import { authService } from '@/services/authService';
interface ProtectedRouteProps {
children: ReactNode;
}
export const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
if (!authService.isAuthenticated()) {
return <Navigate to="/login" replace />;
}
return <>{children}</>;
};
@@ -1,3 +1,4 @@
import { Globe, Boxes, Radar, Calendar, BarChart2, LineChart, MapPin, Settings, User, Bell, Database, Info, BookOpen } from "lucide-react"; import { Globe, Boxes, Radar, Calendar, BarChart2, LineChart, MapPin, Settings, User, Bell, Database, Info, BookOpen } from "lucide-react";
export const mainMenuItems = [ export const mainMenuItems = [
@@ -11,11 +12,11 @@ export const mainMenuItems = [
}, },
{ {
id: 'instance-monitoring', id: 'instance-monitoring',
path: null, path: '/instance-monitoring',
icon: Boxes, icon: Boxes,
translationKey: 'instanceMonitoring', translationKey: 'instanceMonitoring',
color: 'text-blue-400', color: 'text-blue-400',
hasNavigation: false hasNavigation: true
}, },
{ {
id: 'ssl-domain', id: 'ssl-domain',
+1
View File
@@ -1,3 +1,4 @@
import * as React from "react" import * as React from "react"
import * as TabsPrimitive from "@radix-ui/react-tabs" import * as TabsPrimitive from "@radix-ui/react-tabs"