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}
)}
) : collapsed ? (
) : (
)
}
onClick={() => {
if (isMobile) {
// 移动端点击按钮:打开左侧抽屉
setMobileSidebarOpen(true);
} else {
// 桌面端点击按钮:切换侧边栏折叠
setCollapsed((v) => !v);
}
}}
/>
ChatOne Web
{`W:${viewportWidth}px / ${isMobile ? "mobile" : "desktop"}`}
{/* 聊天窗口:消息列表 + 底部输入区 */}
聊天窗口
{mockMessages.map((item, index) => (
))}
setInputValue(e.target.value)}
placeholder="输入消息..."
/>
setMobileSidebarOpen(false)}
open={isMobile && mobileSidebarOpen}
size={260}
>
{sidebarContent}
{sidebarContent}
);
}