import React, { useEffect, useState } from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { cn } from './utils/cn'; import { Header } from './components/Header'; import { PromptComposer } from './components/PromptComposer'; import { ImageCanvas } from './components/ImageCanvas'; import { HistoryPanel } from './components/HistoryPanel'; import { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts'; import { useAppStore } from './store/useAppStore'; import { ToastProvider } from './components/ToastContext'; import * as indexedDBService from './services/indexedDBService'; const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, // 5分钟 retry: 2, }, }, }); function AppContent() { useKeyboardShortcuts(); const { showPromptPanel, setShowPromptPanel, showHistory, setShowHistory } = useAppStore(); const [hoveredImage, setHoveredImage] = useState<{url: string, title: string, width?: number, height?: number} | null>(null); const [previewPosition, setPreviewPosition] = useState<{x: number, y: number} | null>(null); const [isPreviewVisible, setIsPreviewVisible] = useState(false); // 在挂载时初始化IndexedDB并清理base64数据 useEffect(() => { const init = async () => { try { await indexedDBService.initDB(); // 清理已有的base64数据 await indexedDBService.cleanupBase64Data(); } catch (err) { console.error('初始化IndexedDB或清理base64数据失败:', err); } }; init(); }, []); // 在挂载时设置移动设备默认值 React.useEffect(() => { const checkMobile = () => { const isMobile = window.innerWidth < 768; if (isMobile) { setShowPromptPanel(false); setShowHistory(false); } }; checkMobile(); window.addEventListener('resize', checkMobile); return () => window.removeEventListener('resize', checkMobile); }, [setShowPromptPanel, setShowHistory]); // 定期清理旧的历史记录 useEffect(() => { const interval = setInterval(() => { useAppStore.getState().cleanupOldHistory(); }, 30000); // 每30秒清理一次 return () => clearInterval(interval); }, []); // 定期清理未使用的Blob URL useEffect(() => { const interval = setInterval(() => { useAppStore.getState().scheduleBlobCleanup(); }, 60000); // 每分钟清理一次 return () => clearInterval(interval); }, []); // 控制预览窗口的显示和隐藏动画 useEffect(() => { if (hoveredImage) { // 延迟一小段时间后设置为可见,以触发动画 const timer = setTimeout(() => { setIsPreviewVisible(true); }, 10); return () => clearTimeout(timer); } else { setIsPreviewVisible(false); } }, [hoveredImage]); return (