feat: add authorization
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# API Layer
|
||||
|
||||
OpenAPI backend является источником истины. После изменения backend-контракта запускается `npm run openapi:generate`; `src/shared/api/generated/schema.d.ts` не редактируется вручную.
|
||||
|
||||
Все HTTP-вызовы используют `apiClient` из `src/shared/api`. Прямой `fetch` в features, pages и entities не используется.
|
||||
|
||||
Request и response types выводятся из generated `paths`, например:
|
||||
|
||||
```ts
|
||||
type User = paths["/api/v1/auth/me"]["get"]["responses"][200]["content"]["application/json"];
|
||||
```
|
||||
|
||||
Ручной domain/UI type допустим только если он отличается от transport DTO по смыслу, а не повторяет его поля.
|
||||
@@ -0,0 +1,18 @@
|
||||
# Conventions
|
||||
|
||||
## Must
|
||||
|
||||
- Использовать Biome: `npm run lint`; табы и двойные кавычки определяет `biome.json`.
|
||||
- Для type-only импортов использовать `import type`; не использовать `enum` и `namespace`.
|
||||
- UI-строки хранить в `src/shared/i18n/locales/ru.ts` и получать через `useTranslation()`.
|
||||
- Zod-схемы не содержат пользовательских строк: использовать `validationMessage(key)` из `src/shared/i18n/zod.ts`.
|
||||
- Публичный импорт слайса идёт через его `index.ts`.
|
||||
- Тесты лежат рядом с исходником как `*.test.tsx`.
|
||||
|
||||
## File roles
|
||||
|
||||
- `Component.tsx` - контейнер или публичный компонент.
|
||||
- `Component.vm.ts` - hook с данными и действиями.
|
||||
- `Component.view.tsx` - чистое представление.
|
||||
- `Component.types.ts` - props и локальные типы.
|
||||
- `Component.module.css` - локальные стили.
|
||||
@@ -0,0 +1,9 @@
|
||||
# Frontend Documentation
|
||||
|
||||
Эти документы задают правила AI-разработки и дополняют `AGENTS.md`. Фактические версии зависимостей и scripts всегда определяются конфигурацией проекта.
|
||||
|
||||
- `CONVENTIONS.md` - обязательные правила кода и i18n.
|
||||
- `API-LAYER.md` - OpenAPI, generated types и typed client.
|
||||
- `UI-PATTERN.md` - формы и UI-состояния.
|
||||
- `STRUCTURE.md` - FSD-слои, импорты и public API слайсов.
|
||||
- `TESTING.md` - Vitest и Testing Library.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Structure
|
||||
|
||||
Проект использует FSD-направление импортов: `app -> pages -> features -> entities -> shared`.
|
||||
|
||||
- `app` - providers, routes и глобальные стили.
|
||||
- `pages` - страницы маршрутов.
|
||||
- `features` - пользовательские сценарии, включая authentication.
|
||||
- `entities` - доменные модели и их UI/API.
|
||||
- `shared` - переиспользуемый код без доменной логики: API, i18n и UI.
|
||||
|
||||
Каждый слайс предоставляет наружу только public API через `index.ts`; внутренние файлы соседний слой не импортирует напрямую.
|
||||
@@ -0,0 +1,5 @@
|
||||
# Testing
|
||||
|
||||
Тесты запускаются `npm run test:run` через Vitest и Testing Library.
|
||||
|
||||
Проверяйте наблюдаемое поведение, а не детали реализации. UI-тест строится как Arrange, Act, Assert; для интерактивных действий предпочитайте `userEvent`. Форма должна проверять валидацию и отсутствие запроса при невалидных данных; маршруты - редиректы и доступность экрана.
|
||||
@@ -0,0 +1,7 @@
|
||||
# UI Pattern
|
||||
|
||||
Формы используют `react-hook-form`, `zodResolver` и `FormProvider`. Form state создаётся в контейнере или VM, чистое представление получает `onSubmit` и `disabled`, а поля подключает через `useFormContext`.
|
||||
|
||||
Во время submit все действия формы блокируются. Ошибки Zod отображаются у поля; ошибки сети сохраняют введённые значения и показываются отдельным `Alert`.
|
||||
|
||||
Запросные экраны выбирают состояние в порядке loading, error, empty, loaded. Состояния имеют отдельные компоненты, если повторяются или содержат самостоятельную разметку.
|
||||
Reference in New Issue
Block a user