'use client' import { useState, useEffect, useCallback } from 'react' import { BPIcon } from '@/components/Logo' import { useTheme } from '@/lib/ThemeContext' import { Sidebar } from '@/components/Sidebar' import { OnboardingWizard, OnboardingData } from '@/components/OnboardingWizard' import { ChatOverlay } from '@/components/ChatOverlay' import { AiPrompt } from '@/components/AiPrompt' import { Footer } from '@/components/Footer' import { BackgroundBlobs } from './_components/BackgroundBlobs' import { HeaderBar } from './_components/HeaderBar' import { DashboardContent } from './_components/DashboardContent' import { DocumentsTab } from './_components/DocumentsTab' import { UploadModal, QRModal } from './_components/UploadModals' // LocalStorage Keys const ONBOARDING_KEY = 'bp_onboarding_complete' const USER_DATA_KEY = 'bp_user_data' const DOCUMENTS_KEY = 'bp_documents' const FIRST_VISIT_KEY = 'bp_first_dashboard_visit' const SESSION_ID_KEY = 'bp_session_id' interface StoredDocument { id: string name: string type: string size: number uploadedAt: Date url?: string } export default function HomePage() { const [selectedTab, setSelectedTab] = useState('dashboard') const [showOnboarding, setShowOnboarding] = useState(null) const [userData, setUserData] = useState(null) const [documents, setDocuments] = useState([]) const [showUploadModal, setShowUploadModal] = useState(false) const [showQRModal, setShowQRModal] = useState(false) const [isFirstVisit, setIsFirstVisit] = useState(false) const [sessionId, setSessionId] = useState('') const [showAlertsDropdown, setShowAlertsDropdown] = useState(false) const { isDark } = useTheme() // Funktion zum Laden von Uploads aus der API const fetchUploadsFromAPI = useCallback(async (sid: string) => { if (!sid) return try { const response = await fetch(`/api/uploads?sessionId=${encodeURIComponent(sid)}`) if (response.ok) { const data = await response.json() if (data.uploads && data.uploads.length > 0) { const apiDocs: StoredDocument[] = data.uploads.map((u: any) => ({ id: u.id, name: u.name, type: u.type, size: u.size, uploadedAt: new Date(u.uploadedAt), url: u.dataUrl })) setDocuments(prev => { const existingIds = new Set(prev.map(d => d.id)) const newDocs = apiDocs.filter(d => !existingIds.has(d.id)) return newDocs.length > 0 ? [...prev, ...newDocs] : prev }) } } } catch (error) { console.error('Error fetching uploads:', error) } }, []) // Prüfe beim Laden, ob Onboarding abgeschlossen ist useEffect(() => { const onboardingComplete = localStorage.getItem(ONBOARDING_KEY) const storedUserData = localStorage.getItem(USER_DATA_KEY) const storedDocs = localStorage.getItem(DOCUMENTS_KEY) const firstVisit = localStorage.getItem(FIRST_VISIT_KEY) let storedSessionId = localStorage.getItem(SESSION_ID_KEY) if (!storedSessionId) { storedSessionId = `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}` localStorage.setItem(SESSION_ID_KEY, storedSessionId) } setSessionId(storedSessionId) if (onboardingComplete === 'true' && storedUserData) { setUserData(JSON.parse(storedUserData)) setShowOnboarding(false) if (storedDocs) setDocuments(JSON.parse(storedDocs)) if (!firstVisit) { setIsFirstVisit(true) localStorage.setItem(FIRST_VISIT_KEY, 'true') } fetchUploadsFromAPI(storedSessionId) } else { setShowOnboarding(true) } }, [fetchUploadsFromAPI]) // Polling fuer neue Uploads useEffect(() => { if (!sessionId || showOnboarding) return const interval = setInterval(() => fetchUploadsFromAPI(sessionId), 3000) return () => clearInterval(interval) }, [sessionId, showOnboarding, fetchUploadsFromAPI]) // Dokumente in localStorage speichern useEffect(() => { if (documents.length > 0) { localStorage.setItem(DOCUMENTS_KEY, JSON.stringify(documents)) } }, [documents]) const handleUploadComplete = (uploadedDocs: any[]) => { const newDocs: StoredDocument[] = uploadedDocs.map(d => ({ id: d.id, name: d.name, type: d.type, size: d.size, uploadedAt: d.uploadedAt, url: d.url })) setDocuments(prev => [...prev, ...newDocs]) setIsFirstVisit(false) } const handleDeleteDocument = async (id: string) => { setDocuments(prev => prev.filter(d => d.id !== id)) try { await fetch(`/api/uploads?id=${encodeURIComponent(id)}`, { method: 'DELETE' }) } catch (error) { console.error('Error deleting from API:', error) } } const handleRenameDocument = (id: string, newName: string) => { setDocuments(prev => prev.map(d => d.id === id ? { ...d, name: newName } : d)) } const handleOnboardingComplete = (data: OnboardingData) => { localStorage.setItem(ONBOARDING_KEY, 'true') localStorage.setItem(USER_DATA_KEY, JSON.stringify(data)) setUserData(data) setShowOnboarding(false) } // Loading screen if (showOnboarding === null) { return (
Laden...
) } if (showOnboarding) { return } return (
{/* Welcome message for first visit */} {isFirstVisit && documents.length === 0 && (
🎉

Willkommen bei BreakPilot Studio!

Grossartig, dass Sie hier sind! Laden Sie jetzt Ihr erstes Dokument hoch, um die KI-gestuetzte Korrektur zu erleben. Sie koennen Dateien von Ihrem Computer oder Mobiltelefon hochladen.

)} {selectedTab === 'dokumente' ? ( ) : ( )}
{showUploadModal && ( setShowUploadModal(false)} onGoToDocuments={() => { setShowUploadModal(false); setSelectedTab('dokumente') }} /> )} {showQRModal && setShowQRModal(false)} />}
) }