import type {
JourneyView,
SequenceView,
} from "@fanfare-io/fanfare-sdk-core/experiences";
const unsubscribe = journey.view$.listen((view) => {
renderJourney(view);
});
function renderJourney(view: JourneyView) {
if (view.journeyStage === "ready") {
mountStartButton(() => view.start());
return;
}
if (view.journeyStage === "routing") {
mountLoading();
return;
}
if (view.journeyStage === "gated") {
mountGate({
gates: view.gates,
onAccessCode: (accessCode) => view.reroute({ accessCode }),
onRetry: () => view.retry(),
});
return;
}
renderSequence(view.sequence);
}
function renderSequence(sequence: SequenceView) {
switch (sequence.phase) {
case "unavailable":
mountUnavailable();
return;
case "scheduled":
mountUpcoming({ startsAt: sequence.startsAt });
return;
case "enterable":
if ("enter" in sequence) {
mountEnterButton(() => sequence.enter());
} else if ("bid" in sequence) {
mountBidForm((amount) => sequence.bid(amount));
} else if ("book" in sequence) {
mountAppointmentPicker((slotId, locationId) =>
sequence.book(slotId, locationId)
);
} else {
mountUnavailable();
}
return;
case "participating":
mountParticipation({
type: sequence.mechanism,
onLeave: "leave" in sequence ? () => sequence.leave() : undefined,
});
return;
case "settling":
mountSettling(sequence);
return;
case "granted":
mountCheckout(sequence.grant.token);
return;
case "ended":
mountEnded({ reason: sequence.outcome.type });
}
}