import React, { useState, useEffect } from 'react'; import { Card, Button, Modal, Form, Input, message, Popconfirm, Row, Col, Tag, Select } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, BookOutlined, EyeOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import { storage } from '../utils/indexedDB'; import { Novel } from '../types'; const { TextArea } = Input; const { Option } = Select; // 小说题材选项 const NOVEL_GENRES = [ '穿越', '都市', '修仙', '武侠', '玄幻', '科幻', '言情', '历史', '游戏', '灵异', '军事', '悬疑', '其他' ]; const NovelList: React.FC = () => { const [novels, setNovels] = useState([]); const [isModalVisible, setIsModalVisible] = useState(false); const [viewModalVisible, setViewModalVisible] = useState(false); const [editingNovel, setEditingNovel] = useState(null); const [viewingNovel, setViewingNovel] = useState(null); const [form] = Form.useForm(); const navigate = useNavigate(); useEffect(() => { loadNovels(); }, []); const loadNovels = async () => { try { const loadedNovels = await storage.getNovels(); setNovels(loadedNovels); } catch (error) { console.error('加载小说列表失败:', error); message.error('加载小说列表失败'); } }; const handleAddNovel = () => { setEditingNovel(null); form.resetFields(); setIsModalVisible(true); }; const handleViewNovel = (novel: Novel) => { setViewingNovel(novel); setViewModalVisible(true); }; const handleEditNovel = (novel: Novel) => { setEditingNovel(novel); form.setFieldsValue({ title: novel.title, genre: novel.genre === '未分类' ? undefined : novel.genre, outline: novel.outline }); setIsModalVisible(true); }; const handleDeleteNovel = async (id: string) => { try { await storage.deleteNovel(id); await loadNovels(); message.success('小说删除成功'); } catch (error) { console.error('删除小说失败:', error); message.error('删除失败,请重试'); } }; const handleModalOk = async () => { try { const values = await form.validateFields(); if (editingNovel) { await storage.updateNovel(editingNovel.id, { ...values, genre: values.genre || '未分类' }); message.success('小说更新成功'); } else { const newNovel: Novel = { id: Date.now().toString(), title: values.title, genre: values.genre || '未分类', outline: values.outline || '', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }; await storage.addNovel(newNovel); message.success('小说创建成功,请前往AI生成页面完善设定'); } await loadNovels(); setIsModalVisible(false); form.resetFields(); } catch (error) { console.error('保存小说失败:', error); message.error('保存失败,请重试'); } }; const handleModalCancel = () => { setIsModalVisible(false); form.resetFields(); setEditingNovel(null); }; const handleCardClick = (id: string) => { navigate(`/novels/${id}`); }; return (

我的小说

管理和创作您的 AI 小说作品

共 {novels.length} 部小说
{novels.length === 0 ? (
还没有小说,开始创作您的第一部作品吧!
点击"新建小说"按钮开始您的创作之旅
) : ( {novels.map((novel) => ( handleCardClick(novel.id)} actions={[ { e.stopPropagation(); handleViewNovel(novel); }} />, { e.stopPropagation(); handleEditNovel(novel); }} />, { e?.stopPropagation(); handleDeleteNovel(novel.id); }} onCancel={(e) => e?.stopPropagation()} okText="确定" cancelText="取消" > e.stopPropagation()} /> ]} >
} title={
{novel.title}
} description={
{novel.genre} {novel.generatedSettings && ( 已完善设定 )}
{novel.outline || '暂无大纲'}
创建于 {new Date(novel.createdAt).toLocaleDateString()}
} /> ))} )}