Files
dark-lord/app/root-layout-client.tsx
drjones e0a4a20862 Tor ops: launch UI, onion list/health scripts, systemd installer, README glow-up
- 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
2026-04-15 22:12:44 -07:00

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 />
</>
)}
</>
);
}