Initial commit: HotelSync PMS v0.1.0

- React 18 + TypeScript + Vite + Tailwind CSS
- Шахматка бронирований (drag-to-book)
- Страницы: Calendar, Bookings, Rooms, Housekeeping, Channels, API Docs, Settings
- Роли: super_admin, hotel_manager, housekeeper
- Светлая/тёмная тема
- Docker + Nginx конфигурация
- Лендинг hotelsync.ru
This commit is contained in:
2026-03-10 20:38:32 +03:00
commit 420d55d57e
45 changed files with 7274 additions and 0 deletions

66
src/App.tsx Normal file
View File

@@ -0,0 +1,66 @@
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { ThemeProvider } from './contexts/ThemeContext'
import { AuthProvider } from './contexts/AuthContext'
import { AppLayout } from './layouts/AppLayout'
import { LoginPage } from './pages/LoginPage'
import { CalendarPage } from './pages/CalendarPage'
import { BookingsPage } from './pages/BookingsPage'
import { RoomsPage } from './pages/RoomsPage'
import { HousekeepingPage } from './pages/HousekeepingPage'
import { ChannelsPage } from './pages/ChannelsPage'
import { ApiDocsPage } from './pages/ApiDocsPage'
import { SettingsPage } from './pages/SettingsPage'
import { AdminDashboard } from './pages/AdminDashboard'
import { useAuth } from './contexts/AuthContext'
function RoleGuard({
children,
allow,
}: {
children: React.ReactNode
allow: string[]
}) {
const { user } = useAuth()
if (!user || !allow.includes(user.role)) {
return <Navigate to="/login" replace />
}
return <>{children}</>
}
export default function App() {
return (
<ThemeProvider>
<AuthProvider>
<BrowserRouter>
<Routes>
{/* Public */}
<Route path="/login" element={<LoginPage />} />
{/* Hotel routes */}
<Route path="/:hotelSlug" element={<AppLayout />}>
<Route index element={<Navigate to="calendar" replace />} />
<Route path="calendar" element={<CalendarPage />} />
<Route path="bookings" element={<BookingsPage />} />
<Route path="rooms" element={<RoomsPage />} />
<Route path="housekeeping" element={<HousekeepingPage />} />
<Route path="channels" element={<ChannelsPage />} />
<Route path="api-docs" element={<ApiDocsPage />} />
<Route path="settings" element={<SettingsPage />} />
</Route>
{/* Admin routes */}
<Route path="/admin" element={<AppLayout />}>
<Route index element={<AdminDashboard />} />
<Route path="hotels" element={<AdminDashboard />} />
<Route path="users" element={<AdminDashboard />} />
</Route>
{/* Default */}
<Route path="/" element={<Navigate to="/login" replace />} />
<Route path="*" element={<Navigate to="/login" replace />} />
</Routes>
</BrowserRouter>
</AuthProvider>
</ThemeProvider>
)
}