System · Stack Client

Архітектура feature-модулів

src/features/ — доменний шар фронтенду між role/family routes і shared UI primitives. Його мета — мати одну реалізацію бізнес-сценарію, але явно зберігати відмінності ролей, Family, доступів і presentation.

Межі відповідальності

  • Route entrypoint передає role, family та route params.
  • Config / registry / capabilities описують дозволені комбінації, endpoint adapters, видимі дії та presentation variants.
  • Hook / controller / model керує state transitions, запитами, нормалізацією й захистом від race conditions.
  • Components / sections рендерять отриманий state/actions contract.
  • CSS Module належить фактичному DOM-контракту feature; зміна вкладеності потребує окремої visual-перевірки.

Реєстр feature

| Код | UI-документація | Основна роль модуля | | -------------------------------------- | ------------------------------------------ | ---------------------------------- | ------------------------------------------------------ | | src/features/academy/ | Courses | рольові маршрути Academy, Mentor/Trainee flows | | src/features/connections_with_users/ | Metrics: connections with users | 14-денна таблиця TU ↔ RU | | src/features/dashboard/ | Dashboard | Family/role dashboard registry, transport і charts | | src/features/email_media_library/ | E-mail media | TU media lists, upload, moderation та delete | | src/features/favorites/by_tu/ | Favorites | TU-centric relations, calendar, notes і contacts | | src/features/favorites/global/ | Global favorites | RU-centric aggregated list і relation details | | src/features/hiring_media_library/ | Media Gallery | hiring media upload/edit/moderation | | src/features/hiring_workspace/ | Operators applicants: Work space | tasks, history, chat, socket і candidate card | | src/features/icebreakers/ | Icebreakers | family adapters, profile selection, create/hide/launch | | src/features/operator_card/ | Operator Card | create/edit operator/candidate card | | src/features/statistics/operators/ | Operator statistics | role/family operator statistics | | src/features/statistics/tu/ | TU Statistics | role/family TU earnings statistics | | src/features/teamlead_card/ | Team Lead Card | supervisor create/edit/personal profile | | src/features/ticket_management/ | Tickets | Board, New і Details route flows | | src/features/tu_card/ | TU Card | full/partial profile modes | | src/features/tu_profiles/ | TU Profiles | management/team lead/operator lists and dialogs |

Асинхронні інваріанти

Feature, де selection або filters можуть змінитися до завершення запиту, використовують один із механізмів:

  • latest-request gate;
  • AbortController;
  • mutation lock за identifier;
  • selection token/session;
  • mounted ref перед state update.

Ці guards не є зайвою складністю: вони не дозволяють старій відповіді перезаписати новий екран або додати дані іншого TU/user у поточний список.

Presentation-контракти

Канонічний список погоджених винятків та інваріантів підтримується в src/features/README.md. Найважливіші правила:

  • рефакторинг логіки не дає автоматичного дозволу змінювати DOM або локальні стилі;
  • Global Favorites і Favorites by TU мають різні presentation contracts;
  • Operator Card свідомо переведений на нову карткову систему;
  • legacy та enhanced режими shared selector-а не можна зливати в один DOM без перевірки всіх споживачів;
  • role/family layout differences мають залишатися явними в config або локальному presentation.

Як додати або змінити feature

  1. Знайти чинний route/access contract у role entrypoint і docs/index.md.
  2. Визначити owner: feature, role-specific або shared component.
  3. Зафіксувати role/family differences у config/capabilities, не через розкидані умовні гілки.
  4. Винести request/data logic у hook/controller/model.
  5. Зберегти чинний DOM/style contract або отримати окреме погодження на його зміну.
  6. Додати tests для model/API/capabilities та interaction tests для критичних сценаріїв.
  7. Оновити відповідну UI-документацію лише тоді, коли змінилася бізнес-поведінка, доступ, дія, стан або API-зв’язок.