import { useAuction, useFanfareAuth } from "@waitify-io/fanfare-sdk-react";
import { useState } from "react";
function AuctionPage() {
const { isAuthenticated, guest } = useFanfareAuth();
const {
details,
status,
currentBid,
myBid,
minNextBid,
timeRemaining,
isWinning,
isLoading,
error,
enter,
placeBid,
} = useAuction("auction_123");
const [bidAmount, setBidAmount] = useState("");
const handleEnter = async () => {
if (!isAuthenticated) {
await guest();
}
await enter();
};
const handleBid = async () => {
try {
const result = await placeBid(bidAmount);
console.log("Bid result:", result.status);
setBidAmount("");
} catch (err) {
console.error("Bid failed:", err);
}
};
if (error) {
return <div className="error">Error: {error.message}</div>;
}
return (
<div className="auction-page">
<h1>Auction</h1>
<div className="current-bid">
<span>Current Bid:</span>
<span className="amount">
{details?.currencyCode} {currentBid || "0.00"}
</span>
</div>
<div className="time-remaining">
<span>Time Left:</span>
<span>{formatTime(timeRemaining)}</span>
</div>
{status === "open" && <button onClick={handleEnter}>Enter Auction</button>}
{(status === "watching" || status === "winning" || status === "outbid") && (
<div className="bid-section">
{isWinning && <div className="winning-badge">You are winning!</div>}
{status === "outbid" && <div className="outbid-badge">You have been outbid!</div>}
<input
type="text"
value={bidAmount}
onChange={(e) => setBidAmount(e.target.value)}
placeholder={`Min: ${minNextBid}`}
/>
<button onClick={handleBid} disabled={isLoading}>
Place Bid
</button>
{myBid && <p>Your bid: {myBid}</p>}
</div>
)}
{status === "won" && (
<div className="winner">
<h2>Congratulations! You won!</h2>
</div>
)}
{status === "lost" && <p>Auction ended. Final bid: {currentBid}</p>}
</div>
);
}
function formatTime(ms: number | null): string {
if (ms === null) return "--:--";
if (ms <= 0) return "Ended";
const hours = Math.floor(ms / (1000 * 60 * 60));
const minutes = Math.floor((ms % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((ms % (1000 * 60)) / 1000);
if (hours > 0) {
return `${hours}h ${minutes}m`;
}
return `${minutes}:${seconds.toString().padStart(2, "0")}`;
}