Перейти к содержимому

Техническая архитектура

Этот раздел для технических специалистов — разработчиков и DevOps. Если вы администратор отеля, вам это не потребуется.

КомпонентТехнология
ФронтендNext.js 16, React 19, TypeScript
СтилизацияTailwind CSS 4, shadcn/ui, Radix UI
Серверное состояниеReact Query 5 (TanStack Query)
ФормыReact Hook Form + Zod
ГрафикиRecharts
Реальное времяSocket.IO
Темыnext-themes

Каждая страница-список следует единому паттерну:

PageComponent (state: search, filters, pagination, columnVisibility)
├── Toolbar (SearchInput + фильтры + столбцы + кнопка создания)
├── DataTable (строки с условными столбцами, skeleton/empty)
└── Pagination (страницы, размер, навигация)
  • Поиск с debounce 300мс
  • Фильтры с бейджами количества активных (FilterBadge)
  • Видимость столбцов через выпадающее меню
  • Серверная пагинация с keepPreviousData

Все формы создания/редактирования — выдвижные панели:

Sheet
├── SheetHeader (заголовок)
├── ScrollArea (форма)
│ ├── FormField (React Hook Form + Zod)
│ └── ...
└── Footer (Создать / Отмена)

Детальные страницы используют кликабельные секции для компактного отображения информации:

ClickableSection (hover:bg-muted/50, ChevronRight)
├── InfoItem (label + value + optional hint)
└── ...

Секция разворачивается при клике, показывая форму редактирования.

Компонент отображает информацию о последнем изменении — кто и когда внёс правки (используется updatedByUserId).

  • Фабрика queryKeys в lib/api.ts
  • Хуки: useBookings(), useUnits(), useGuests()
  • Stale time: 30с, GC: 5 мин
КонтекстНазначение
AuthContextСессия, вход/выход
ProjectContextАктивный проект
SocketContextWebSocket
  • Bearer-токен добавляется автоматически
  • Автообновление при 401
  • Типизированные ошибки: ApiRequestError

WebSocket через Socket.IO:

  • Новые бронирования
  • Изменения статусов
  • Платежи
  • Отзывы

Cmd+K — нечёткий поиск по всем страницам через cmdk. Навигация определена в lib/navigation.ts — единый источник для сайдбара и палитры.

Контентные поля: русский, английский, казахский. Компонент MultiLangInput с вкладками.

Роли (SUPER_ADMIN, ADMIN, OPERATOR, VIEWER) проверяются на уровне компонентов через хук usePermissions(). Действия и элементы скрываются или блокируются в зависимости от роли.