'use client' import { useCallback, useState } from 'react' import { AnimatePresence } from 'framer-motion' import { useSlideNavigation } from '@/lib/hooks/useSlideNavigation' import { useKeyboard } from '@/lib/hooks/useKeyboard' import { usePitchData } from '@/lib/hooks/usePitchData' import { usePresenterMode } from '@/lib/hooks/usePresenterMode' import { Language, PitchData } from '@/lib/types' import ParticleBackground from './ParticleBackground' import ProgressBar from './ProgressBar' import NavigationControls from './NavigationControls' import NavigationFAB from './NavigationFAB' import ChatFAB from './ChatFAB' import SlideOverview from './SlideOverview' import SlideContainer from './SlideContainer' import PresenterOverlay from './presenter/PresenterOverlay' import AvatarPlaceholder from './presenter/AvatarPlaceholder' import IntroPresenterSlide from './slides/IntroPresenterSlide' import CoverSlide from './slides/CoverSlide' import ProblemSlide from './slides/ProblemSlide' import SolutionSlide from './slides/SolutionSlide' import ProductSlide from './slides/ProductSlide' import HowItWorksSlide from './slides/HowItWorksSlide' import MarketSlide from './slides/MarketSlide' import BusinessModelSlide from './slides/BusinessModelSlide' import TractionSlide from './slides/TractionSlide' import CompetitionSlide from './slides/CompetitionSlide' import TeamSlide from './slides/TeamSlide' import FinancialsSlide from './slides/FinancialsSlide' import TheAskSlide from './slides/TheAskSlide' import AIQASlide from './slides/AIQASlide' import AssumptionsSlide from './slides/AssumptionsSlide' import ArchitectureSlide from './slides/ArchitectureSlide' import GTMSlide from './slides/GTMSlide' import RegulatorySlide from './slides/RegulatorySlide' import EngineeringSlide from './slides/EngineeringSlide' import AIPipelineSlide from './slides/AIPipelineSlide' interface PitchDeckProps { lang: Language onToggleLanguage: () => void } export default function PitchDeck({ lang, onToggleLanguage }: PitchDeckProps) { const { data, loading, error } = usePitchData() const nav = useSlideNavigation() const [fabOpen, setFabOpen] = useState(false) const presenter = usePresenterMode({ goToSlide: nav.goToSlide, currentSlide: nav.currentIndex, totalSlides: nav.totalSlides, language: lang, }) const toggleFullscreen = useCallback(() => { if (!document.fullscreenElement) { document.documentElement.requestFullscreen() } else { document.exitFullscreen() } }, []) const toggleMenu = useCallback(() => { setFabOpen(prev => !prev) }, []) useKeyboard({ onNext: nav.nextSlide, onPrev: nav.prevSlide, onFirst: nav.goToFirst, onLast: nav.goToLast, onOverview: nav.toggleOverview, onFullscreen: toggleFullscreen, onLanguageToggle: onToggleLanguage, onMenuToggle: toggleMenu, onPresenterToggle: presenter.toggle, onGoToSlide: nav.goToSlide, enabled: !nav.showOverview, }) if (loading) { return (

{lang === 'de' ? 'Lade Pitch-Daten...' : 'Loading pitch data...'}

) } if (error || !data) { return (

{lang === 'de' ? 'Fehler beim Laden' : 'Loading error'}

{error || 'No data'}

) } function renderSlide() { if (!data) return null switch (nav.currentSlide) { case 'intro-presenter': return ( ) case 'cover': return case 'problem': return case 'solution': return case 'product': return case 'how-it-works': return case 'market': return case 'business-model': return case 'traction': return case 'competition': return case 'team': return case 'financials': return case 'the-ask': return case 'ai-qa': return case 'annex-assumptions': return case 'annex-architecture': return case 'annex-gtm': return case 'annex-regulatory': return case 'annex-engineering': return case 'annex-aipipeline': return default: return null } } return (
{renderSlide()} {/* Presenter UI */} {nav.showOverview && ( nav.setShowOverview(false)} lang={lang} /> )}
) }