"use client"; import Image from "next/image"; import { useState } from "react"; import { shimmer, toBase64 } from "@/utils/globals"; interface OptimizedImageProps { src: string; alt: string; width?: number; height?: number; className?: string; priority?: boolean; sizes?: string; fill?: boolean; quality?: number; placeholder?: "blur" | "empty"; blurDataURL?: string; } const OptimizedImage: React.FC = ({ src, alt, width = 800, height = 600, className = "", priority = false, sizes = "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw", fill = false, quality = 75, placeholder = "blur", blurDataURL, }) => { const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(false); const handleLoad = () => { setIsLoading(false); }; const handleError = () => { setError(true); setIsLoading(false); }; // Generate blur data URL if not provided const defaultBlurDataURL = blurDataURL || `data:image/svg+xml;base64,${toBase64(shimmer(width, height))}`; if (error) { return (
Image failed to load
); } return (
{isLoading && (
)} {alt}
); }; export default OptimizedImage;