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