import { useEffect, useMemo, useRef, useState } from "react"; import ArtistPatternBg from "./artist-pattern-bg"; type AdFormat = "auto" | "fluid" | "rectangle" | "horizontal" | "vertical" | "autorelaxed"; interface AdSenseProps { slot: string; format?: AdFormat; responsive?: boolean; className?: string; style?: Record; layout?: string; layoutKey?: string; onAdStatus?: (filled: boolean) => void; } export default function AdSense({ slot, format = "auto", responsive = true, className = "", style, layout, layoutKey, onAdStatus, }: AdSenseProps) { const adRef = useRef(null); const pushed = useRef(false); useEffect(() => { if (pushed.current) return; try { const adsbygoogle = (window as any).adsbygoogle || []; adsbygoogle.push({}); pushed.current = true; } catch (e) { } if (!onAdStatus) return; const ins = adRef.current; if (!ins) return; // Google postavi data-ad-status na "filled", "unfilled" ali "unfill-optimized". // Ce statusa ni, se zanesemo na dejansko visino. Odlocimo se enkrat. let decided = false; const decide = (filled: boolean) => { if (decided) return; decided = true; obs.disconnect(); clearTimeout(timer); onAdStatus(filled); }; // Visina samega ni dokaz - nekatere enote imajo rezerviran prostor. // Napolnjen oglas ima notri okvir (iframe) z dejansko visino. const hasFrame = () => { const f = ins.querySelector("iframe"); return !!f && (f as HTMLIFrameElement).clientHeight > 10; }; const check = () => { const st = ins.getAttribute("data-ad-status") || ""; if (st === "filled") return decide(true); if (st.startsWith("unfill")) return decide(false); if (hasFrame()) return decide(true); }; const obs = new MutationObserver(check); obs.observe(ins, { attributes: true, childList: true, subtree: true, attributeFilter: ["data-ad-status", "style"] }); const timer = setTimeout(() => decide(hasFrame()), 6000); check(); return () => { obs.disconnect(); clearTimeout(timer); }; }, []); return (
); } let adSeedCounter = 1; export function ArticleCardAd() { const seed = useMemo(() => adSeedCounter++, []); const [filled, setFilled] = useState(null); if (filled === false) return null; return ( ); } export function TopBannerAd() { const [filled, setFilled] = useState(null); if (filled === false) return null; const shown = filled === true; return (
{shown && (
Anzeige
)}
); } export function InArticleAd() { // Prava AdSense In-article enota (fluid + data-ad-layout="in-article"). // Kadar oglasa ni, se okvir in rezerviran prostor ne izriseta. const [filled, setFilled] = useState(null); if (filled === false) return null; const shown = filled === true; return (
{shown && (
Anzeige
)}
); } export function MultiplexAd() { const [filled, setFilled] = useState(null); if (filled === false) return null; const shown = filled === true; return (
); } export function PageSideAds({ contentHalfWidth = 640 }: { contentHalfWidth?: number }) { const gap = 10; const offset = contentHalfWidth + gap; return (
); } export function SidebarAd() { const [visible, setVisible] = useState(false); return (
setVisible(filled)} />
); }