import { useEffect, useRef } from 'react'; interface AdSenseAdProps { adSlot: string; adFormat?: 'auto' | 'rectangle' | 'vertical' | 'horizontal'; width?: number; height?: number; mobileWidth?: number; mobileHeight?: number; className?: string; lazy?: boolean; } export default function AdSenseAd({ adSlot, adFormat = 'auto', width, height, mobileWidth, mobileHeight, className = '', lazy = false }: AdSenseAdProps) { const adRef = useRef(null); useEffect(() => { const initializeAd = () => { const insElement = adRef.current?.querySelector('ins'); if (!insElement || insElement.dataset.adsbygoogleStatus === 'done') return; try { // @ts-ignore (window.adsbygoogle = window.adsbygoogle || []).push({}); } catch (error) { console.error('AdSense initialization error:', error); } }; if (lazy) { // Lazy load with IntersectionObserver const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { initializeAd(); observer.disconnect(); } }); }, { threshold: 0.1 } ); if (adRef.current) { observer.observe(adRef.current); } return () => observer.disconnect(); } else { // Immediate initialization initializeAd(); } }, [adSlot, lazy]); // Responsive configuration const hasResponsiveSizes = (width && height) || (mobileWidth && mobileHeight); if (hasResponsiveSizes) { // Responsive ads with different sizes for desktop/mobile return (
{/* Desktop ad */} {/* Mobile ad */}
); } // Standard configuration (non-responsive) const isFixedSize = width && height; const adStyle: React.CSSProperties = { display: 'inline-block' }; if (isFixedSize) { adStyle.width = `${width}px`; adStyle.height = `${height}px`; } else { adStyle.width = '100%'; adStyle.height = '90px'; } return (
); }