page.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. "use client";
  2. import { useEffect, useState } from "react";
  3. import { ChatWidget } from "@/components/visitor/ChatWidget";
  4. import { FloatingButton } from "@/components/visitor/FloatingButton";
  5. /**
  6. * 访客聊天页面
  7. * 使用小窗插件形式,显示浮动按钮和聊天小窗
  8. */
  9. export default function ChatPage() {
  10. const [visitorId, setVisitorId] = useState<number | null>(null);
  11. const [isOpen, setIsOpen] = useState(false);
  12. // 初始化访客 ID(使用 localStorage 保持连续性)
  13. useEffect(() => {
  14. let stored = window.localStorage.getItem("visitor_id");
  15. if (!stored) {
  16. stored = `${Date.now()}${Math.floor(Math.random() * 100000)}`;
  17. window.localStorage.setItem("visitor_id", stored);
  18. }
  19. const parsed = Number.parseInt(stored, 10);
  20. setVisitorId(Number.isNaN(parsed) ? null : parsed);
  21. }, []);
  22. const handleToggle = () => {
  23. setIsOpen((prev) => !prev);
  24. };
  25. if (visitorId === null) {
  26. return (
  27. <div className="flex items-center justify-center min-h-screen bg-muted/30 text-muted-foreground">
  28. 正在初始化...
  29. </div>
  30. );
  31. }
  32. return (
  33. <>
  34. {/* 浮动按钮 */}
  35. <FloatingButton onClick={handleToggle} isOpen={isOpen} />
  36. {/* 聊天小窗 */}
  37. {isOpen && (
  38. <ChatWidget visitorId={visitorId} isOpen={isOpen} onToggle={handleToggle} />
  39. )}
  40. </>
  41. );
  42. }