import { useEffect, useMemo, useState } from 'react';
import { useParams, useNavigate, Outlet, Link, useLocation } from 'react-router-dom';
import { Layout, Menu, Spin, Button, Statistic, Row, Col, Card, Drawer } from 'antd';
import {
ArrowLeftOutlined,
FileTextOutlined,
TeamOutlined,
BookOutlined,
// ToolOutlined,
GlobalOutlined,
MenuFoldOutlined,
MenuUnfoldOutlined,
ApartmentOutlined,
BankOutlined,
EditOutlined,
FundOutlined,
HeartOutlined,
} from '@ant-design/icons';
import { useStore } from '../store';
import { useCharacterSync, useOutlineSync, useChapterSync } from '../store/hooks';
import { projectApi } from '../services/api';
const { Header, Sider, Content } = Layout;
// 判断是否为移动端
const isMobile = () => window.innerWidth <= 768;
export default function ProjectDetail() {
const { projectId } = useParams<{ projectId: string }>();
const navigate = useNavigate();
const location = useLocation();
const [collapsed, setCollapsed] = useState(false);
const [drawerVisible, setDrawerVisible] = useState(false);
const [mobile, setMobile] = useState(isMobile());
// 监听窗口大小变化
useEffect(() => {
const handleResize = () => {
setMobile(isMobile());
if (!isMobile()) {
setDrawerVisible(false);
}
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
const {
currentProject,
setCurrentProject,
clearProjectData,
loading,
setLoading,
outlines,
characters,
chapters,
} = useStore();
// 使用同步 hooks
const { refreshCharacters } = useCharacterSync();
const { refreshOutlines } = useOutlineSync();
const { refreshChapters } = useChapterSync();
useEffect(() => {
const loadProjectData = async (id: string) => {
try {
setLoading(true);
// 加载项目基本信息
const project = await projectApi.getProject(id);
setCurrentProject(project);
// 并行加载其他数据
await Promise.all([
refreshOutlines(id),
refreshCharacters(id),
refreshChapters(id),
]);
} catch (error) {
console.error('加载项目数据失败:', error);
} finally {
setLoading(false);
}
};
if (projectId) {
loadProjectData(projectId);
}
return () => {
clearProjectData();
};
}, [projectId, clearProjectData, setLoading, setCurrentProject, refreshOutlines, refreshCharacters, refreshChapters]);
// 移除事件监听,避免无限循环
// Hook 内部已经更新了 store,不需要再次刷新
const menuItems = [
{
key: 'world-setting',
icon: