import { useExperienceJourney } from "@fanfare/react";
import { useAuction } from "@fanfare/react";
import { useState } from "react";
function AuctionExperience() {
const { status, state } = useExperienceJourney("exp_auction_experience_id", {
autoStart: true,
});
// Get the auction ID from the journey state
const auctionId = state?.snapshot?.context.distributions?.active?.id;
if (status === "ready") {
return <CheckoutPage />;
}
if (status === "waiting" && auctionId) {
return <AuctionBidding auctionId={auctionId} />;
}
return <p>Loading auction...</p>;
}
function AuctionBidding({ auctionId }: { auctionId: string }) {
const [bidAmount, setBidAmount] = useState("");
const {
details,
status,
currentBid,
myBid,
minNextBid,
timeRemaining,
isWinning,
placeBid,
enter,
isLoading,
error,
} = useAuction(auctionId);
const handleBid = async () => {
try {
await placeBid(bidAmount);
setBidAmount("");
} catch (err) {
console.error("Bid failed:", err);
}
};
const formatTime = (ms: number | null) => {
if (!ms) return "--:--";
const minutes = Math.floor(ms / 60000);
const seconds = Math.floor((ms % 60000) / 1000);
return `${minutes}:${seconds.toString().padStart(2, "0")}`;
};
return (
<div className="auction">
<h2>{details?.name ?? "Auction"}</h2>
<div className="auction-stats">
<div className="stat">
<span className="label">Current Bid</span>
<span className="value">${currentBid ?? "0.00"}</span>
</div>
<div className="stat">
<span className="label">Time Remaining</span>
<span className="value">{formatTime(timeRemaining)}</span>
</div>
</div>
{myBid && (
<p className={isWinning ? "winning" : "outbid"}>
{isWinning ? "You are the highest bidder!" : "You have been outbid."}
</p>
)}
{status !== "ended" && status !== "won" && (
<div className="bid-form">
<input
type="number"
value={bidAmount}
onChange={(e) => setBidAmount(e.target.value)}
placeholder={`Min bid: $${minNextBid}`}
step="0.01"
/>
<button onClick={handleBid} disabled={isLoading}>
{isLoading ? "Placing bid..." : "Place Bid"}
</button>
</div>
)}
{status === "won" && (
<div className="auction-won">
<h3>You won the auction!</h3>
<p>Your winning bid: ${myBid}</p>
</div>
)}
{error && <p className="error">{error.message}</p>}
</div>
);
}