import { useCommitmentData } from "@echoxyz/sonar-react";
import { Commitment, WalletTokenAmount } from "@echoxyz/sonar-core";
function calculateTotal(amounts: WalletTokenAmount[]): bigint {
return amounts.reduce((sum, item) => sum + BigInt(item.Amount), BigInt(0));
}
function formatTimestamp(timestamp: string): string {
return new Date(timestamp).toLocaleString(undefined, {
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
});
}
function RecentCommitments({ saleUUID }: { saleUUID: string }) {
const { commitmentData } = useCommitmentData({
saleUUID,
pollingIntervalMs: 10000,
});
if (!commitmentData) {
return null;
}
// Show the 10 most recent commitments
const recentCommitments = commitmentData.Commitments.slice(0, 10);
if (recentCommitments.length === 0) {
return <p>No commitments yet</p>;
}
// Note the commitments also include the price,
// which you might also want to display for auction sales.
return (
<div>
<h3>Recent Commitments</h3>
<ul>
{recentCommitments.map((commitment) => {
const total = calculateTotal(commitment.Amounts);
const formatted = formatAmount(
total.toString(),
commitmentData.PaymentTokenDecimals
);
return (
<li key={commitment.CommitmentID}>
{formatted} - {formatTimestamp(commitment.CreatedAt)}
</li>
);
})}
</ul>
</div>
);
}
function formatAmount(amount: string, decimals: number): string {
const value = BigInt(amount);
const divisor = BigInt(10 ** decimals);
const integerPart = value / divisor;
return `$${integerPart.toLocaleString()}`;
}