import React, { useState, useEffect } from 'react'; import { Vote, Users, Gavel, FileText, TrendingUpIcon, Clock, CheckCircle, XCircle, AlertCircle, BarChart3, PieChart, Activity, Shield } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Badge } from '../ui/badge'; import { Progress } from '../ui/progress'; import { usePolkadot } from '../../contexts/PolkadotContext'; import { formatBalance } from '@pezkuwi/lib/wallet'; interface GovernanceStats { activeProposals: number; activeElections: number; totalVoters: number; participationRate: number; parliamentMembers: number; diwanMembers: number; nextElection: string; treasuryBalance: string; } const GovernanceOverview: React.FC = () => { const { api, isApiReady } = usePolkadot(); const [stats, setStats] = useState({ activeProposals: 0, activeElections: 0, totalVoters: 0, participationRate: 0, parliamentMembers: 0, diwanMembers: 0, nextElection: '-', treasuryBalance: '0 HEZ' }); const [loading, setLoading] = useState(true); useEffect(() => { const fetchGovernanceData = async () => { if (!api || !isApiReady) { console.log('API not ready for governance data'); return; } try { console.log('📊 Fetching governance data from blockchain...'); setLoading(true); // Fetch active referenda (proposals) let activeProposals = 0; try { const referendaCount = await api.query.referenda.referendumCount(); console.log('Referenda count:', referendaCount.toNumber()); activeProposals = referendaCount.toNumber(); } catch (err) { console.warn('Failed to fetch referenda count:', err); } // Fetch treasury balance let treasuryBalance = '0 HEZ'; try { const treasuryAccount = await api.query.system.account( '5EYCAe5ijiYfyeZ2JJCGq56LmPyNRAKzpG4QkoQkkQNB5e6Z' // Treasury pallet address ); const balance = treasuryAccount.data.free.toString(); treasuryBalance = `${formatBalance(balance)} HEZ`; console.log('Treasury balance:', treasuryBalance); } catch (err) { console.warn('Failed to fetch treasury balance:', err); } // Fetch council members let parliamentMembers = 0; try { const members = await api.query.council.members(); parliamentMembers = members.length; console.log('Council members:', parliamentMembers); } catch (err) { console.warn('Failed to fetch council members:', err); } // Update stats setStats({ activeProposals, activeElections: 0, // Not implemented yet totalVoters: 0, // Will be calculated from conviction voting participationRate: 0, parliamentMembers, diwanMembers: 0, // Not implemented yet nextElection: '-', treasuryBalance }); console.log('✅ Governance data updated:', { activeProposals, parliamentMembers, treasuryBalance }); } catch (error) { console.error('Failed to fetch governance data:', error); } finally { setLoading(false); } }; fetchGovernanceData(); }, [api, isApiReady]); const [recentActivity] = useState([ { type: 'proposal', action: 'New proposal submitted', title: 'Treasury Allocation Update', time: '2 hours ago' }, { type: 'vote', action: 'Vote cast', title: 'Infrastructure Development Fund', time: '3 hours ago' }, { type: 'election', action: 'Election started', title: 'Parliamentary Elections 2024', time: '1 day ago' }, { type: 'approved', action: 'Proposal approved', title: 'Community Grant Program', time: '2 days ago' } ]); const getActivityIcon = (type: string) => { switch(type) { case 'proposal': return ; case 'vote': return ; case 'election': return ; case 'approved': return ; default: return ; } }; return (
{/* Stats Grid */}

Active Proposals

{stats.activeProposals}

+3 this week

Active Elections

{stats.activeElections}

Next in {stats.nextElection}

Participation Rate

{stats.participationRate}%

Treasury Balance

{stats.treasuryBalance}

Available for proposals

{/* Government Bodies */}
Parliament Status
Active Members {stats.parliamentMembers}/27
Current Session In Session
Pending Votes 5
Quorum Status Met (85%)
Dîwan (Constitutional Court)
Active Judges {stats.diwanMembers}/9
Pending Reviews 3
Recent Decisions 12
Next Hearing Tomorrow, 14:00 UTC
{/* Recent Activity */} Recent Governance Activity
{recentActivity.map((activity, index) => (
{getActivityIcon(activity.type)}

{activity.action}

{activity.title}

{activity.time}
))}
{/* Voting Power Distribution */} Voting Power Distribution
Direct Votes 45%
Delegated Votes 35%
Proxy Votes 20%
); }; export default GovernanceOverview;