From 56bdcc03518ea50dde89bd2a32d439f2026e0f2f Mon Sep 17 00:00:00 2001 From: Kirill Date: Fri, 15 May 2026 20:21:29 +0500 Subject: [PATCH] feat: update OptimizedImage for WebP originals and add getOriginalWebpUrl --- client/src/shared/ui/OptimizedImage.tsx | 8 ++++++++ .../ui/__tests__/OptimizedImage.test.tsx | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/client/src/shared/ui/OptimizedImage.tsx b/client/src/shared/ui/OptimizedImage.tsx index 85da53a..8f2b708 100644 --- a/client/src/shared/ui/OptimizedImage.tsx +++ b/client/src/shared/ui/OptimizedImage.tsx @@ -35,6 +35,14 @@ function buildFallbackSrc(src: string, width: number): string { return `/uploads-resized/${pathPrefix}${parsed.uuid}.webp?w=${width}` } +/** Get the original WebP URL for full-screen display (no resize) */ +export function getOriginalWebpUrl(src: string): string { + const parsed = parseUploadUrl(src) + if (!parsed) return src + const pathPrefix = parsed.subdir ? `${parsed.subdir}/` : '' + return `/uploads/${pathPrefix}${parsed.uuid}.webp` +} + export function OptimizedImage({ src, alt, diff --git a/client/src/shared/ui/__tests__/OptimizedImage.test.tsx b/client/src/shared/ui/__tests__/OptimizedImage.test.tsx index 12eeac8..6ff8cdd 100644 --- a/client/src/shared/ui/__tests__/OptimizedImage.test.tsx +++ b/client/src/shared/ui/__tests__/OptimizedImage.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react' import { describe, it, expect } from 'vitest' -import { OptimizedImage } from '@/shared/ui/OptimizedImage' +import { OptimizedImage, getOriginalWebpUrl } from '@/shared/ui/OptimizedImage' describe('OptimizedImage', () => { it('renders a plain img for non-upload URLs', () => { @@ -52,3 +52,19 @@ describe('OptimizedImage', () => { expect(srcSet).not.toContain('?w=1024') }) }) + +describe('getOriginalWebpUrl', () => { + it('returns original WebP URL for upload URLs', () => { + expect(getOriginalWebpUrl('/uploads/abc123.png')).toBe('/uploads/abc123.webp') + expect(getOriginalWebpUrl('/uploads/abc123.webp')).toBe('/uploads/abc123.webp') + expect(getOriginalWebpUrl('/uploads/abc123.jpeg')).toBe('/uploads/abc123.webp') + }) + + it('handles review subdir correctly', () => { + expect(getOriginalWebpUrl('/uploads/reviews/def456.jpg')).toBe('/uploads/reviews/def456.webp') + }) + + it('returns original src for non-upload URLs', () => { + expect(getOriginalWebpUrl('https://example.com/photo.jpg')).toBe('https://example.com/photo.jpg') + }) +})