|
import Image, { ImageProps } from 'next/image'; |
|
import * as React from 'react'; |
|
|
|
import { cn } from '@/lib/utils'; |
|
|
|
type NextImageProps = { |
|
useSkeleton?: boolean; |
|
classNames?: { |
|
image?: string; |
|
blur?: string; |
|
}; |
|
alt: string; |
|
} & ( |
|
| { width: string | number; height: string | number } |
|
| { layout: 'fill'; width?: string | number; height?: string | number } |
|
) & |
|
ImageProps; |
|
|
|
|
|
|
|
|
|
|
|
|
|
export default function NextImage({ |
|
useSkeleton = false, |
|
src, |
|
width, |
|
height, |
|
alt, |
|
className, |
|
classNames, |
|
...rest |
|
}: NextImageProps) { |
|
const [status, setStatus] = React.useState( |
|
useSkeleton ? 'loading' : 'complete' |
|
); |
|
const widthIsSet = className?.includes('w-') ?? false; |
|
|
|
return ( |
|
<figure |
|
style={!widthIsSet ? { width: `${width}px` } : undefined} |
|
className={className} |
|
> |
|
<Image |
|
className={cn( |
|
classNames?.image, |
|
status === 'loading' && cn('animate-pulse', classNames?.blur) |
|
)} |
|
src={src} |
|
width={width} |
|
height={height} |
|
alt={alt} |
|
onLoadingComplete={() => setStatus('complete')} |
|
{...rest} |
|
/> |
|
</figure> |
|
); |
|
} |
|
|