Add a sticky sidebar ad to fill empty space on the homepage
Integrates a new `SidebarAd` component into the homepage layout, making it sticky and ensuring ad containers collapse when ads fail to load. Updates `AdSense` component to track ad loading status. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 517dfa7b-26ac-463d-a6e1-a58c6df97188 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 3321a963-9238-411a-b2fa-c960a9f73030 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/517dfa7b-26ac-463d-a6e1-a58c6df97188/ls5p9ni Replit-Helium-Checkpoint-Created: true
This commit is contained in:
parent
660072dcf6
commit
3d7bfec657
BIN
attached_assets/image_1772358704998.png
Normal file
BIN
attached_assets/image_1772358704998.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 852 KiB |
@ -1,4 +1,4 @@
|
||||
import { useEffect, useRef } from "react";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
|
||||
type AdFormat = "auto" | "fluid" | "rectangle" | "horizontal" | "vertical" | "autorelaxed";
|
||||
|
||||
@ -23,6 +23,7 @@ export default function AdSense({
|
||||
}: AdSenseProps) {
|
||||
const adRef = useRef<HTMLModElement>(null);
|
||||
const pushed = useRef(false);
|
||||
const [adLoaded, setAdLoaded] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (pushed.current) return;
|
||||
@ -32,6 +33,18 @@ export default function AdSense({
|
||||
pushed.current = true;
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
const timer = setTimeout(() => {
|
||||
if (adRef.current) {
|
||||
const ins = adRef.current;
|
||||
const filled = ins.getAttribute("data-ad-status") === "filled" ||
|
||||
ins.children.length > 0 ||
|
||||
ins.clientHeight > 0;
|
||||
setAdLoaded(filled);
|
||||
}
|
||||
}, 3000);
|
||||
|
||||
return () => clearTimeout(timer);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
@ -92,11 +105,13 @@ export function MultiplexAd() {
|
||||
|
||||
export function SidebarAd() {
|
||||
return (
|
||||
<div className="bg-card rounded-md border border-card-border p-4 mt-6">
|
||||
<AdSense
|
||||
slot="2398082838"
|
||||
format="auto"
|
||||
/>
|
||||
<div className="sticky top-4">
|
||||
<div className="bg-card rounded-md border border-card-border p-4 mt-4">
|
||||
<AdSense
|
||||
slot="2398082838"
|
||||
format="auto"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@ import { Eye, Play, Images } from "lucide-react";
|
||||
import { Skeleton } from "@/components/ui/skeleton";
|
||||
import Header from "@/components/header";
|
||||
import Footer from "@/components/footer";
|
||||
import AdSense, { ArticleCardAd, MultiplexAd } from "@/components/adsense";
|
||||
import AdSense, { ArticleCardAd, MultiplexAd, SidebarAd } from "@/components/adsense";
|
||||
import { PhotoGalleryWidget } from "@/components/photo-gallery";
|
||||
import { HoroscopeWidget } from "@/components/horoscope-widget";
|
||||
import { RecipeWidget } from "@/components/recipe-widget";
|
||||
@ -573,6 +573,7 @@ export default function Home() {
|
||||
</div>
|
||||
<div className="lg:col-span-1">
|
||||
{popular && popular.length > 0 && <TopStoriesList articles={popular} />}
|
||||
<SidebarAd />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user