7.4 KiB
Raw Permalink Blame History

Frontend FSD Market Pages

Дата: 2026-06-20 Статус: спецификация

Контекст

Предыдущие FSD-итерации мигрировали broker-домен (frontend-fsd-broker-pilot), shared-слой (frontend-fsd-shared-layer), entities stock/bond/portfolio (fsd-entities-migration) и app-слой с auth (frontend-fsd-app-auth).

Рыночные страницы (StockPage, BondPage, HomePage) и их компоненты (StockDetails, BondDetails, PriceChart, SearchBar) остались в исторической технической структуре (components/, hooks/, плоские pages/). Это единственный крупный блок кода вне FSD-структуры, который активно используется пользователями.

Иерархия источников

  • Текущая задача пользователя: завершить FSD-миграцию рыночных страниц.
  • docs/inbox.md: направление на постепенную FSD-миграцию.
  • docs/features/frontend-fsd-broker-pilot/spec.md: эталонный FSD-шаблон.

Цель

Перевести рыночные страницы (stock, bond, home) и связанные компоненты в FSD-структуру, следуя паттерну, установленному broker-пилотом — через widgets, entities и page entrypoints с совместимыми shim-файлами.

Область изменений

Фича охватывает только frontend-код рыночных страниц:

  • StockPage, BondPage, HomePage — миграция из плоских pages/ в pages/stock/, pages/bond/, pages/home/ с FSD-структурой;
  • StockDetails, BondDetails — миграция из components/ в widgets/stock-details/, widgets/bond-details/;
  • PriceChart — миграция из components/ в widgets/price-chart/;
  • SearchBar + useSearch — миграция в widgets/search-bar/ + новый entity entities/search/;
  • таблица дивидендов — вынос из StockPage в новый виджет widgets/dividends-table/;
  • shim-файлы для обратной совместимости;
  • обновление роутинга и layout для импортов из новых FSD-точек входа.

Требования

1. Все компоненты следуют FSD-слоям

  • entities — data-слой (API + query hooks). Новый: entities/search/.
  • widgets — бизнес-композиция UI. Новые: widgets/stock-details/, widgets/bond-details/, widgets/price-chart/, widgets/search-bar/, widgets/dividends-table/.
  • pages — тонкие entrypoints. Новые: pages/stock/, pages/bond/, pages/home/.

1.1 Ownership данных остаётся у pages и entities

  • pages/stock и pages/bond владеют route params и orchestration загрузки данных через существующие entity hooks (useStock, useBond, useStockCandles, useBondCandles, useStockDividends).
  • widgets/stock-details, widgets/bond-details, widgets/price-chart, widgets/dividends-table остаются презентационно-композиционными и получают готовые данные через props.
  • widgets/search-bar владеет локальным UI-состоянием поиска (input, debounced query, dropdown), а query-hook useSearch размещается в entities/search/model/.
  • pages/home остаётся статическим page entrypoint без новой data-логики.

2. Границы срезов явные через public API

Каждый widget и entity имеет index.ts barrel с контролируемым экспортом.

Внешний код импортирует market pages/widgets/entities только через их public API (@/pages/stock, @/widgets/search-bar, @/entities/search и т.д.). Deep imports во внутренние model/, api/, ui/ директории не считаются контрактом для внешних потребителей.

3. Поведение UI не меняется

Миграция не добавляет новую функциональность и не пересматривает UX.

4. Совместимость через shim-файлы

Старые пути (components/StockDetails.tsx, hooks/useSearch.ts, pages/StockPage.tsx) становятся re-export shim-файлами, импортирующими из новых FSD-точек входа.

5. Тесты следуют новым границам

Тесты перемещаются вместе с компонентами в соответствующие widget/page/ui-директории.

6. Общая инфраструктура остаётся в shared

HTTP-клиент и типы остаются в shared/api/. PriceChart использует lightweight-charts непосредственно, без дополнительных абстракций.

Ограничения

  • Изменения ограничены frontend-пакетом.
  • Допускаются связанные обновления опубликованной frontend-документации и ADR, если они отражают новую FSD-структуру market pages.
  • Не вводятся ESLint import boundaries или import guards.
  • Не мигрируются portfolio и screener страницы.
  • Не удаляется мёртвый код (old pages/broker/, api/broker.ts).
  • Не меняется backend API, Swagger, codegen.

Acceptance Criteria

  • StockDetails доступен через widgets/stock-details.
  • BondDetails доступен через widgets/bond-details.
  • PriceChart доступен через widgets/price-chart.
  • SearchBar доступен через widgets/search-bar и использует query/public API из entities/search.
  • DividendsTable вынесен из StockPage в widgets/dividends-table.
  • StockPage доступен через pages/stock.
  • BondPage доступен через pages/bond.
  • HomePage доступен через pages/home.
  • Все старые пути (components/*, hooks/useSearch, pages/StockPage/BondPage/HomePage) — re-export shims, импортирующие из новых FSD-точек входа.
  • app/routing/AppRoutes.tsx и app/layouts/AppLayout.tsx импортируют из новых FSD-точек входа.
  • pages/stock и pages/bond сохраняют orchestration загрузки market data и передают widgets готовые props без переноса route/query orchestration внутрь widgets.
  • Frontend lint, tests и build проходят.
  • Пользовательское поведение эквивалентно.
  • ADR и документация обновлены.

Не цели

  • Миграция portfolio, screener и остальных доменов.
  • Введение жёстких правил импортов.
  • Удаление мёртвого кода (old pages/broker/, api/broker.ts).
  • Переписывание стилей или визуального дизайна.
  • Добавление новой функциональности.