import { useEffect, useState } from "react"; import type { FormEvent, KeyboardEvent } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import { api } from "../api"; import { FeedbackBanner, LoadingState } from "../components/Feedback"; import { usePollingResource } from "../hooks/usePollingResource"; import { VisitorTakeTicketForm } from "./VisitorTakeTicketPage"; function isPhoneInputValid(value: string): boolean { const digits = value.replace(/\D/g, ""); return /^[+\d\s\-()]+$/.test(value) && digits.length >= 7 && digits.length <= 15; } type VisitorServiceTab = "take-ticket" | "lookup"; interface VisitorLookupLocationState { activeTab?: VisitorServiceTab; } export function VisitorLookupPage() { const location = useLocation(); const navigate = useNavigate(); const requestedTab = (location.state as VisitorLookupLocationState | null)?.activeTab; const [activeTab, setActiveTab] = useState(requestedTab === "lookup" ? "lookup" : "take-ticket"); const [phoneInput, setPhoneInput] = useState(""); const [submittedPhone, setSubmittedPhone] = useState(""); const [formError, setFormError] = useState(null); const resource = usePollingResource((signal) => api.publicStatusByPhone(submittedPhone, signal), { enabled: Boolean(submittedPhone), intervalMs: 3_000, resourceKey: submittedPhone, }); const data = resource.data; useEffect(() => { if (!data || !submittedPhone) return; navigate("/visitor/phone", { replace: true, state: { phone: submittedPhone }, }); }, [data, navigate, submittedPhone]); function submit(event: FormEvent) { event.preventDefault(); const nextPhone = phoneInput.trim(); if (!isPhoneInputValid(nextPhone)) { setFormError("请输入有效的手机号(7-15 位数字)"); return; } setFormError(null); if (nextPhone === submittedPhone) { void resource.refresh(); return; } setSubmittedPhone(nextPhone); } function handleTabKeyDown(event: KeyboardEvent, currentTab: VisitorServiceTab) { let nextTab: VisitorServiceTab | null = null; if (event.key === "ArrowLeft" || event.key === "ArrowRight") { nextTab = currentTab === "take-ticket" ? "lookup" : "take-ticket"; } else if (event.key === "Home") { nextTab = "take-ticket"; } else if (event.key === "End") { nextTab = "lookup"; } if (!nextTab) return; event.preventDefault(); setActiveTab(nextTab); document.getElementById(nextTab === "take-ticket" ? "visitor-take-ticket-tab" : "visitor-lookup-tab")?.focus(); } const liveTone = resource.offline ? "offline" : resource.error ? "stale" : "live"; const liveLabel = resource.offline ? "连接中断" : resource.error ? "查询延迟" : "取号与查询"; return (
小七孔文旅集团排队服务