From ba41dd2b0f1b07c2395bd3d64cc28c2df757e977 Mon Sep 17 00:00:00 2001 From: lizerk Date: Mon, 13 Apr 2026 13:19:54 +0300 Subject: [PATCH] refactor(frontend): remove requests image warnings --- .../guides/frontend/06-COMPONENT-INVENTORY.md | 2 + docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md | 2 +- .../RequestAttachmentPreviewModal.tsx | 26 ++++++---- .../src/components/requests/RequestAvatar.tsx | 48 +++++++++++++++++++ .../components/requests/RequestListItem.tsx | 25 +++++----- .../components/requests/RequestUserBadge.tsx | 21 ++++---- 6 files changed, 89 insertions(+), 35 deletions(-) create mode 100644 frontend/src/components/requests/RequestAvatar.tsx diff --git a/docs/guides/frontend/06-COMPONENT-INVENTORY.md b/docs/guides/frontend/06-COMPONENT-INVENTORY.md index 5c6a6c3b..b2978e16 100644 --- a/docs/guides/frontend/06-COMPONENT-INVENTORY.md +++ b/docs/guides/frontend/06-COMPONENT-INVENTORY.md @@ -162,6 +162,7 @@ Файлы: - `requests/RequestAttachmentPreviewModal.tsx` +- `requests/RequestAvatar.tsx` - `requests/RequestComposeModal.tsx` - `requests/RequestDetailModal.tsx` - `requests/RequestListControls.tsx` @@ -183,6 +184,7 @@ - feature container для list shell, который собирает rows + empty state + load more - отдельный mode-panel для alternate flow вроде swipe-review - attachment preview modal как отдельный feature block, а не хвост page-level JSX +- локальный avatar/media wrapper вокруг `next/image`, когда feature уже использует несколько однотипных аватаров и preview - participant badge pattern для request-like доменов - participant-only UI decisions - conditional action rendering по данным API diff --git a/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md b/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md index 7774968a..af519c0b 100644 --- a/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md +++ b/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md @@ -13,7 +13,7 @@ | Зона | Статус | Что уже хорошо | Основные проблемы | Рекомендуемый следующий шаг | | --- | --- | --- | --- | --- | -| `requests` | `mixed` | compose-настроение, participant-only логика, UI вокруг `can_decide`, compose/list/detail/controls/preview разведены по feature components, screen orchestration вынесена в hook, list/swipe flow собраны в feature containers, dense row приведён к явной anatomy с отдельными detail/comments panels | visual debt сузился, но ещё остаются image warnings и контракт controls block | использовать как референс для разделения orchestration/UI, participant-heavy request flows и anatomy плотной строки, затем добить image/controls cleanup | +| `requests` | `mixed` | compose-настроение, participant-only логика, UI вокруг `can_decide`, compose/list/detail/controls/preview разведены по feature components, screen orchestration вынесена в hook, list/swipe flow собраны в feature containers, dense row приведён к явной anatomy с отдельными detail/comments panels, avatar/preview media contract выровнен через local wrapper | основная незавершённость теперь в контракте controls block | использовать как референс для разделения orchestration/UI, participant-heavy request flows, anatomy плотной строки и локального media-wrapper паттерна, затем добить controls cleanup | | `settings` | `mixed` | сильная surface hierarchy, хорошие primary sections | встречаются custom radii и локальная геометрическая неоднородность | рефакторить карточки и кастомные радиусы без смены общего layout | | `documents` | `needs refactor` | богатый набор сценариев, detail/upload/comment patterns уже выделены в компоненты | смешение `rounded-md`, `rounded-lg`, `rounded-xl`, разные уровни visual density | сделать отдельный pass по карточкам и metadata/upload flows | | `equipment` | `needs refactor` | понятные формы и вторичные блоки | много локальных card/form решений, геометрия плавает | после `documents` пройтись по secondary cards и action forms | diff --git a/frontend/src/components/requests/RequestAttachmentPreviewModal.tsx b/frontend/src/components/requests/RequestAttachmentPreviewModal.tsx index 373fd1a5..bedba636 100644 --- a/frontend/src/components/requests/RequestAttachmentPreviewModal.tsx +++ b/frontend/src/components/requests/RequestAttachmentPreviewModal.tsx @@ -1,5 +1,7 @@ +import Image from "next/image"; import { Modal } from "@/components/ui"; import type { RequestAttachmentPreview } from "@/hooks/useRequestsPage"; +import { resolveMediaUrl } from "@/lib/url"; import { FileSignature } from "lucide-react"; type RequestAttachmentPreviewModalProps = { @@ -14,6 +16,7 @@ export function RequestAttachmentPreviewModal({ if (!preview) return null; const extension = preview.url.split(".").pop()?.toLowerCase() || ""; + const previewUrl = resolveMediaUrl(preview.url); return ( @@ -33,21 +36,26 @@ export function RequestAttachmentPreviewModal({ >
{["jpg", "jpeg", "png", "gif", "webp", "svg", "bmp"].includes(extension) ? ( - {preview.name} +
+ {preview.name} +
) : ["mp4", "webm", "ogg", "mov"].includes(extension) ? ( -