'use client' import { useState, useEffect, useCallback } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' import { Users, Search, ArrowLeft, ChevronDown, ChevronRight, User, DollarSign, Calendar, Expand, Minimize, Download, Eye, Network } from 'lucide-react' import { motion, AnimatePresence } from 'framer-motion' import Link from 'next/link' import { toast } from 'sonner' import { DashboardHeader } from '@/components/dashboard/DashboardHeader' interface TeamMember { id: string name: string email: string joinedAt: string totalEarnings: number directReferrals: number level: number children?: TeamMember[] isExpanded?: boolean isActive?: boolean } interface GenealogyData { user: TeamMember teamSize: number totalVolume: number levels: number } export default function GenealogyPage() { const [genealogyData, setGenealogyData] = useState(null) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState('') const [expandedNodes, setExpandedNodes] = useState>(new Set()) const [viewMode, setViewMode] = useState<'tree' | 'compact'>('tree') const addToAutoExpand = useCallback((node: TeamMember, set: Set, levelsLeft: number) => { if (levelsLeft > 0 && node.children && node.children.length > 0) { set.add(node.id) node.children.forEach(child => addToAutoExpand(child, set, levelsLeft - 1)) } }, []) const fetchGenealogyData = useCallback(async () => { try { const response = await fetch('/api/dashboard/genealogy') if (!response.ok) throw new Error('Failed to fetch genealogy') const data = await response.json() setGenealogyData(data) // Auto-expand first few levels const autoExpand = new Set() addToAutoExpand(data.user, autoExpand, 2) // Expand first 2 levels setExpandedNodes(autoExpand) } catch (error) { console.error('Error fetching genealogy data:', error) toast.error('Failed to load genealogy tree') } finally { setLoading(false) } }, [addToAutoExpand]) useEffect(() => { fetchGenealogyData() }, [fetchGenealogyData]) const toggleNode = (nodeId: string) => { const newExpanded = new Set(expandedNodes) if (newExpanded.has(nodeId)) { newExpanded.delete(nodeId) } else { newExpanded.add(nodeId) } setExpandedNodes(newExpanded) } const expandAll = () => { if (!genealogyData?.user) return const allNodes = new Set() const collectAllNodes = (node: TeamMember) => { if (node.children && node.children.length > 0) { allNodes.add(node.id) node.children.forEach(collectAllNodes) } } collectAllNodes(genealogyData.user) setExpandedNodes(allNodes) } const collapseAll = () => { setExpandedNodes(new Set()) } const renderTreeNode = (member: TeamMember, depth = 0) => { const hasChildren = member.children && member.children.length > 0 const isExpanded = expandedNodes.has(member.id) const isSearchMatch = member.name.toLowerCase().includes(searchTerm.toLowerCase()) || member.email.toLowerCase().includes(searchTerm.toLowerCase()) if (searchTerm && !isSearchMatch && depth > 0) { return null } const marginClass = depth === 0 ? '' : depth === 1 ? 'ml-8' : depth === 2 ? 'ml-16' : depth === 3 ? 'ml-24' : 'ml-32' return ( {/* Level indicator line */} {depth > 0 && (
)}
{hasChildren && ( )}
{member.level === 0 && (
👑
)}

{member.name}

{member.level > 0 && ( Level {member.level} )}

{member.email}

Joined {new Date(member.joinedAt).toLocaleDateString()}
{hasChildren && (
{member.children!.length} direct referrals
)}
{member.directReferrals} referrals
₹{member.totalEarnings.toFixed(2)}
{member.level === 0 && ( )}
{hasChildren && isExpanded && ( {/* Vertical connector line */}
{member.children!.map(child => renderTreeNode(child, depth + 1))}
)}
) } if (loading) { return (
) } return (
{/* Enhanced Header */} } actions={ <> } /> {/* Enhanced Stats */}

Total Team Size

{genealogyData?.teamSize || 0}

Network Levels

{genealogyData?.levels || 0}

Team Volume

₹{genealogyData?.totalVolume?.toFixed(0) || '0'}

Active Members

{genealogyData?.teamSize || 0}

{/* Enhanced Search */}
setSearchTerm(e.target.value)} className="pl-10 pr-4 py-3 text-base border-2 border-gray-200 focus:border-blue-500 rounded-xl" />
{/* Enhanced Genealogy Tree */} Network Tree {genealogyData?.user ? (
{renderTreeNode(genealogyData.user)}
) : (

No team data available

Start building your network to see the genealogy tree

)}
) }