import { useEffect, useMemo, useState } from 'react' import Link from 'next/link' import { Card } from '@/libs/frontend-ui-primitives' import { explorerFeaturePages } from '@/data/explorerOperations' import { configApi, type CapabilitiesResponse, type NetworksConfigResponse, type TokenListResponse } from '@/services/api/config' import { getMissionControlRelays, missionControlApi, type MissionControlBridgeStatusResponse } from '@/services/api/missionControl' import { routesApi, type RouteMatrixResponse } from '@/services/api/routes' function relativeAge(isoString?: string): string { if (!isoString) return 'Unknown' const parsed = Date.parse(isoString) if (!Number.isFinite(parsed)) return 'Unknown' const seconds = Math.max(0, Math.round((Date.now() - parsed) / 1000)) if (seconds < 60) return `${seconds}s ago` const minutes = Math.round(seconds / 60) if (minutes < 60) return `${minutes}m ago` const hours = Math.round(minutes / 60) return `${hours}h ago` } function ActionLink({ href, label, external, }: { href: string label: string external?: boolean }) { const className = 'inline-flex items-center text-sm font-semibold text-primary-600 hover:underline' const text = `${label} ->` if (external) { return ( {text} ) } return ( {text} ) } export default function MoreOperationsPage() { const [bridgeStatus, setBridgeStatus] = useState(null) const [routeMatrix, setRouteMatrix] = useState(null) const [networksConfig, setNetworksConfig] = useState(null) const [tokenList, setTokenList] = useState(null) const [capabilities, setCapabilities] = useState(null) const [loadingError, setLoadingError] = useState(null) const page = explorerFeaturePages.more useEffect(() => { let cancelled = false const load = async () => { const [bridgeResult, routesResult, networksResult, tokenListResult, capabilitiesResult] = await Promise.allSettled([ missionControlApi.getBridgeStatus(), routesApi.getRouteMatrix(), configApi.getNetworks(), configApi.getTokenList(), configApi.getCapabilities(), ]) if (cancelled) return if (bridgeResult.status === 'fulfilled') setBridgeStatus(bridgeResult.value) if (routesResult.status === 'fulfilled') setRouteMatrix(routesResult.value) if (networksResult.status === 'fulfilled') setNetworksConfig(networksResult.value) if (tokenListResult.status === 'fulfilled') setTokenList(tokenListResult.value) if (capabilitiesResult.status === 'fulfilled') setCapabilities(capabilitiesResult.value) const failedCount = [ bridgeResult, routesResult, networksResult, tokenListResult, capabilitiesResult, ].filter((result) => result.status === 'rejected').length if (failedCount === 5) { setLoadingError('Public explorer operations data is temporarily unavailable.') } } load().catch((error) => { if (!cancelled) { setLoadingError( error instanceof Error ? error.message : 'Public explorer operations data is temporarily unavailable.' ) } }) return () => { cancelled = true } }, []) const relayCount = useMemo(() => { const relays = getMissionControlRelays(bridgeStatus) return relays ? Object.keys(relays).length : 0 }, [bridgeStatus]) const totalQueue = useMemo(() => { const relays = getMissionControlRelays(bridgeStatus) if (!relays) return 0 return Object.values(relays).reduce((sum, relay) => { const queueSize = relay.url_probe?.body?.queue?.size ?? relay.file_snapshot?.queue?.size ?? 0 return sum + queueSize }, 0) }, [bridgeStatus]) const tokenChainCoverage = useMemo(() => { return new Set((tokenList?.tokens || []).map((token) => token.chainId).filter(Boolean)).size }, [tokenList]) const topSymbols = useMemo(() => { return Array.from( new Set((tokenList?.tokens || []).map((token) => token.symbol).filter(Boolean) as string[]) ).slice(0, 8) }, [tokenList]) return (
{page.eyebrow}

{page.title}

{page.description}

{page.note ? (

{page.note}

) : null} {loadingError ? (

{loadingError}

) : null}
Bridge Fleet
{bridgeStatus?.data?.status || 'unknown'}
{relayCount} managed lanes · queue {totalQueue}
Route Coverage
{routeMatrix?.counts?.filteredLiveRoutes ?? 0}
{routeMatrix?.counts?.liveSwapRoutes ?? 0} swaps · {routeMatrix?.counts?.liveBridgeRoutes ?? 0} bridges
Wallet Surface
{networksConfig?.chains?.length ?? 0}
Chains · {(tokenList?.tokens || []).length} tokens across {tokenChainCoverage} networks
RPC Capabilities
{capabilities?.http?.supportedMethods?.length ?? 0}
HTTP methods · {capabilities?.tracing?.supportedMethods?.length ?? 0} tracing methods
Bridge checked
{relativeAge(bridgeStatus?.data?.checked_at)}
Public mission-control snapshot freshness.
Route matrix updated
{relativeAge(routeMatrix?.updated)}
Token-aggregation route inventory timestamp.
Default chain
{networksConfig?.defaultChainId ?? 'Unknown'}
Wallet onboarding points at Chain 138 by default.
Wallet support
{capabilities?.walletSupport?.walletAddEthereumChain && capabilities?.walletSupport?.walletWatchAsset ? 'Ready' : 'Partial'}
`wallet_addEthereumChain` and `wallet_watchAsset` compatibility.
Featured symbols
{topSymbols.map((symbol) => ( {symbol} ))}
Tracing posture
Supported: {(capabilities?.tracing?.supportedMethods || []).join(', ') || 'None'}
Unsupported: {(capabilities?.tracing?.unsupportedMethods || []).join(', ') || 'None'}
{page.actions.map((action) => (
{action.title}

{action.description}

))}
) }