import { useEffect, useMemo, useState } from "react"; import { Button, Drawer, Input, Layout, Space, Typography } from "antd"; import { MenuFoldOutlined, MenuUnfoldOutlined, MessageOutlined, SettingOutlined, UserOutlined, } from "@ant-design/icons"; const { Header, Sider, Content } = Layout; const MOBILE_WIDTH = 750; const mockMessages = [ { role: "assistant", content: "你好,我是 ChatOne 助手,有什么可以帮你?" }, { role: "user", content: "请帮我总结今天的工作内容。" }, { role: "assistant", content: "当然可以,请先告诉我今天完成了哪些任务。" }, ]; export default function HomePage() { // 桌面端侧边栏折叠状态(移动端不使用该状态) const [collapsed, setCollapsed] = useState(false); // 移动端抽屉侧边栏显示状态 const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); // 当前视口宽度(用于调试响应式是否生效) const [viewportWidth, setViewportWidth] = useState(0); // 是否为移动端(小于 750px) const [isMobile, setIsMobile] = useState(false); const [inputValue, setInputValue] = useState(""); const menuItems = useMemo( () => [ { icon: , label: "新建会话" }, { icon: , label: "我的对话" }, { icon: , label: "设置" }, ], [], ); useEffect(() => { const updateIsMobile = () => { // 兼容不同浏览器/缩放场景下的视口宽度读取 const viewportWidth = Math.min( window.innerWidth, document.documentElement.clientWidth || window.innerWidth, ); setViewportWidth(viewportWidth); const mobile = viewportWidth < MOBILE_WIDTH; setIsMobile(mobile); if (!mobile) { // 切回桌面端时关闭移动抽屉,避免状态残留 setMobileSidebarOpen(false); } }; updateIsMobile(); window.addEventListener("resize", updateIsMobile); window.addEventListener("orientationchange", updateIsMobile); return () => { window.removeEventListener("resize", updateIsMobile); window.removeEventListener("orientationchange", updateIsMobile); }; }, []); const sidebarContent = ( <> {/* 侧边栏头部:桌面折叠时显示缩写,其他情况显示完整标题 */}
{collapsed && !isMobile ? "CO" : "ChatOne"}
{menuItems.map((item) => ( ))}
); return ( {/* 桌面端固定侧边栏;移动端改为 Drawer 抽屉 */} {!isMobile && ( {sidebarContent} )}
{/* 聊天窗口:消息列表 + 底部输入区 */}
聊天窗口
{mockMessages.map((item, index) => (
{item.content}
))}
setInputValue(e.target.value)} placeholder="输入消息..." />
setMobileSidebarOpen(false)} open={isMobile && mobileSidebarOpen} size={260} > {sidebarContent} {sidebarContent}
); }