-
Listen to BSB Audio
-
- {audioState.status === 'idle' || audioState.status === 'error'
+
+
b.abbrev === audioBook)?.name} — chapter ${audioState.chapter} of ${audioState.total}`}
-
- {audioState.status === 'error' && (
- Couldn't load audio for this book/narrator.
- )}
-
-
-
-
- {audioState.status === 'playing' || audioState.status === 'paused' ? (
+ : `Playing ${bookOptions.find((b) => b.abbrev === audioBook)?.name} — chapter ${audioState.chapter} of ${audioState.total}`
+ }
+ errorMessage="Couldn't load audio for this book/narrator."
+ status={audioState.status}
+ currentTime={audioProgress.currentTime}
+ duration={audioProgress.duration}
+ onPlay={handlePlayBookAudio}
+ onTogglePause={handleToggleBookAudioPause}
+ onSeekBack={() => handleSeekAudio(-10)}
+ onSeekForward={() => handleSeekAudio(10)}
+ onSeekTo={handleSeekAudioTo}
+ onNext={handleSkipBookChapter}
+ nextDisabled={audioState.chapter >= audioState.total}
+ onStop={handleStopBookAudio}
+ controls={(
<>
-
-
-
-
-
+
+
+
+
>
- ) : (
-
)}
-
+ />
{projectIndex
diff --git a/src/pages/ReaderPage.jsx b/src/pages/ReaderPage.jsx
index ba3e54e..af9f083 100644
--- a/src/pages/ReaderPage.jsx
+++ b/src/pages/ReaderPage.jsx
@@ -2,6 +2,7 @@ import { useState, useEffect, useRef, useMemo, useDeferredValue } from 'react';
import { useApp } from '../context/AppContext.js';
import { formatCrossRef, speakOriginalWord } from '../utils/wordStudy.js';
import AuthStatus from '../components/AuthStatus.jsx';
+import AudioPlayer from '../components/AudioPlayer.jsx';
import { bookOptions, BookmarkIcon, CopyIcon } from '../utils/bibleUtils.jsx';
import DrawCanvas from './DrawCanvas.jsx';
@@ -33,6 +34,7 @@ export default function ReaderPage() {
readerSearchActive, setReaderSearchActive,
readerSearchScope, setReaderSearchScope,
readerAudioState,
+ audioProgress,
bibleIndexStatus,
audioNarrator, setAudioNarrator,
_bibleIndexCacheRef,
@@ -48,6 +50,7 @@ export default function ReaderPage() {
handleToggleReaderAudioPause,
handleStopBookAudio,
handleSeekAudio,
+ handleSeekAudioTo,
setReaderCrossRefs,
readerInkByPage,
updateReaderPageInk,
@@ -503,53 +506,34 @@ export default function ReaderPage() {
)}
{/* Audio player */}
-
-
-
Listen to this chapter
-
- {readerAudioState.status === 'error'
+
-
-
- {readerAudioState.status === 'playing' || readerAudioState.status === 'paused' ? (
- <>
-
-
-
-
-
- >
- ) : (
-
+ : `Audio follows ${readerBook?.name} ${readerChapter} as you browse.`
+ }
+ status={readerAudioState.status}
+ currentTime={audioProgress.currentTime}
+ duration={audioProgress.duration}
+ onPlay={handlePlayReaderAudio}
+ onTogglePause={handleToggleReaderAudioPause}
+ onSeekBack={() => handleSeekAudio(-10)}
+ onSeekForward={() => handleSeekAudio(10)}
+ onSeekTo={handleSeekAudioTo}
+ onNext={readerGoToNextChapter}
+ nextDisabled={readerChapter >= readerTotalChapters}
+ onStop={handleStopBookAudio}
+ controls={(
+
)}
-
+ />
{/* Verses — normal scroll mode */}