diff --git a/app/about/page.tsx b/app/about/page.tsx
index 7e729f1..0eb4d52 100644
--- a/app/about/page.tsx
+++ b/app/about/page.tsx
@@ -1,22 +1,14 @@
"use client";
-import { useSiteConfig, useMonetizationConfig } from "@/hooks/useRuntimeConfig";
+import { useSiteConfig, useMonetizationConfig, usePIPConfig } from "@/hooks/useRuntimeConfig";
import AdFrame from "@/components/ui/AdFrame";
-import { usePIPConfig } from "@/hooks/useRuntimeConfig";
+import VideoAdPlayer from "@/components/ui/VideoAdPlayer";
import { Play, Code2, Coffee, Lightbulb } from "lucide-react";
-import { useMemo } from "react";
export default function AboutPage() {
const SITE = useSiteConfig();
const MONETIZATION = useMonetizationConfig();
const pip = usePIPConfig();
- const videoId = useMemo(() => {
- const url = pip.videoUrl;
- if (!url) return null;
- const patterns = [/(?:youtube\.com\/watch\?v=)([\w-]+)/, /(?:youtu\.be\/)([\w-]+)/, /(?:youtube\.com\/embed\/)([\w-]+)/];
- for (const p of patterns) { const m = url.match(p); if (m) return m[1]; }
- return null;
- }, [pip.videoUrl]);
return (
<>
@@ -64,10 +56,14 @@ export default function AboutPage() {
- {videoId && (
+ {pip.videoUrl && (
)}
diff --git a/app/docs/page.tsx b/app/docs/page.tsx
index 9df59b5..e808e32 100644
--- a/app/docs/page.tsx
+++ b/app/docs/page.tsx
@@ -1,24 +1,15 @@
"use client";
-import { useContentConfig, useSiteConfig } from "@/hooks/useRuntimeConfig";
+import { useContentConfig, useSiteConfig, usePIPConfig } from "@/hooks/useRuntimeConfig";
import Link from "next/link";
import { FileCode, Settings, HardDrive, Wrench, Shield, Code2, BookOpen, AlertTriangle, FileText } from "lucide-react";
import AdFrame from "@/components/ui/AdFrame";
-import { usePIPConfig } from "@/hooks/useRuntimeConfig";
-import { useMemo } from "react";
+import VideoAdPlayer from "@/components/ui/VideoAdPlayer";
export default function DocsPage() {
const CONTENT = useContentConfig();
const SITE = useSiteConfig();
-
const pip = usePIPConfig();
- const videoId = useMemo(() => {
- const url = pip.videoUrl;
- if (!url) return null;
- const patterns = [/(?:youtube\.com\/watch\?v=)([\w-]+)/, /(?:youtu\.be\/)([\w-]+)/, /(?:youtube\.com\/embed\/)([\w-]+)/];
- for (const p of patterns) { const m = url.match(p); if (m) return m[1]; }
- return null;
- }, [pip.videoUrl]);
return (
<>
@@ -48,12 +39,16 @@ export default function DocsPage() {
- {videoId && (
+ {pip.videoUrl && (
diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx
index 9f52be2..9b9903c 100644
--- a/app/downloads/page.tsx
+++ b/app/downloads/page.tsx
@@ -1,26 +1,17 @@
"use client";
-import { useSiteConfig, useDownloadUrls, useMonetizationConfig, useContentConfig } from "@/hooks/useRuntimeConfig";
+import { useSiteConfig, useDownloadUrls, useMonetizationConfig, useContentConfig, usePIPConfig } from "@/hooks/useRuntimeConfig";
import { Download, Shield, Zap, Coffee } from "lucide-react";
import Link from "next/link";
import AdFrame from "@/components/ui/AdFrame";
-import { usePIPConfig } from "@/hooks/useRuntimeConfig";
-import { useMemo } from "react";
+import VideoAdPlayer from "@/components/ui/VideoAdPlayer";
export default function DownloadsPage() {
const SITE = useSiteConfig();
const CONTENT = useContentConfig();
const downloads = useDownloadUrls();
const MONETIZATION = useMonetizationConfig();
-
const pip = usePIPConfig();
- const videoId = useMemo(() => {
- const url = pip.videoUrl;
- if (!url) return null;
- const patterns = [/(?:youtube\.com\/watch\?v=)([\w-]+)/, /(?:youtu\.be\/)([\w-]+)/, /(?:youtube\.com\/embed\/)([\w-]+)/];
- for (const p of patterns) { const m = url.match(p); if (m) return m[1]; }
- return null;
- }, [pip.videoUrl]);
return (
<>
@@ -141,12 +132,16 @@ export default function DownloadsPage() {
- {videoId && (
+ {pip.videoUrl && (
diff --git a/app/features/page.tsx b/app/features/page.tsx
index 7adb260..961fd96 100644
--- a/app/features/page.tsx
+++ b/app/features/page.tsx
@@ -1,14 +1,13 @@
"use client";
-import { useContentConfig } from "@/hooks/useRuntimeConfig";
+import { useContentConfig, usePIPConfig } from "@/hooks/useRuntimeConfig";
import Link from "next/link";
import {
Cpu, Settings2, Zap, Store, Download, Wrench, Activity, RefreshCw,
FolderOpen, Shield, Package, Terminal, Search, HardDrive, CheckCircle2,
} from "lucide-react";
import AdFrame from "@/components/ui/AdFrame";
-import { usePIPConfig } from "@/hooks/useRuntimeConfig";
-import { useMemo } from "react";
+import VideoAdPlayer from "@/components/ui/VideoAdPlayer";
const iconMap: Record = {
Cpu, Settings2, Zap, Store, Download, Wrench, Activity, RefreshCw,
@@ -27,13 +26,6 @@ const categories = [
export default function FeaturesPage() {
const CONTENT = useContentConfig();
const pip = usePIPConfig();
- const videoId = useMemo(() => {
- const url = pip.videoUrl;
- if (!url) return null;
- const patterns = [/(?:youtube\.com\/watch\?v=)([\w-]+)/, /(?:youtu\.be\/)([\w-]+)/, /(?:youtube\.com\/embed\/)([\w-]+)/];
- for (const p of patterns) { const m = url.match(p); if (m) return m[1]; }
- return null;
- }, [pip.videoUrl]);
return (
<>
@@ -88,12 +80,16 @@ export default function FeaturesPage() {
{/* Video */}
- {videoId && (
+ {pip.videoUrl && (
diff --git a/app/gallery/page.tsx b/app/gallery/page.tsx
index b16f7f0..54e1eb3 100644
--- a/app/gallery/page.tsx
+++ b/app/gallery/page.tsx
@@ -1,10 +1,11 @@
"use client";
import { useState, useEffect, useCallback } from "react";
-import { useContentConfig, useSiteConfig } from "@/hooks/useRuntimeConfig";
+import { useContentConfig, useSiteConfig, usePIPConfig } from "@/hooks/useRuntimeConfig";
import { X, ChevronLeft, ChevronRight, ZoomIn, ZoomOut } from "lucide-react";
import { motion, AnimatePresence } from "framer-motion";
import AdFrame from "@/components/ui/AdFrame";
+import VideoAdPlayer from "@/components/ui/VideoAdPlayer";
interface GalleryImage {
src: string;
@@ -17,6 +18,7 @@ const categories = ["All", "Welcome", "System", "Install", "PlayStore", "Brandin
export default function GalleryPage() {
const CONTENT = useContentConfig();
const SITE = useSiteConfig();
+ const pip = usePIPConfig();
const [images, setImages] = useState([]);
const [loading, setLoading] = useState(true);
const [activeCategory, setActiveCategory] = useState("All");
@@ -80,12 +82,10 @@ export default function GalleryPage() {
diff --git a/app/layout.tsx b/app/layout.tsx
index 0362b81..8529905 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -9,6 +9,7 @@ import ScrollProgress from "@/components/ui/ScrollProgress";
import PIPVideoPlayer from "@/components/ui/PIPVideoPlayer";
import FooterAd from "@/components/ui/FooterAd";
import Footer from "@/components/sections/Footer";
+import NavigationAdController from "@/components/ui/NavigationAdController";
import "./globals.css";
const outfit = Outfit({
@@ -87,6 +88,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
+