Конвенции кода
TypeScript
- Без явных return-типов — TypeScript сам выводит типы
- Early return — guard clauses вместо вложенных
if - Интерфейсы в отдельных файлах с
Iпрефиксом (IUser,IChat) - Больше 2 параметров → объект с интерфейсом
- Понятные имена переменных — без сокращений (
message, неmsg) - Без inline комментариев — код должен быть самодокументируемым
- Только относительные импорты — никогда
src/app/... - Без barrel exports (
index.ts) — импорт из конкретных файлов - Enums вместо констант для type-safe значений
React Native / Expo
Компоненты
- Функциональные компоненты (arrow functions)
- NativeWind
classNameдля стилей - CVA (
class-variance-authority) для вариантов компонентов cn()утилита для объединения классов
Навигация
- Expo Router file-based routing
useLocalSearchParams()для параметров маршрутаrouter.push()/router.replace()для навигации- Route groups:
(auth),(app),(tabs)
Стейт
- TanStack Query для серверных данных
- Zustand для клиентского стейта
persistmiddleware + AsyncStorage для персистенции- WebSocket events → Zustand stores
API-вызовы
- Только через
saasApiклиент — никогда прямойfetch - Try-catch только для HTTP-запросов
- Сервисы возвращают
nullпри ошибке, не бросают исключения
Action Menus
- Использовать
DropdownMenu(src/components/ui/dropdown-menu.tsx) - НЕ использовать BottomSheet ActionSheet (конфликты z-index/gestures)
- Паттерн:
useStateдляmenuVisible, массивactions
Haptics
- Использовать
HapticServiceизsrc/lib/haptics.ts - Можно отключить через проп
noHaptics - Graceful fallback для неподдерживаемых платформ
Стилизация
- NativeWind v4 — Tailwind CSS для React Native
- Цвета из
src/core/theme/colors.ts(единый источник правды) - Тёмная тема через
dark:префикс - Никогда не хардкодить цвета — использовать токены
clsx+tailwind-mergeдля объединения классов
Файловая структура
src/features/{feature}/
├── hooks/ # React хуки
├── stores/ # Zustand stores
├── ui/ # UI-компоненты
└── types.ts # Типы (если не в saas-api/types.ts)Качество кода
| Инструмент | Назначение |
|---|---|
| ESLint | Линтинг (sonarjs, unicorn, simple-import-sort, unused-imports) |
| Prettier | Форматирование |
| TypeScript strict | tsc --noEmit |
| Husky | Pre-commit hooks |
Проверка перед коммитом
bash
npm run validate # typecheck + lint + format:checkNaming Conventions
| Элемент | Стиль | Пример |
|---|---|---|
| Компоненты | PascalCase | ChatList.tsx |
| Хуки | camelCase с use | useChats.ts |
| Stores | camelCase с use | useChatStore.ts |
| Утилиты | camelCase | formatDate.ts |
| Типы/интерфейсы | PascalCase с I | IMessage |
| Enums | PascalCase | MessengerType |
| Константы | UPPER_SNAKE_CASE | MAX_MESSAGES |