import { FanfareProvider, useFanfareAuth, useExperienceJourney } from "@waitify-io/fanfare-sdk-react";
import { useEffect, useState } from "react";
function GuestExperience({ experienceId }: { experienceId: string }) {
const { isAuthenticated, isGuest, guest, session } = useFanfareAuth();
const { journey, state, status, start } = useExperienceJourney(experienceId);
const [isInitializing, setIsInitializing] = useState(true);
// Step 1: Auto-authenticate as guest
useEffect(() => {
async function init() {
if (!isAuthenticated) {
await guest();
}
setIsInitializing(false);
}
init();
}, [isAuthenticated, guest]);
// Step 2: Start journey when authenticated
useEffect(() => {
if (isAuthenticated && status === "idle" && !isInitializing) {
start();
}
}, [isAuthenticated, status, isInitializing, start]);
if (isInitializing) {
return <div className="loading">Preparing your experience...</div>;
}
const snapshot = state?.snapshot;
return (
<div className="guest-experience">
{/* Session Info */}
<div className="session-info">
<p>Session Type: {isGuest ? "Guest" : "Identified"}</p>
<p>Consumer ID: {session?.consumerId?.slice(0, 8)}...</p>
</div>
{/* Experience Status */}
<div className="experience-status">
<p>Status: {status}</p>
</div>
{/* Actions */}
<div className="actions">
{snapshot?.availableActions.sequence.includes("enter_queue") && (
<button onClick={() => journey?.perform("enter_queue")} className="primary-btn">
Join Queue
</button>
)}
{snapshot?.sequenceStage === "admitted" && (
<div className="admitted">
<h3>You're In!</h3>
<a href={`/checkout?token=${snapshot.context.admittanceToken}`} className="checkout-btn">
Continue to Checkout
</a>
</div>
)}
</div>
</div>
);
}
export function App() {
return (
<FanfareProvider organizationId="org_xxx" publishableKey="pk_live_xxx" autoRestore={true} autoResume={true}>
<GuestExperience experienceId="exp_product_launch" />
</FanfareProvider>
);
}