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', compact = false, }: { context: ChainActivityContext title?: string compact?: boolean }) { 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.

{compact ? (
Latest block{' '} {context.latest_block_number != null ? `#${context.latest_block_number}` : 'Unknown'} {' '} was {formatRelativeAge(context.latest_block_timestamp)}. Latest visible transaction was{' '} {context.latest_transaction_block_number != null ? `#${context.latest_transaction_block_number}` : 'Unknown'} {' '} {formatRelativeAge(context.latest_transaction_timestamp)}.{' '} {mode === 'guided' ? 'Use the block gap and last non-empty block above to tell low activity apart from an indexing issue.' : dualTimelineLabel}
) : (
Timeline Summary
Latest block{' '} {context.latest_block_number != null ? `#${context.latest_block_number}` : 'Unknown'} {' '} was {formatRelativeAge(context.latest_block_timestamp)}. Latest visible transaction was{' '} {context.latest_transaction_block_number != null ? `#${context.latest_transaction_block_number}` : 'Unknown'} {' '} {formatRelativeAge(context.latest_transaction_timestamp)}.
Visibility Signal
{mode === 'guided' ? 'Use the block gap and the last non-empty block above to tell low activity apart from an indexing issue.' : 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}
) }