Роутинг
Приложение использует Expo Router v6 — file-based routing для React Native.
Структура маршрутов
app/
├── _layout.tsx # Root layout — провайдеры + навигационные гарды
├── +not-found.tsx # 404 экран
│
├── (auth)/ # Группа: авторизация
│ ├── login.tsx # Вход (email/password + Google OAuth)
│ └── verify-code.tsx # Подтверждение email
│
└── (app)/ # Группа: авторизованная часть
├── _layout.tsx # Layout с проверкой компании
│
├── (tabs)/ # Нижний таб-бар
│ ├── _layout.tsx # Конфигурация табов
│ ├── index.tsx # Dashboard (главная)
│ ├── chats.tsx # Список чатов
│ ├── phones.tsx # Телефоны
│ ├── integrations.tsx # Интеграции
│ └── more.tsx # Меню «Ещё»
│
├── chat/
│ ├── [id].tsx # Экран чата (динамический)
│ └── info.tsx # Информация о чате
│
├── assistants/
│ ├── index.tsx # Список ассистентов
│ ├── [id].tsx # Детали ассистента
│ ├── create.tsx # Создание ассистента
│ ├── edit.tsx # Редактирование
│ ├── connect-phone.tsx # Привязка телефона
│ ├── connect-integration.tsx # Привязка интеграции
│ ├── folder-form.tsx # Форма папки
│ ├── tool-form.tsx # Форма инструмента
│ └── knowledge-form.tsx # Форма базы знаний
│
├── phones/
│ ├── index.tsx # Список телефонов
│ └── create.tsx # Добавление номера
│
├── integrations/
│ ├── index.tsx # Список интеграций
│ └── connect.tsx # Подключение мессенджера
│
├── companies/
│ └── index.tsx # Управление компаниями
│
├── settings/
│ ├── account.tsx # Настройки аккаунта
│ └── company.tsx # Настройки компании
│
└── billing.tsx # Тарифы и подпискиГруппы маршрутов
(auth) — Авторизация
Экраны доступны только неавторизованным пользователям. Если у пользователя есть сессия, происходит редирект в (app).
(app) — Основное приложение
Доступно только авторизованным пользователям. Если сессии нет — редирект на (auth)/login.
Дополнительная проверка: если у пользователя нет компаний, показывается экран создания компании.
Навигационные гарды
Root layout управляет редиректами на основе состояния сессии:
Пользователь открывает приложение
│
├── Нет сессии?
│ └── Редирект → (auth)/login
│
├── Не верифицирован?
│ └── Редирект → (auth)/verify-code
│
├── Нет компаний?
│ └── Показать экран создания компании
│
└── Всё ок → (app)/(tabs)Гарды используют useSegments() для определения текущей группы маршрутов и router.replace() для перенаправления.
Нижний таб-бар
Конфигурация табов в (tabs)/_layout.tsx:
| Таб | Иконка | Экран |
|---|---|---|
| Главная | Home | index.tsx |
| Чаты | MessageCircle | chats.tsx |
| Телефоны | Phone | phones.tsx |
| Интеграции | Plug | integrations.tsx |
| Ещё | MoreHorizontal | more.tsx |
Таб-бар использует glassmorphism эффект (blur) и кастомные иконки с badge-счётчиками.
Динамические маршруты
chat/[id].tsx— ID чата из URL-параметраassistants/[id].tsx— ID ассистента
Доступ через useLocalSearchParams<{ id: string }>().