Skip to content

Обзор архитектуры

Стек технологий

СлойТехнология
ФреймворкExpo SDK 54 + React Native 0.81
НавигацияExpo Router v6 (file-based routing)
АвторизацияJWT через saas-api (email/password + Google OAuth)
Серверный стейтTanStack Query v5
Клиентский стейтZustand v5 + AsyncStorage persistence
СтилизацияNativeWind v4 (Tailwind CSS для React Native)
Анимацииreact-native-reanimated
Real-timesocket.io-client
Hapticsexpo-haptics
МониторингSentry + Firebase Analytics

Слои приложения

┌─────────────────────────────────────────┐
│               app/ (Routes)             │  Expo Router — файловый роутинг
├─────────────────────────────────────────┤
│           src/components/               │  UI-компоненты (Button, Input, ...)
├─────────────────────────────────────────┤
│            src/features/                │  Фичи (auth, chat, saas-api, ...)
│  ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│  │  hooks/  │ │ stores/  │ │   ui/   │ │
│  └──────────┘ └──────────┘ └─────────┘ │
├─────────────────────────────────────────┤
│              src/core/                  │  Тема, i18n, мониторинг, шрифты
├─────────────────────────────────────────┤
│              src/lib/                   │  Утилиты (haptics, toast, debug)
├─────────────────────────────────────────┤
│         saas-api (backend)              │  REST API + WebSocket
└─────────────────────────────────────────┘

Структура директорий

saas-mobile/
├── app/                        # Expo Router
│   ├── _layout.tsx             # Root layout (провайдеры)
│   ├── (auth)/                 # Экраны авторизации
│   ├── (app)/                  # Авторизованная часть
│   └── +not-found.tsx          # 404
├── src/
│   ├── features/
│   │   ├── auth/               # JWT авторизация, SessionProvider
│   │   ├── saas-api/           # HTTP клиент, типы API
│   │   ├── chat/               # Чаты, WebSocket, stores
│   │   ├── assistants/         # Ассистенты
│   │   ├── integrations/       # Мессенджер-интеграции
│   │   ├── phones/             # Телефонные номера
│   │   └── notifications/      # Push-уведомления
│   ├── components/             # Переиспользуемые UI-компоненты
│   │   └── ui/                 # Базовые UI (Button, Input, ...)
│   ├── core/
│   │   ├── theme/              # Цвета, провайдер, store
│   │   ├── i18n/               # i18next, переводы
│   │   ├── monitoring/         # Sentry, Firebase Analytics
│   │   ├── fonts/              # Inter font family
│   │   └── assets/             # Иконки, изображения
│   ├── stores/                 # Глобальные Zustand stores
│   ├── hooks/                  # Общие хуки
│   ├── lib/                    # Утилиты
│   │   ├── haptics.ts          # HapticService
│   │   ├── toast.ts            # Toast уведомления
│   │   ├── debug.ts            # Debug утилиты
│   │   ├── styles.ts           # Стили-утилиты
│   │   ├── utils.ts            # Общие утилиты
│   │   └── confirm.ts          # Confirm диалоги
│   └── types/                  # Глобальные TypeScript типы
├── assets/                     # Иконки приложения, splash screen
├── plugins/                    # Expo plugins (Firebase)
└── credentials/                # EAS / Firebase credentials

Провайдеры (Root Layout)

Root layout (app/_layout.tsx) оборачивает приложение в дерево провайдеров:

Sentry.wrap()
└── ThemeProvider (NativeWind)
    └── QueryClientProvider (TanStack Query)
        └── SessionProvider (JWT auth)
            └── GestureHandlerRootView
                └── KeyboardProvider
                    └── BottomSheetModalProvider
                        └── Slot (Expo Router)

Доменные модели

МодельОписание
UserПользователь (email, verification status)
CompanyКомпания/воркспейс
AssistantAI-ассистент (настройки, промпт, модель)
ChatЧат с информацией о мессенджере
MessageСообщение в чате
IntegrationПодключение мессенджера (Telegram, Instagram, ...)
PhoneТелефонный номер для голосовых вызовов

Внешние сервисы

СервисНазначение
saas-apiREST API + WebSocket для real-time
Expo NotificationsPush-уведомления
SentryТрекинг ошибок
Firebase AnalyticsАналитика использования
Google OAuthАвторизация через Google