feat: Presenter Vor/Zurück-Spulen mit Folien-Sync

- prevSlide() in usePresenterMode: springt zur vorherigen Folie,
  stoppt aktuelle Audio, startet Präsentation der vorherigen Folie
- SkipBack Button in PresenterOverlay neben SkipForward
- Beide Buttons springen zur korrekten Folie UND starten die Audio

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-27 21:57:23 +01:00
parent 1bd57da627
commit b5d855d117
3 changed files with 29 additions and 1 deletions

View File

@@ -251,6 +251,7 @@ export default function PitchDeck({ lang, onToggleLanguage }: PitchDeckProps) {
onResume={presenter.resume}
onStop={presenter.stop}
onSkip={presenter.skipSlide}
onPrev={presenter.prevSlide}
isSpeaking={presenter.isSpeaking}
ttsAvailable={presenter.ttsAvailable}
ttsEnabled={presenter.ttsEnabled}

View File

@@ -1,7 +1,7 @@
'use client'
import { motion, AnimatePresence } from 'framer-motion'
import { Play, Pause, Square, SkipForward, Volume2, VolumeX } from 'lucide-react'
import { Play, Pause, Square, SkipForward, SkipBack, Volume2, VolumeX } from 'lucide-react'
import { Language } from '@/lib/types'
import { PresenterState } from '@/lib/presenter/types'
import { SLIDE_ORDER } from '@/lib/hooks/useSlideNavigation'
@@ -18,6 +18,7 @@ interface PresenterOverlayProps {
onResume: () => void
onStop: () => void
onSkip: () => void
onPrev?: () => void
isSpeaking?: boolean
ttsAvailable?: boolean
ttsEnabled?: boolean
@@ -35,6 +36,7 @@ export default function PresenterOverlay({
onResume,
onStop,
onSkip,
onPrev,
isSpeaking,
ttsAvailable,
ttsEnabled = true,
@@ -108,6 +110,15 @@ export default function PresenterOverlay({
</button>
)}
<button
onClick={onPrev}
className="w-7 h-7 rounded-full bg-white/10 flex items-center justify-center
hover:bg-white/20 transition-colors"
title={lang === 'de' ? 'Vorherige Folie' : 'Previous slide'}
>
<SkipBack className="w-3.5 h-3.5 text-white/60" />
</button>
<button
onClick={onSkip}
className="w-7 h-7 rounded-full bg-white/10 flex items-center justify-center

View File

@@ -22,6 +22,7 @@ interface UsePresenterModeReturn {
pause: () => void
resume: () => void
skipSlide: () => void
prevSlide: () => void
toggle: () => void
displayText: string
progress: number
@@ -386,6 +387,20 @@ export function usePresenterMode({
}
}, [cancelAll, totalSlides, goToSlide])
const prevSlide = useCallback(() => {
cancelAll()
const prevIdx = slideIndexRef.current - 1
if (prevIdx >= 0) {
goToSlide(prevIdx)
slideIndexRef.current = prevIdx
if (stateRef.current === 'presenting' || stateRef.current === 'paused') {
setState('presenting')
stateRef.current = 'presenting'
playSlideRef.current(prevIdx)
}
}
}, [cancelAll, goToSlide])
const toggle = useCallback(() => {
unlockAudio()
if (stateRef.current === 'idle') {
@@ -422,6 +437,7 @@ export function usePresenterMode({
pause,
resume,
skipSlide,
prevSlide,
toggle,
displayText,
progress,