"use client"; import { Activity, Coffee, Egg, HardDrive, History, LogOut, RefreshCw, Search, Users, } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { api, authApi, overseerApi, userApi } from "@/lib/api"; import { useStore } from "@/lib/store"; import { formatNumber } from "@/lib/utils"; import { ActivityFeed } from "./components/ActivityFeed"; import { BuyCreditsModal } from "./components/BuyCreditsModal"; import { Leaderboard } from "./components/Leaderboard"; import { RequestHistory } from "./components/RequestHistory"; import { SearchRequestModal } from "./components/SearchRequestModal"; import { WatchHistory } from "./components/WatchHistory"; interface WalletData { balance: number; totalEarned: number; totalSpent: number; } export default function DashboardPage() { const router = useRouter(); const { isAuthenticated, logout } = useStore(); const [wallet, setWallet] = useState(null); const [requestCosts, setRequestCosts] = useState({ movie: 500, tv: 1000, movieAdjusted: 500, tvAdjusted: 1000, scarcityMultiplier: 1, }); const [totalRequests, setTotalRequests] = useState(0); const [diskSpace, setDiskSpace] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSearchModalOpen, setIsSearchModalOpen] = useState(false); const [isBuyModalOpen, setIsBuyModalOpen] = useState(false); const [refreshCount, setRefreshCount] = useState(0); useEffect(() => { if (!isAuthenticated) { router.push("/login"); return; } loadWalletAndPending(); loadCosts(); syncPending(); }, [isAuthenticated, router]); const loadWalletAndPending = async () => { try { const [walletRes, reqRes, diskRes] = await Promise.all([ api.get("/wallet"), userApi.getRequests(1, 100), api.get("/overseer/diskspace"), ]); setWallet(walletRes.data); setTotalRequests(reqRes.data.requests?.length || 0); setDiskSpace(diskRes.data); } catch { toast.error("Chickens escaped! Failed to load."); } finally { setIsLoading(false); } }; const loadCosts = async () => { try { const costsRes = await overseerApi.getCosts(); setRequestCosts(costsRes.data); } catch {} }; const syncPending = async () => { try { await api.post("/overseer/sync-pending"); await loadWalletAndPending(); } catch {} }; const handleLogout = async () => { try { await authApi.logout(); } catch {} logout(); router.push("/login"); }; const handleRefresh = () => { loadWalletAndPending(); loadCosts(); syncPending(); setRefreshCount((c) => c + 1); }; if (isLoading) return (
Sitting on eggs...
); return (
{/* Header */}

THE COOP

Welcome back, farmer.

{/* Nest Stats */}
Your Nest Egg
{formatNumber(wallet?.balance || 0)}{" "} $COOP
🥚
Eggs Ordered
{totalRequests}{" "} Requests
📋
Market Price
{requestCosts.movieAdjusted || requestCosts.movie}{" "} /{" "} {requestCosts.tvAdjusted || requestCosts.tv}
{requestCosts.movie} / {requestCosts.tv}
Movie / TV Series {requestCosts.scarcityMultiplier > 1 && ( (x{requestCosts.scarcityMultiplier}) )}
🌽
{/* Disk Space */} {diskSpace && diskSpace.totalBytes > 0 && (

The Silo

{diskSpace.used} / {diskSpace.total} ({diskSpace.usedPercent}%)
90 ? "hsl(var(--destructive))" : "hsl(var(--primary))", }} />
{diskSpace.scarcityMultiplier > 1 && (

Silo filling up! Prices x{diskSpace.scarcityMultiplier}

)}
)} {/* Main Yard */}
WATCHED REQUESTS PECKING ORDER

Barn Noise

"The early bird gets the 4K stream."

); }