@@ -5,14 +5,12 @@ import { Hourglass, ImageMinus, ImageOff } from 'lucide-react';
55import { ImageLoadingSkeleton } from '../../_components/image-loading-skeleton' ;
66
77export function GalleryPreviewPanel ( {
8- contentType,
98 previewUrl,
109 priority = false ,
1110 prompt,
1211 ratio,
1312 status,
1413} : {
15- contentType ?: string | null ;
1614 previewUrl : string | null ;
1715 priority ?: boolean ;
1816 prompt : string ;
@@ -28,7 +26,6 @@ export function GalleryPreviewPanel({
2826 const imageUnavailable = Boolean (
2927 previewUrl && unavailablePreviewUrl === previewUrl ,
3028 ) ;
31- const isVideoPreview = contentType ?. startsWith ( 'video/' ) ?? false ;
3229 const showPreview = Boolean ( previewUrl && ! imageUnavailable ) ;
3330 const showLoadingPreview = showPreview && ! imageLoaded ;
3431 const handlePreviewImageRef = useCallback (
@@ -56,57 +53,33 @@ export function GalleryPreviewPanel({
5653 href = { previewUrl }
5754 target = "_blank"
5855 rel = "noreferrer noopener"
59- aria-label = {
60- isVideoPreview ? 'Open generated video' : 'Open generated image'
61- }
56+ aria-label = "Open generated image"
6257 aria-busy = { showLoadingPreview }
6358 className = "group relative mt-4 block aspect-[4/3] overflow-hidden rounded-2xl border border-white/10 bg-slate-950"
6459 >
6560 { showLoadingPreview ? < ImageLoadingSkeleton /> : null }
66- { isVideoPreview ? (
67- < video
68- src = { previewUrl }
69- muted
70- playsInline
71- preload = "metadata"
72- className = { `absolute inset-0 size-full bg-black object-contain transition duration-500 ${
73- imageLoaded ? 'opacity-100' : 'opacity-0'
74- } `}
75- onCanPlay = { ( ) => {
76- setLoadedPreviewUrl ( previewUrl ) ;
77- setUnavailablePreviewUrl ( ( currentPreviewUrl ) =>
78- currentPreviewUrl === previewUrl ? null : currentPreviewUrl ,
79- ) ;
80- } }
81- onError = { ( ) => {
82- setLoadedPreviewUrl ( null ) ;
83- setUnavailablePreviewUrl ( previewUrl ) ;
84- } }
85- />
86- ) : (
87- < img
88- ref = { handlePreviewImageRef }
89- src = { previewUrl }
90- alt = { `Generated image for: ${ prompt } ` }
91- className = { `absolute inset-0 size-full object-cover transition duration-500 group-hover:scale-[1.02] ${
92- imageLoaded ? 'opacity-100' : 'opacity-0'
93- } `}
94- decoding = "async"
95- fetchPriority = { priority ? 'high' : 'auto' }
96- loading = { priority ? 'eager' : 'lazy' }
97- onLoad = { ( ) => {
98- setLoadedPreviewUrl ( previewUrl ) ;
99- setUnavailablePreviewUrl ( ( currentPreviewUrl ) =>
100- currentPreviewUrl === previewUrl ? null : currentPreviewUrl ,
101- ) ;
102- } }
103- onError = { ( ) => {
104- setLoadedPreviewUrl ( null ) ;
105- setUnavailablePreviewUrl ( previewUrl ) ;
106- } }
107- sizes = "(min-width: 1280px) 25vw, (min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw"
108- />
109- ) }
61+ < img
62+ ref = { handlePreviewImageRef }
63+ src = { previewUrl }
64+ alt = { `Generated image for: ${ prompt } ` }
65+ className = { `absolute inset-0 size-full object-cover transition duration-500 group-hover:scale-[1.02] ${
66+ imageLoaded ? 'opacity-100' : 'opacity-0'
67+ } `}
68+ decoding = "async"
69+ fetchPriority = { priority ? 'high' : 'auto' }
70+ loading = { priority ? 'eager' : 'lazy' }
71+ onLoad = { ( ) => {
72+ setLoadedPreviewUrl ( previewUrl ) ;
73+ setUnavailablePreviewUrl ( ( currentPreviewUrl ) =>
74+ currentPreviewUrl === previewUrl ? null : currentPreviewUrl ,
75+ ) ;
76+ } }
77+ onError = { ( ) => {
78+ setLoadedPreviewUrl ( null ) ;
79+ setUnavailablePreviewUrl ( previewUrl ) ;
80+ } }
81+ sizes = "(min-width: 1280px) 25vw, (min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw"
82+ />
11083 < RatioOverlay ratio = { ratio } />
11184 </ a >
11285 ) ;
0 commit comments