From a922a4e50772a84b2ea0a4d99f01cc5b2e67ed0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A2=81=E6=B6=9B?= Date: Mon, 15 Sep 2025 22:30:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=AD=E7=9A=84=E7=94=9F=E6=88=90=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=98=BE=E7=A4=BA=E5=8F=82=E8=80=83=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/HistoryPanel.tsx | 160 +++++++++++++++++++----------- src/hooks/useImageGeneration.ts | 15 ++- src/hooks/useIndexedDBListener.ts | 54 ++++++++++ 3 files changed, 169 insertions(+), 60 deletions(-) create mode 100644 src/hooks/useIndexedDBListener.ts diff --git a/src/components/HistoryPanel.tsx b/src/components/HistoryPanel.tsx index 40aa941..be45df8 100644 --- a/src/components/HistoryPanel.tsx +++ b/src/components/HistoryPanel.tsx @@ -5,6 +5,7 @@ import { History, Download, Image as ImageIcon } from 'lucide-react'; import { cn } from '../utils/cn'; import { ImagePreviewModal } from './ImagePreviewModal'; import * as indexedDBService from '../services/indexedDBService'; +import { useIndexedDBListener } from '../hooks/useIndexedDBListener'; export const HistoryPanel: React.FC = () => { const { @@ -37,9 +38,8 @@ export const HistoryPanel: React.FC = () => { // 存储从Blob URL解码的图像数据 const [decodedImages, setDecodedImages] = useState>({}); - // 存储从IndexedDB获取的完整记录 - const [dbGenerations, setDbGenerations] = useState([]); - const [dbEdits, setDbEdits] = useState([]); + // 使用自定义hook获取IndexedDB记录 + const { generations: dbGenerations, edits: dbEdits, loading, error, refresh } = useIndexedDBListener(); // 筛选和搜索状态 const [startDate, setStartDate] = useState(''); @@ -80,50 +80,39 @@ export const HistoryPanel: React.FC = () => { } }, [canvasImage]); - // 当组件挂载时,从IndexedDB获取记录 - useEffect(() => { - const loadDBRecords = async () => { - try { - // 初始化数据库 - await indexedDBService.initDB(); - - // 获取所有生成记录和编辑记录 - const allGenerations = await indexedDBService.getAllGenerations(); - const allEdits = await indexedDBService.getAllEdits(); - - setDbGenerations(allGenerations); - setDbEdits(allEdits); - } catch (err) { - console.error('从IndexedDB加载记录失败:', err); - } - }; - - loadDBRecords(); - }, []); - - // 当有新记录添加时,重新加载记录 - useEffect(() => { - // 监听store中的记录变化,如果有新记录则重新加载 - const handleStorageChange = (e: StorageEvent) => { - if (e.key === 'nano-banana-store') { - // 重新加载记录 - const loadDBRecords = async () => { - try { - const allGenerations = await indexedDBService.getAllGenerations(); - const allEdits = await indexedDBService.getAllEdits(); - setDbGenerations(allGenerations); - setDbEdits(allEdits); - } catch (err) { - console.error('从IndexedDB重新加载记录失败:', err); - } - }; - loadDBRecords(); - } - }; - - window.addEventListener('storage', handleStorageChange); - return () => window.removeEventListener('storage', handleStorageChange); - }, []); + // 错误处理显示 + if (error) { + return ( +
+
+
+ +

历史记录和变体

+
+ +
+
+

加载历史记录时出错: {error}

+ +
+
+ ); + } // 筛选记录的函数 const filterRecords = (records: any[], isGeneration: boolean) => { @@ -233,16 +222,7 @@ export const HistoryPanel: React.FC = () => {