'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { useStore } from '@/lib/store'; import { walletApi, transactionApi, overseerApi } from '@/lib/api'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Wallet, TrendingUp, TrendingDown, Clock, Film, ExternalLink, Plus, History } from 'lucide-react'; import { formatNumber, truncateAddress } from '@/lib/utils'; import { toast } from 'sonner'; import { useSocket } from '@/lib/socket'; import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'; import { TransactionList } from './components/TransactionList'; import { WatchHistory } from './components/WatchHistory'; import { CreateWalletModal } from './components/CreateWalletModal'; import { WelcomeOnboarding } from './components/WelcomeOnboarding'; import { ActivityFeed } from './components/ActivityFeed'; import { SearchRequestModal } from './components/SearchRequestModal'; import { RequestHistory } from './components/RequestHistory'; import { Leaderboard } from './components/Leaderboard'; interface WalletData { hasWallet: boolean; address?: string; balance: number; totalEarned: number; totalSpent: number; explorerUrl?: string; } export default function DashboardPage() { const router = useRouter(); const { user, isAuthenticated, logout } = useStore(); const [wallet, setWallet] = useState(null); const [requestCosts, setRequestCosts] = useState({ movie: 100, tv: 200 }); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [isSearchModalOpen, setIsSearchModalOpen] = useState(false); const [isLoading, setIsLoading] = useState(true); const socket = useSocket(); useEffect(() => { if (!isAuthenticated) { router.push('/login'); return; } loadData(); }, [isAuthenticated, router]); useEffect(() => { if (socket) { socket.on('credits_earned', (data) => { toast.success(`You earned ${data.amount} $COOP!`, { description: `Watched: ${data.title}`, }); loadData(); }); socket.on('bonus_received', (data) => { toast.success(`Bonus Received: ${data.amount} $COOP!`, { description: data.reason, }); loadData(); }); socket.on('credits_spent', (data) => { toast.info(`Requested: ${data.title}`, { description: `Spent ${data.amount} $COOP`, }); loadData(); }); return () => { socket.off('credits_earned'); socket.off('bonus_received'); socket.off('credits_spent'); }; } }, [socket]); const loadData = async () => { try { const [walletRes, costsRes] = await Promise.all([ walletApi.getWallet(), overseerApi.getCosts().catch(() => ({ data: { movie: 100, tv: 200 } })) ]); setWallet(walletRes.data); setRequestCosts(costsRes.data); } catch (error) { toast.error('Failed to load wallet data'); } finally { setIsLoading(false); } }; if (!isAuthenticated || !user) { return null; } return (
{/* Header */}

CoopCredits

{user.plexUsername} {user.isAdmin && ( )}
{/* Onboarding for new users */} {!wallet?.hasWallet && !isLoading && ( setIsCreateModalOpen(true)} onConnected={loadData} /> )} {/* Stats Cards */}
Balance
{wallet ? formatNumber(wallet.balance) : '--'} $COOP

{wallet?.hasWallet ? 'Ready to spend' : 'Create wallet to start'}

Total Earned
{wallet ? formatNumber(wallet.totalEarned) : '--'} $COOP

From watching content

Total Spent
{wallet ? formatNumber(wallet.totalSpent) : '--'} $COOP

On content requests

setIsSearchModalOpen(true)}> Request Cost
{requestCosts.movie} $COOP

Click to request content

{/* Wallet Section removed from here if redundant, or kept if we want it to show after creation */} {wallet?.hasWallet && ( Your Wallet Manage your Solana wallet and $COOP tokens

Address

{truncateAddress(wallet.address!)}

)} {/* Tabs */}
Transactions Watch History My Requests
setIsCreateModalOpen(false)} onCreated={loadData} /> setIsSearchModalOpen(false)} onRequested={loadData} costs={requestCosts} balance={wallet?.balance || 0} />
); }