TU Card

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.

Списки, з яких відкривається картка, описані окремо:

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, createDirector/ceo/tu_profiles/create
Full access, editDirector/ceo/tu_profiles/:id
Full access, createClient manager/client_manager/tu_profiles/create?extra=<clientManagerStackId>
Full access, editClient manager/client_manager/tu_profiles/:id?extra=<clientManagerStackId>
Partial access, editTop manager/top_manager/<family-route>/tu_profiles/:id?extra=<family>
Partial access, read-onlySupervisor/teamlead/<family-route>/tu_profiles/:id?extra=<family>
Partial access, read-onlyOperator/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

  1. У непідключеному стані користувач вводить Login і Password.
  2. Credentials потрібно зберегти через UPDATE.
  3. Після появи connection status кнопка Connect запитує OAuth URL і відкриває popup.
  4. Після закриття popup TU Card перечитує актуальний стан.
  5. У стані Connected Login read-only, а Password копіюється через icon.
  6. Reset очищає email, password і status локально; зміни потрібно зберегти через UPDATE.

Якщо браузер блокує popup або authorization URL відсутній, показується error notification.

Profile description і Legend

Profile description — окреме текстове поле.

Legend має стабільний порядок із 17 полів:

  1. Lifestyle
  2. Character
  3. Family
  4. Friends and pets
  5. Hobby
  6. Job description
  7. Ex-relationships
  8. Life plans
  9. Health
  10. Childhood memories
  11. Travel stories
  12. Language skills
  13. Cooking
  14. Car
  15. Favorite books, movies, music
  16. Tattoos, piercings, plastic surgery
  17. 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.