import Link from 'next/link' import { Card } from '@/libs/frontend-ui-primitives' import EntityBadge from '@/components/common/EntityBadge' import type { ChainActivityContext } from '@/utils/activityContext' import { formatRelativeAge, formatTimestamp } from '@/utils/format' import { Explain, useUiMode } from './UiModeContext' function resolveTone(state: ChainActivityContext['state']): 'success' | 'warning' | 'neutral' { switch (state) { case 'active': return 'success' case 'low': case 'inactive': return 'warning' default: return 'neutral' } } function resolveLabel(state: ChainActivityContext['state']): string { switch (state) { case 'active': return 'active' case 'low': return 'low activity' case 'inactive': return 'inactive' default: return 'unknown' } } function renderHeadline(context: ChainActivityContext): string { if (context.transaction_visibility_unavailable) { return 'Transaction index freshness is currently unavailable, while chain-head visibility remains live.' } if (context.state === 'unknown') { return 'Recent activity context is temporarily unavailable.' } if (context.state === 'active') { return 'Recent transactions are close to the visible chain tip.' } if (context.head_is_idle) { return 'The chain head is advancing, but the latest visible transaction is older than the current tip.' } return 'Recent transaction activity is sparse right now.' } export default function ActivityContextPanel({ context, title = 'Chain Activity Context', }: { context: ChainActivityContext title?: string }) { const { mode } = useUiMode() const tone = resolveTone(context.state) const dualTimelineLabel = context.latest_block_timestamp && context.latest_transaction_timestamp ? `${formatRelativeAge(context.latest_block_timestamp)} head · ${formatRelativeAge(context.latest_transaction_timestamp)} latest tx` : 'Dual timeline unavailable' return (
{renderHeadline(context)}

Use the transaction tip and last non-empty block below to distinguish a quiet chain from a broken explorer.

Latest Block
{context.latest_block_number != null ? `#${context.latest_block_number}` : 'Unknown'}
{formatRelativeAge(context.latest_block_timestamp)}
Latest Transaction
{context.latest_transaction_block_number != null ? `#${context.latest_transaction_block_number}` : 'Unknown'}
{formatRelativeAge(context.latest_transaction_timestamp)}
Last Non-Empty Block
{context.last_non_empty_block_number != null ? `#${context.last_non_empty_block_number}` : 'Unknown'}
{formatRelativeAge(context.last_non_empty_block_timestamp)}
Block Gap
{context.block_gap_to_latest_transaction != null ? context.block_gap_to_latest_transaction.toLocaleString() : 'Unknown'}
{mode === 'guided' ? 'Difference between the current tip and the latest visible transaction block.' : dualTimelineLabel}
{context.latest_transaction_block_number != null ? ( Open latest transaction block → ) : null} {context.last_non_empty_block_number != null ? ( Open last non-empty block → ) : null} {context.latest_transaction_timestamp ? ( Latest visible transaction time: {formatTimestamp(context.latest_transaction_timestamp)} ) : null}
) }