TU Card
src/features/tu_card/ — спільна картка TU у full-access і partial-access режимах.
Суть
TU Card представляє одну глобальну TU та, залежно від ролі, відкриває повні персональні дані або обмежений Family-контекст. Full-access режим керує Stack-карткою і зв’язками між Family. Partial-access режим показує дані конкретної Family та дозволяє Top manager редагувати тільки опис і Legend.
Списки, з яких відкривається картка, описані окремо:
- TU Profiles (Stack) — глобальний каталог;
- TU Profiles (per-family) — TU у межах окремої Family;
- Operator view — власні TU оператора.
Use cases
- Director або Client manager створює й веде повну TU Card, додає персональні дані, файли, Family- і Gmail-зв’язки.
- Top manager відкриває TU з per-family списку й оновлює Profile description та Legend.
- Supervisor переглядає TU своєї команди в read-only режимі.
- Operator відкриває одну зі своїх TU для перегляду опису, Legend і основних даних.
Режими й маршрути
| Режим | Роль | Маршрут |
|---|---|---|
| Full access, create | Director | /ceo/tu_profiles/create |
| Full access, edit | Director | /ceo/tu_profiles/:id |
| Full access, create | Client manager | /client_manager/tu_profiles/create?extra=<clientManagerStackId> |
| Full access, edit | Client manager | /client_manager/tu_profiles/:id?extra=<clientManagerStackId> |
| Partial access, edit | Top manager | /top_manager/<family-route>/tu_profiles/:id?extra=<family> |
| Partial access, read-only | Supervisor | /teamlead/<family-route>/tu_profiles/:id?extra=<family> |
| Partial access, read-only | Operator | /operator/tu_profiles/:id?extra=<family> |
<family-route> використовує talkytimes для Prime. Query extra передає backend Family prime.
У full-access компоненті role prop не змінює форму. Різниця Director/Client manager задається доступом до списку та clientManagerStackId у query, який обмежує Family selector.
Full-access TU Card
Структура
- Avatar.
- General Info.
- Personal Data і passport scans.
- TU folder, Media content, Instagram, TikTok, Telegram, Phone.
- Family connections.
- Gmail connection.
- Profile description.
- Legend із 17 полів.
- Comments для existing card.
Create mode починається з порожньої Stack-картки. Кнопка називається UPDATE і для create, і для edit; backend update-operation створює запис, якщо ID ще немає.
General Info
Поля:
- Name і Surname;
- Date of birth та розрахований вік;
- Country;
- Height у cm і Weight у kg;
- Color of eyes, Color of hair;
- Education, Occupation;
- Marital status;
- Children.
Правила:
- Name і Surname обов’язкові.
- Власниці TU має бути щонайменше 18 років.
- Country за замовчуванням —
Ukraine. - Calendar не дозволяє вибирати майбутню дату.
- Height і Weight приймають числове значення; порожнє значення зберігається як
0. - Marital status:
No data,In a relationship,Never married,Divorced,Widow. - Children додаються послідовно, максимум три.
- Новий child row доступний лише після заповнення Name у попередньому.
- Порожні child rows не зберігаються.
- Якщо у child є Name, але немає Date of birth, payload використовує поточну дату.
Перший порожній child row додається автоматично і синхронізується з initial state, щоб сам по собі не створювати unsaved changes.
Avatar і passport scans
Add a new avatarприймає image і показує локальний preview.- Для Avatar використовується лише один новий файл.
- Passport № редагується окремо від scans.
- Passport scans приймають
.jpeg. - Загальний ліміт existing + pending scans — п’ять.
- Existing і pending scans можна переглядати fullscreen і видаляти до save.
Основні дані TU Card зберігаються першими. Avatar і scans завантажуються окремо лише після успішного основного save.
Personal Data
| Поле | Поведінка |
|---|---|
TU folder | стає link для URL із drive.google.com |
Media content | стає link для URL із drive.google.com |
Instagram | стає link для URL із instagram.com |
TikTok | стає link для URL із tiktok.com |
Telegram | нормалізується до одного @; link з’являється після щонайменше п’яти символів username |
Phone | нормалізується до одного + і цифр |
Family connections
Family table містить GoldenBride, Udate, TalkyTimes і Chathouse.
- Для GoldenBride, Udate і TalkyTimes показується
id_api. - Для Chathouse показується
external_id. - Статуси:
Active,Blocked,Deleted,No data. - Перед відкриттям selector потрібне confirmation.
- Selector завантажує TU вибраної Family, які можна зв’язати з цією Stack TU Card.
- Client manager передає свій Stack ID і отримує обмежений список.
- Пошук працює за Name або Family ID.
- Вибір змінює локальний стан; остаточне збереження відбувається через
UPDATE.
Опція Free додається лише коли поточний Family record має id_api. Для Chathouse доступність цієї опції залежить від фактичної форми backend-даних, навіть якщо UI ID береться з external_id.
Gmail connection
- У непідключеному стані користувач вводить Login і Password.
- Credentials потрібно зберегти через
UPDATE. - Після появи connection status кнопка
Connectзапитує OAuth URL і відкриває popup. - Після закриття popup TU Card перечитує актуальний стан.
- У стані
ConnectedLogin read-only, а Password копіюється через icon. - Reset очищає email, password і status локально; зміни потрібно зберегти через
UPDATE.
Якщо браузер блокує popup або authorization URL відсутній, показується error notification.
Profile description і Legend
Profile description — окреме текстове поле.
Legend має стабільний порядок із 17 полів:
- Lifestyle
- Character
- Family
- Friends and pets
- Hobby
- Job description
- Ex-relationships
- Life plans
- Health
- Childhood memories
- Travel stories
- Language skills
- Cooking
- Car
- Favorite books, movies, music
- Tattoos, piercings, plastic surgery
- Sexual preferences
AI generation у цьому frontend feature не підключена.
Comments
Comments доступні лише existing card.
- Add і Delete виконуються окремими API-mutations, а не чекають загального
UPDATE. - Після успіху backend повертає актуальний список comments.
- Comment показує дату, автора та роль.
- Окремого confirmation перед Delete немає.
Поточний feature оновлює cardInfo, але не originalCardInfo після comment mutation. Через це Return може показати unsaved confirmation, хоча comment уже збережений.
Partial-access TU Card
Partial card завантажує TU за Stack ID і Family із extra.
Показуються:
- Name і Family ID;
- Avatar;
- Media content;
- Date of birth та Age;
- Country, Height, Weight;
- Color of eyes, Color of hair;
- Education, Occupation;
- Marital status і Children;
- Profile description;
- усі 17 полів Legend.
Для Chathouse header використовує external_id, для інших Family — id_api.
Права
- Top manager редагує тільки Profile description і Legend та бачить
UPDATE. - Supervisor і Operator отримують read-only поля без
UPDATE. - Partial update не запускає full-card validation.
- Save передає Family context разом із поточними даними картки.
Return використовує попередній frontend route і запитує confirmation, якщо Top manager має незбережені зміни.
Loading, empty та error states
- Full і partial load/save, comments, Family selector та Gmail actions використовують global loader.
- Backend message показується без зміни; за його відсутності використовується frontend fallback.
- Full-card load error залишає початкову порожню форму; окремого error screen немає.
- Partial-card load error залишає card state порожнім; header може показати
NaN. - Media content у partial card рендериться без активного
href, якщо URL відсутній. - Pending passport scans зберігаються поза
cardInfo; лише їх додавання може не активувати unsaved guard.
Нюанси
Lady,ladiesData,/lady/*,stackLadyIdтаid_api— backend/internal identifiers. User-facing назви цього feature —TUіTU Card.- Full-access
Returnзамінює останній route-сегмент наallі зберігає query. - Partial card не нормалізує відповідь через full-card normalizer, тому покладається на Family-shaped backend response.
Зв’язки
- TU Profiles (Stack) — глобальний список і full-access entry points.
- TU Profiles (per-family) — Family lists і partial-access entry points.
- media-renderer — avatar, scan preview та fullscreen.
- swagger — реєстр backend Swagger UI.
- API route constants:
src/utils/ladiesData.js. - Stack Swagger — Lady card — наявний group deeplink.
- TODO: замінити group link перевіреними operation deeplink-ами для get/update/upload, Family connections, Comments і Gmail OAuth.