import React, { useState, useRef, useMemo } from 'react'; import { LazyLoadImage } from 'react-lazy-load-image-component'; import * as Dialog from '@radix-ui/react-dialog'; import DialogImage from './DialogImage'; import { cn } from '~/utils'; const scaleImage = ({ originalWidth, originalHeight, containerRef, }: { originalWidth: number; originalHeight: number; containerRef: React.RefObject; }) => { const containerWidth = containerRef.current?.offsetWidth ?? 0; if (containerWidth === 0 || originalWidth === undefined || originalHeight === undefined) { return { width: 'auto', height: 'auto' }; } const aspectRatio = originalWidth / originalHeight; const scaledWidth = Math.min(containerWidth, originalWidth); const scaledHeight = scaledWidth / aspectRatio; return { width: `${scaledWidth}px`, height: `${scaledHeight}px` }; }; const Image = ({ imagePath, altText, height, width, placeholderDimensions, }: { imagePath: string; altText: string; height: number; width: number; placeholderDimensions?: { height: string; width: string; }; }) => { const [isLoaded, setIsLoaded] = useState(false); const containerRef = useRef(null); const handleImageLoad = () => setIsLoaded(true); const { width: scaledWidth, height: scaledHeight } = useMemo( () => scaleImage({ originalWidth: Number(placeholderDimensions?.width?.split('px')[0]) ?? width, originalHeight: Number(placeholderDimensions?.height?.split('px')[0]) ?? height, containerRef, }), [placeholderDimensions, height, width], ); return (
{isLoaded && }
); }; export default Image;