Implement the complete message center with: - Database migrations for message_templates, messages, message_subscriptions tables - erp-message crate with entities, DTOs, services, handlers - Message CRUD, send, read/unread tracking, soft delete - Template management with variable interpolation - Subscription preferences with DND support - Frontend: messages page, notification panel, unread count badge - Server integration with module registration and routing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { HashRouter, Routes, Route, Navigate } from 'react-router-dom';
|
|
import { ConfigProvider, theme as antdTheme } from 'antd';
|
|
import zhCN from 'antd/locale/zh_CN';
|
|
import MainLayout from './layouts/MainLayout';
|
|
import Login from './pages/Login';
|
|
import Home from './pages/Home';
|
|
import Roles from './pages/Roles';
|
|
import Users from './pages/Users';
|
|
import Organizations from './pages/Organizations';
|
|
import Settings from './pages/Settings';
|
|
import Workflow from './pages/Workflow';
|
|
import Messages from './pages/Messages';
|
|
import { useAuthStore } from './stores/auth';
|
|
import { useAppStore } from './stores/app';
|
|
|
|
function PrivateRoute({ children }: { children: React.ReactNode }) {
|
|
const isAuthenticated = useAuthStore((s) => s.isAuthenticated);
|
|
return isAuthenticated ? <>{children}</> : <Navigate to="/login" replace />;
|
|
}
|
|
|
|
export default function App() {
|
|
const loadFromStorage = useAuthStore((s) => s.loadFromStorage);
|
|
const theme = useAppStore((s) => s.theme);
|
|
|
|
// Restore auth state from localStorage on app load
|
|
useEffect(() => {
|
|
loadFromStorage();
|
|
}, [loadFromStorage]);
|
|
|
|
return (
|
|
<ConfigProvider
|
|
locale={zhCN}
|
|
theme={{
|
|
algorithm: theme === 'dark' ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,
|
|
}}
|
|
>
|
|
<HashRouter>
|
|
<Routes>
|
|
<Route path="/login" element={<Login />} />
|
|
<Route
|
|
path="/"
|
|
element={
|
|
<PrivateRoute>
|
|
<MainLayout>
|
|
<Routes>
|
|
<Route path="/" element={<Home />} />
|
|
<Route path="/users" element={<Users />} />
|
|
<Route path="/roles" element={<Roles />} />
|
|
<Route path="/organizations" element={<Organizations />} />
|
|
<Route path="/workflow" element={<Workflow />} />
|
|
<Route path="/messages" element={<Messages />} />
|
|
<Route path="/settings" element={<Settings />} />
|
|
</Routes>
|
|
</MainLayout>
|
|
</PrivateRoute>
|
|
}
|
|
/>
|
|
</Routes>
|
|
</HashRouter>
|
|
</ConfigProvider>
|
|
);
|
|
}
|