/** * AdminDashboard Component - Analytics and monitoring dashboard */ import { useState, useEffect } from 'react' import { useAccount, usePublicClient } from 'wagmi' import { useAdmin } from '../../contexts/AdminContext' import { TransactionRequestStatus } from '../../types/admin' import { CONTRACT_ADDRESSES } from '../../config/contracts' import { MAINNET_TETHER_ABI } from '../../abis/MainnetTether' import { subscribeToContractEvents } from '../../utils/contractEvents' import toast from 'react-hot-toast' import DashboardStatCard from '../../features/omnl-dashboard/DashboardStatCard' import DashboardSection from '../../features/omnl-dashboard/DashboardSection' import NasaIcon, { StatusIcon } from '../icons/NasaIcon' export default function AdminDashboard() { const { adminActions, auditLogs } = useAdmin() const { address } = useAccount() const publicClient = usePublicClient() const [mainnetTetherPaused, setMainnetTetherPaused] = useState(false) const stats = { totalActions: adminActions.length, pending: adminActions.filter((a) => a.status === TransactionRequestStatus.PENDING).length, approved: adminActions.filter((a) => a.status === TransactionRequestStatus.APPROVED).length, executed: adminActions.filter((a) => a.status === TransactionRequestStatus.SUCCESS).length, failed: adminActions.filter((a) => a.status === TransactionRequestStatus.FAILED).length, totalAuditLogs: auditLogs.length, successRate: adminActions.length > 0 ? ( (adminActions.filter((a) => a.status === TransactionRequestStatus.SUCCESS).length / adminActions.length) * 100 ).toFixed(1) : '0', } const recentActions = adminActions.slice(-5).reverse() const recentLogs = auditLogs.slice(-5).reverse() useEffect(() => { if (publicClient && address) { // Fetch contract states const fetchStates = async () => { try { // Fetch paused state for MainnetTether const paused = await publicClient.readContract({ address: CONTRACT_ADDRESSES.mainnet.MAINNET_TETHER, abi: MAINNET_TETHER_ABI, functionName: 'paused', }) setMainnetTetherPaused(paused as boolean) } catch (error) { console.error('Error fetching contract states:', error) } } fetchStates() const interval = setInterval(fetchStates, 30000) // Refresh every 30 seconds // Subscribe to contract events for real-time updates let unsubscribePaused: (() => void) | null = null let unsubscribeUnpaused: (() => void) | null = null subscribeToContractEvents( publicClient, CONTRACT_ADDRESSES.mainnet.MAINNET_TETHER, MAINNET_TETHER_ABI, 'Paused', (_event) => { setMainnetTetherPaused(true) toast.success('MainnetTether paused event detected') } ).then((unsub) => { unsubscribePaused = unsub }).catch(() => {}) subscribeToContractEvents( publicClient, CONTRACT_ADDRESSES.mainnet.MAINNET_TETHER, MAINNET_TETHER_ABI, 'Unpaused', (_event) => { setMainnetTetherPaused(false) toast.success('MainnetTether unpaused event detected') } ).then((unsub) => { unsubscribeUnpaused = unsub }).catch(() => {}) return () => { clearInterval(interval) if (unsubscribePaused) unsubscribePaused() if (unsubscribeUnpaused) unsubscribeUnpaused() } } }, [publicClient, address]) return (
MainnetTether
{mainnetTetherPaused ? 'Paused' : 'Active'}

{CONTRACT_ADDRESSES.mainnet.MAINNET_TETHER}

{recentActions.length === 0 ? (

No actions yet

) : (
{recentActions.map((action) => (

{action.type}

{action.contractAddress.slice(0, 20)}...

{action.status}

{new Date(action.createdAt).toLocaleString()}

))}
)}
{recentLogs.length === 0 ? (

No audit logs yet

) : (
{recentLogs.map((log) => (

{log.action}

{log.user.slice(0, 10)}...

{log.status}

{new Date(log.timestamp).toLocaleString()}

))}
)}
) }