webapp/src/components/_shared/Image/Image.tsx
2024-05-07 18:17:31 +03:00

31 lines
813 B
TypeScript

import type { JSX } from 'solid-js'
import { splitProps } from 'solid-js'
import { Link } from '../../../context/meta'
import { getImageUrl } from '../../../utils/getImageUrl'
type Props = JSX.ImgHTMLAttributes<HTMLImageElement> & {
width: number
alt: string
}
export const Image = (props: Props) => {
const [local, others] = splitProps(props, ['src', 'alt'])
const imageUrl = getImageUrl(local.src, { width: others.width })
const imageSrcSet = [1, 2, 3]
.map(
(pixelDensity) =>
`${getImageUrl(local.src, { width: others.width * pixelDensity })} ${pixelDensity}x`,
)
.join(', ')
return (
<>
<Link rel="preload" as="image" imagesrcset={imageSrcSet} href={imageUrl} />
<img src={imageUrl} alt={local.alt} srcSet={imageSrcSet} {...others} />
</>
)
}