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 == null || originalHeight == null) { 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, className, }: { imagePath: string; altText: string; height: number; width: number; placeholderDimensions?: { height?: string; width?: string; }; className?: 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;