media-gallery

Media Gallery

src/features/hiring_media_library/ · (UI-екран) — спільна бібліотека hiring media з модерацією для HR і завантаженням власних файлів для recruiter.

Суть

Media Gallery є самостійною feature і не належить до Operators applicants. HR та recruiter використовують один екран і спільний state; різницю дій визначає access mode ролі.

Use cases

  • HR переглядає approved/rejected media, модерує нові файли, редагує та видаляє записи.
  • Recruiter завантажує media і може редагувати власний запис, доки він перебуває On moderation.

Доступ і маршрути

РольМаршрутРежим
HR/hr/media_gallerymoderator
Recruiter/recruiter/media_galleryrecruiter

Структура екрана

Центральна колонка перемикається між Approved і Rejected. Права колонка показує On moderation. Обидві колонки мають фільтри Photo, Video, PDF, Docs, cursor-пагінацію по 20, нескінченне завантаження, віртуалізований список і стани Loading... / No media files.

Approved і On moderation завантажуються при відкритті сторінки. Rejected завантажується при першому переході на цю вкладку. Зміна фільтрів перезавантажує відповідну колонку; перемикання Approved / Rejected очищає selection.

On moderation (N) показує кількість уже завантажених у frontend-список записів, а не гарантований backend total. Якщо користувач вимикає останній media type, порожній набір фільтрів нормалізується назад до всіх чотирьох типів.

Перегляд media делеговано Shared media renderer. Feature визначає склад поточної галереї та права на видалення, але не дублює fullscreen, playback або file behavior.

Дії та права

ДіяHRRecruiter
Upload
Редагування approved media
Редагування On moderationлише власного
Approve / Reject
Selection і видалення approved/rejected
Видалення з fullscreen

Після upload файл з’являється у On moderation.

Rejected не має edit action навіть у режимі HR moderator. Recruiter може редагувати тільки власний On moderation, що перевіряється за автором запису.

Видалення потребує confirmation і виконується окремо для кожного вибраного файла. Успішно видалені записи прибираються з усіх status-списків і selection; notification окремо показує кількість успішних і невдалих операцій.

Після зміни status запис переноситься до відповідного локального списку без повного перезавантаження сторінки. Після редагування оновлена версія замінює запис у його поточному status-списку.

Upload і редагування

Add new відкриває форму одного файла з optional-полями Name і Description. Якщо Name порожнє під час вибору, воно автоматично отримує filename.

Дозволені формати:

  • image: JPG/JPEG, PNG, WEBP;
  • video: MP4, MOV;
  • documents: PDF, DOC/DOCX, XLS/XLSX.

Frontend звіряє MIME type перед upload. Непідтримуваний тип не відправляється та показує error-notification. Під час upload діє global loader; після успіху список On moderation перезавантажується, форма очищається і показується success-notification.

Окремого client-side ліміту розміру файла в feature не визначено. Фактичні backend-обмеження потрібно перевіряти через API documentation; frontend-документація не повинна вигадувати значення.

Edit modal змінює тільки Name і Description. Після успіху оновлений запис замінюється у поточному status-списку без reload.

Пагінація та віртуалізація

  • Кожен status завантажується cursor-сторінками по 20.
  • Новий базовий запит status скасовує попередній базовий запит цього status; abort не показує error notification.
  • Центральний і moderation-списки віртуалізовані; moderation list вимірює фактичну висоту карток після render.

Стани

  • Перше завантаження Approved використовує global loader; локальна колонка паралельно має власний loading state.
  • Load more не блокує весь екран і не запускається повторно, доки попередній запит не завершено.
  • Moderation використовує global loader і локально переносить запис у цільовий status; окрема success-notification не показується.
  • Помилка upload, редагування, moderation або видалення показує backend message, а за його відсутності — frontend fallback.
  • Закриття upload modal очищає файл, назву, опис і native file input.
  • Окремої inline error-картки немає; після помилки reload попередній успішний список зберігається.

API та realtime

Feature використовує POST endpoint constants із src/utils/mediaGallery.js:

  • MEDIA_GALLERY_GET_MEDIA/media-gallery/getMedia;
  • MEDIA_GALLERY_CREATE_MEDIA/media-gallery/createMedia;
  • MEDIA_GALLERY_DELETE_MEDIA/media-gallery/deleteMedia;
  • MEDIA_GALLERY_UPDATE_STATUS/media-gallery/updateStatus;
  • MEDIA_GALLERY_UPDATE_INFO/media-gallery/updateInfo.

Socket events або listeners у src/features/hiring_media_library/ відсутні.

Зв’язки

  • Спільна поведінка media: media-renderer.
  • Реєстр Swagger UI: swagger.
  • Frontend endpoint constants: src/utils/mediaGallery.js.
  • TODO: додати перевірені operation deeplink-и для list, upload, delete, moderation та metadata update.