@@ -148,7 +148,7 @@ export const PreviewMediaContent: FC<{
148
148
) : (
149
149
< FallbackableImage
150
150
fallbackUrl = { media [ 0 ] . fallbackUrl }
151
- className = "size-full object-contain"
151
+ className = "h-auto w-fit object-contain"
152
152
alt = "cover"
153
153
src = { src }
154
154
onContextMenu = { ( e ) => handleContextMenu ( src , e ) }
@@ -270,44 +270,55 @@ const FallbackableImage: FC<
270
270
const [ currentSrc , setCurrentSrc ] = useState ( ( ) => replaceImgUrlIfNeed ( src ) )
271
271
const [ isAllError , setIsAllError ] = useState ( false )
272
272
273
+ const [ isLoading , setIsLoading ] = useState ( true )
274
+
273
275
const [ currentState , setCurrentState ] = useState <
274
276
"proxy" | "origin" | "fallback"
275
277
> ( ( ) => ( currentSrc === src ? "origin" : "proxy" ) )
276
278
277
- const handleError = useCallback (
278
- ( ) => {
279
- switch ( currentState ) {
280
- case "proxy" : {
281
- if ( currentSrc !== src ) {
282
- setCurrentSrc ( src )
283
- setCurrentState ( "origin" )
284
- } else {
285
- if ( fallbackUrl ) {
286
- setCurrentSrc ( fallbackUrl )
287
- setCurrentState ( "fallback" )
288
- }
289
- }
290
-
291
- break
292
- }
293
- case "origin" : {
279
+ const handleError = useCallback ( ( ) => {
280
+ switch ( currentState ) {
281
+ case "proxy" : {
282
+ if ( currentSrc !== src ) {
283
+ setCurrentSrc ( src )
284
+ setCurrentState ( "origin" )
285
+ } else {
294
286
if ( fallbackUrl ) {
295
287
setCurrentSrc ( fallbackUrl )
296
288
setCurrentState ( "fallback" )
297
289
}
298
- break
299
290
}
300
- case "fallback" : {
301
- setIsAllError ( true )
291
+
292
+ break
293
+ }
294
+ case "origin" : {
295
+ if ( fallbackUrl ) {
296
+ setCurrentSrc ( fallbackUrl )
297
+ setCurrentState ( "fallback" )
302
298
}
299
+ break
303
300
}
304
- } ,
305
- [ currentSrc , currentState , fallbackUrl , src ] ,
306
- )
301
+ case "fallback" : {
302
+ setIsAllError ( true )
303
+ }
304
+ }
305
+ } , [ currentSrc , currentState , fallbackUrl , src ] )
307
306
308
307
return (
309
- < Fragment >
310
- { ! isAllError && < img src = { currentSrc } onError = { handleError } { ...props } /> }
308
+ < div className = "flex flex-col" >
309
+ { isLoading && ! isAllError && (
310
+ < div className = "center absolute size-full" >
311
+ < i className = "i-mgc-loading-3-cute-re size-8 animate-spin text-white/80" />
312
+ </ div >
313
+ ) }
314
+ { ! isAllError && (
315
+ < img
316
+ src = { currentSrc }
317
+ onLoad = { ( ) => setIsLoading ( false ) }
318
+ onError = { handleError }
319
+ { ...props }
320
+ />
321
+ ) }
311
322
{ isAllError && (
312
323
< div
313
324
className = "center flex-col gap-6 text-white/80"
@@ -327,7 +338,7 @@ const FallbackableImage: FC<
327
338
>
328
339
Retry
329
340
</ MotionButtonBase >
330
- Or
341
+ or
331
342
< a
332
343
className = "underline underline-offset-4"
333
344
href = { src }
@@ -339,6 +350,25 @@ const FallbackableImage: FC<
339
350
</ div >
340
351
</ div >
341
352
) }
342
- </ Fragment >
353
+
354
+ { currentState === "fallback" && (
355
+ < div className = "mt-4 text-xs" >
356
+ < span >
357
+ This image is preview in low quality, because the original image is
358
+ not available.
359
+ </ span >
360
+ < br />
361
+ < span >
362
+ You can
363
+ { " " }
364
+ < a href = { src } target = "_blank" rel = "noreferrer" className = "underline duration-200 hover:text-accent" >
365
+ visit the original image
366
+ </ a >
367
+ { " " }
368
+ if you want to see the full quality.
369
+ </ span >
370
+ </ div >
371
+ ) }
372
+ </ div >
343
373
)
344
374
}
0 commit comments