- Replace fake-site footer with dark-web launch CTA; fix HubChatter inside AppProviders (client crash) - Add /launch, DEPLOY.md, onions:list|status|health, list-onion-urls, install-systemd, onion-status - start.sh CYBERLUX_PREPARE_ONLY; copy pass on satellite pages; Navbar launch link - README: operator cheat sheet, phone Tor note, systemd via install-systemd.sh Made-with: Cursor
55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
"use client";
|
|
|
|
import { useState, useEffect, useCallback } from "react";
|
|
import SecretLayer from "@/components/SecretLayer";
|
|
import DDoSProtection from "@/components/DDoSProtection";
|
|
import OnionDisclosureBar from "@/components/OnionDisclosureBar";
|
|
import HubChatterPublicStrip from "@/components/HubChatterPublicStrip";
|
|
import AppProviders from "@/components/AppProviders";
|
|
import DarkWebLaunchFooter from "@/components/DarkWebLaunchFooter";
|
|
|
|
export default function RootLayoutClient({ children }: { children: React.ReactNode }) {
|
|
const [isProtected, setIsProtected] = useState(true);
|
|
|
|
useEffect(() => {
|
|
try {
|
|
const hasSeenDDoS = sessionStorage.getItem("ddos_verified");
|
|
if (hasSeenDDoS) {
|
|
setIsProtected(false);
|
|
}
|
|
} catch {
|
|
// sessionStorage blocked (rare) — still allow progress overlay to complete
|
|
}
|
|
}, []);
|
|
|
|
const handleComplete = useCallback(() => {
|
|
try {
|
|
sessionStorage.setItem("ddos_verified", "true");
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
setIsProtected(false);
|
|
}, []);
|
|
|
|
return (
|
|
<>
|
|
{isProtected ? (
|
|
<DDoSProtection onComplete={handleComplete} />
|
|
) : (
|
|
<>
|
|
<AppProviders>
|
|
<div className="flex min-h-screen flex-col">
|
|
<div className="flex-1">{children}</div>
|
|
<DarkWebLaunchFooter />
|
|
</div>
|
|
{/* Must stay inside AppProviders — uses useAccount() */}
|
|
<HubChatterPublicStrip />
|
|
</AppProviders>
|
|
<SecretLayer />
|
|
<OnionDisclosureBar />
|
|
</>
|
|
)}
|
|
</>
|
|
);
|
|
}
|