"use client"; import { FormEvent, useState } from "react"; import { Branch, Service, Tenant, Ticket, createTicket, getBranchServices, getBranches, getTenant, } from "@/lib/api"; import { getDeviceToken } from "@/lib/device"; type Step = "tenant" | "branch" | "service" | "ticket"; export default function CustomerTicketFlow() { const [step, setStep] = useState("tenant"); const [tenantCode, setTenantCode] = useState("DFLT"); const [tenant, setTenant] = useState(null); const [branches, setBranches] = useState([]); const [services, setServices] = useState([]); const [selectedBranch, setSelectedBranch] = useState(null); const [ticket, setTicket] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); async function handleTenantSubmit(event: FormEvent) { event.preventDefault(); const code = tenantCode.trim().toUpperCase(); if (!code) { setError("Enter a company code."); return; } setLoading(true); setError(null); try { const [tenantData, branchData] = await Promise.all([ getTenant(code), getBranches(code), ]); setTenant(tenantData); setBranches(branchData); setTenantCode(code); setStep("branch"); } catch { setError("Could not find that company. Check the code and try again."); } finally { setLoading(false); } } async function handleSelectBranch(branch: Branch) { if (!tenant) return; setLoading(true); setError(null); setSelectedBranch(branch); try { const branchServices = await getBranchServices(tenant.code, branch.id); setServices(branchServices); setStep("service"); } catch { setError("Could not load services for this branch."); } finally { setLoading(false); } } async function handleSelectService(service: Service) { if (!selectedBranch) return; setLoading(true); setError(null); try { const response = await createTicket({ branchId: selectedBranch.id, serviceId: service.id, deviceToken: getDeviceToken(), }); setTicket(response.ticket); setStep("ticket"); } catch { setError( "Could not get a ticket number. Make sure this branch has services assigned." ); } finally { setLoading(false); } } function resetFlow() { setStep(tenant ? "branch" : "tenant"); setSelectedBranch(null); setServices([]); setTicket(null); setError(null); } function startOver() { setStep("tenant"); setTenant(null); setBranches([]); setSelectedBranch(null); setServices([]); setTicket(null); setError(null); } return (

Queue Management

{tenant?.name ?? "Get a ticket"}

{tenant?.welcomeMessage ?? "Enter your company code, pick a branch and service, then take a number."}

{error ? (

{error}

) : null} {step === "tenant" ? (
) : null} {step === "branch" ? (

Choose a branch

{branches.length === 0 ? (

No branches available.

) : (
    {branches.map((branch) => (
  • ))}
)}
) : null} {step === "service" && selectedBranch ? (

Service at {selectedBranch.name}

{services.length === 0 ? (

No services are assigned to this branch yet. Link services via a branch group in the admin app, then try again.

) : (
    {services.map((service) => (
  • ))}
)}
) : null} {step === "ticket" && ticket ? (

Your ticket number

{ticket.number}

{ticket.service.name}

{ticket.branch.name}

) : null}
); }