+ {/* Header and Controls */}
+
+
+
+ On-Chain History Log
+
+ {filteredEntries.length} {filteredEntries.length === 1 ? "event" : "events"}
+
+
+
+ Interactive event buffer recording verifiable on-chain invoice activities.
+
+
+
+
+ {/* Compact View Toggle */}
+
setIsCompact(!isCompact)}
+ className={`px-3 py-1.5 rounded-lg text-xs font-medium transition-colors border ${
+ isCompact
+ ? "bg-indigo-600 border-indigo-500 text-white"
+ : "bg-gray-800 border-gray-700 text-gray-300 hover:text-white"
+ }`}
+ aria-pressed={isCompact}
+ title={isCompact ? "Switch to detailed view" : "Switch to compact timeline view"}
+ >
+ {isCompact ? "Detailed View" : "Compact Timeline"}
+
+
+ {/* JSON Export Button */}
+ {entries.length > 0 && (
+
+
+
+
+ Export JSON
+
+ )}
+
+
+
+ {/* Filter Chips */}
+
+ {FILTER_CHIPS.map((chip) => {
+ const isActive = filter === chip.id;
+ return (
+ {
+ setFilter(chip.id);
+ setVisibleCount(10);
+ }}
+ className={`px-3 py-1 rounded-full text-xs font-semibold transition-colors ${
+ isActive
+ ? "bg-indigo-600 text-white shadow-md shadow-indigo-600/30"
+ : "bg-gray-800 text-gray-400 hover:bg-gray-700 hover:text-gray-200"
+ }`}
+ >
+ {chip.label}
+
+ );
+ })}
+
+
+ {/* Loading State */}
+ {loading && (
+
+ Loading history recordsβ¦
+
+ )}
+
+ {/* Empty State */}
+ {!loading && filteredEntries.length === 0 && (
+
+
No history yet
+
+ {filter !== "all"
+ ? `No events match the "${FILTER_CHIPS.find((c) => c.id === filter)?.label}" filter.`
+ : "No on-chain activity has occurred for this invoice yet."}
+
+
+ )}
+
+ {/* Event List (Detailed vs Compact) */}
+ {!loading && filteredEntries.length > 0 && (
+
+ {isCompact ? (
+ /* Compact Timeline View */
+
+ {visibleEntries.map((entry) => {
+ const absTime = new Date(entry.timestamp).toLocaleString();
+ const relTime = formatRelativeTime(entry.timestamp);
+ return (
+
+ {/* Timeline node dot */}
+
+
+
+ {EVENT_ICONS[entry.eventType]}
+
+
+ {EVENT_LABELS[entry.eventType]}
+
+
+ by {truncateAddress(entry.actor)}
+
+ {entry.amount && (
+
+ +{entry.amount} {entry.currency || "USDC"}
+
+ )}
+
+
+ {relTime}
+
+
+ );
+ })}
+
+ ) : (
+ /* Detailed View */
+
+ {visibleEntries.map((entry) => {
+ const absTime = new Date(entry.timestamp).toLocaleString();
+ const relTime = formatRelativeTime(entry.timestamp);
+ return (
+
+
+
+ {EVENT_ICONS[entry.eventType]}
+
+
+
+
+ {EVENT_LABELS[entry.eventType]}
+
+ {entry.amount && (
+
+ +{entry.amount} {entry.currency || "USDC"}
+
+ )}
+
+
+ Actor:{" "}
+
+ {truncateAddress(entry.actor, 8)}
+
+ {entry.details && ` β’ ${entry.details}`}
+
+
+
+
+
+
+ {relTime}
+
+ {entry.txHash && (
+
+ Tx β
+
+ )}
+
+
+ );
+ })}
+
+ )}
+
+ {/* Load More Pagination */}
+ {hasMore && (
+
+ setVisibleCount((prev) => prev + 10)}
+ className="w-full py-2.5 rounded-xl bg-gray-800 hover:bg-gray-700 text-xs font-semibold text-gray-300 hover:text-white transition-colors border border-gray-700"
+ >
+ Load more ({filteredEntries.length - visibleCount} remaining)
+
+
+ )}
+
+ )}
+
+ );
+}