Skip to content

Конвенции кода

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 для клиентского стейта
  • persist middleware + 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 stricttsc --noEmit
HuskyPre-commit hooks

Проверка перед коммитом

bash
npm run validate   # typecheck + lint + format:check

Naming Conventions

ЭлементСтильПример
КомпонентыPascalCaseChatList.tsx
ХукиcamelCase с useuseChats.ts
StorescamelCase с useuseChatStore.ts
УтилитыcamelCaseformatDate.ts
Типы/интерфейсыPascalCase с IIMessage
EnumsPascalCaseMessengerType
КонстантыUPPER_SNAKE_CASEMAX_MESSAGES