import { useState, useEffect } from "react"; import { useNavigate } from "react-router"; import { ArrowLeft, Lock, Unlock, ShieldCheck, Link2, CheckCircle2, Loader2, Play, Clock, } from "lucide-react"; import { Button } from "../components/ui/button"; import { Card } from "../components/ui/card"; import { PageHeader } from "../components/shared/common"; import { bidders } from "../data/mock"; interface LogItem { time: string; title: string; desc: string; icon: any; color: string; } const logSeq: LogItem[] = [ { time: "10:00:00", title: "开标启动", desc: "招标专员在开标时间到达后启动开标程序", icon: Play, color: "#1565c0" }, { time: "10:00:03", title: "投标截止确认", desc: "确认共收到 3 家有效投标文件", icon: CheckCircle2, color: "#0ea5e9" }, { time: "10:00:08", title: "文件自动解密", desc: "使用投标人 CA 证书自动解密投标文件", icon: Unlock, color: "#14b8a6" }, { time: "10:00:15", title: "投标文件哈希上链", desc: "各投标文件哈希值已写入区块链存证,不可篡改", icon: Link2, color: "#8b5cf6" }, { time: "10:00:20", title: "开标完成", desc: "所有投标文件解密成功,开标结束", icon: ShieldCheck, color: "#16a34a" }, ]; export function BidOpeningHall() { const navigate = useNavigate(); const [started, setStarted] = useState(false); const [shown, setShown] = useState(0); useEffect(() => { if (!started) return; if (shown >= logSeq.length) return; const t = setTimeout(() => setShown((s) => s + 1), 900); return () => clearTimeout(t); }, [started, shown]); const done = shown >= logSeq.length; return (
{/* 顶部状态条 */}
{done ? : }
开标状态
{!started ? "等待开标" : done ? "开标已完成" : "开标进行中…"}
3
投标家数
{started ? Math.min(shown, 3) : 0}
已解密
{!started && ( )}
{/* 实时日志时间轴 */}

开标实时日志

{!started ? (

点击右上角「启动开标」开始

) : (
{logSeq.slice(0, shown).map((l, i) => { const Icon = l.icon; return (
{i < shown - 1 &&
}
{l.title} {l.time}

{l.desc}

); })} {!done && (
处理中…
)}
)} {/* 解密投标人列表 */}

解密投标人

{bidders.map((b, i) => { const revealed = started && shown >= 3; return (
{revealed ? b.realName : b.anon} {revealed ? ( 已解密 ) : ( 加密中 )}
哈希存证:{revealed ? b.hash : "····················"}
); })}
{done && ( )}
); }