Files
ticket-system/frontend-client/FRONTEND_ARCHITECTURE.md

41 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Архитектура Frontend-клиента (Next.js 14)
## 1. Базовые принципы
- **Стек:** Next.js 14 (App Router), React 18, TypeScript, Tailwind CSS.
- **UI/UX:** Темная тема (`#121212`), акцентный цвет `#E32636`. Иконки — строго `lucide-react`.
- **Компоненты:** Никакого кастомного CSS. Только утилитные классы Tailwind.
## 2. Управление состоянием (State Management)
- **Глобальный стейт (Zustand):**
- `authStore`: Хранит JWT-токен и данные профиля. **Обязательно** использовать persist middleware (хранить в localStorage).
- `cartStore`: Хранит выбранные места (`CartSeat` с `ticketId`). **ЗАПРЕЩЕНО** использовать persist. Корзина живет только в памяти страницы, так как лок места на бэкенде временный (TTL в Redis).
## 3. Работа с API и Сетью (КРИТИЧЕСКИ ВАЖНО)
- **Базовый URL:** ЗАПРЕЩЕНО хардкодить `localhost` или прямые IP в исходном коде. Всегда использовать `process.env.NEXT_PUBLIC_API_URL` с фоллбэком.
- **Клиент:** Axios инстанс (`src/api/client.ts`).
- **Авторизация:** Интерсептор автоматически добавляет `Authorization: Bearer <token>` из `authStore`.
- **Обработка ошибок:** Все вызовы API оборачивать в `try/catch`. Бизнес-ошибки (например, 409 Conflict) обрабатывать локально с показом Toast-уведомлений.
## 4. Структура директорий
- `src/app/` — Роутинг (Pages, Layouts).
- `src/components/` — Переиспользуемые UI компоненты.
- `src/api/` — API-клиенты и типизация ответов бэкенда.
- `src/store/` — Zustand-хранилища.
## 5. Интерактивность и Навигация (КРИТИЧЕСКИ ВАЖНО)
- ЗАПРЕЩЕНО создавать "мертвые" кнопки навигации.
- Любой элемент UI, который визуально выглядит как кнопка перехода на другую страницу, ОБЯЗАН быть обернут в компонент `<Link href="...">` из `next/link` или иметь обработчик `onClick={() => router.push('...')}`.
- Если для кнопки пока нет API (например, Apple Wallet), она должна выводить `toast("Функция в разработке")`.
## 6. Карта маршрутизации (Screen Flow)
[ Каталог турниров : / ] (Главная)
├── Клик по турниру ──> [ Схема зала : /events/[id]/seats ]
│ ├── Клик "Назад" ──> (возврат на /)
│ └── Клик "Оплатить" ──> [ Оформление заказа : /checkout ]
│ └── Успех ──> [ Мои билеты : /tickets ]
├── Клик в TabBar "Билеты" ──> [ Мои билеты : /tickets ] (Требует авторизации)
│ └── Клик по карточке ──> [ Электронный билет (QR) : /tickets/[ticket_id] ]
│ └── Клик "Назад" ──> (возврат на /tickets)
└── Клик в TabBar "Профиль" ──> [ Профиль : /profile ] (Если нет токена -> редирект на /login)