Connect reading plans to study/audio, cache offline audio, add journal export
Build and Push Docker Image / build-and-push (push) Successful in 4m33s
Build and Push Docker Image / build-and-push (push) Successful in 4m33s
Reading plan days now offer "Study this" (seeds a new chunk-builder project with the day's full passage and jumps straight into the Study editor) and "Listen" (starts book-mode audio at the right chapter via a new handlePlayBookAudioFrom, avoiding a stale-closure bug the reader-state approach would hit). Fixed the "Listen to BSB Audio" player only rendering when a study project existed, leaving Listen with nowhere to show up. The service worker now caches audio.bible.helloao.org (the actual host serving narrator audio, not just the text/cross-ref API) and no longer tries to cache 206 Partial Content responses, which the Cache API rejects and was throwing unhandled rejections for every range-requested audio file. Added a reading journal export (Settings > My reading journal): gathers bookmarks, text highlights, and completed plans, fetches their verse text, and offers a .docx download or a print-to-PDF page. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1dd6aef6a5
commit
787edcbe73
8 files changed
+604
-105
No files matched your search
@@ -67,6 +67,20 @@ export function useAudio(readerBookAbbrev, readerChapter) {
|
||||
}
|
||||
};
|
||||
|
||||
// Starts book-mode playback at an arbitrary chapter (e.g. a reading plan's
|
||||
// "today" chapter) instead of always chapter 1. Explicit args avoid relying
|
||||
// on reader state that may not have re-rendered yet if called right after
|
||||
// navigating there in the same event handler.
|
||||
const handlePlayBookAudioFrom = async (abbrev, startChapter) => {
|
||||
audioModeRef.current = 'book';
|
||||
setAudioBook(abbrev);
|
||||
try {
|
||||
await playAudioChapter(abbrev, startChapter, audioNarrator);
|
||||
} catch {
|
||||
setAudioState({ status: 'error', chapter: 0, total: 0 });
|
||||
}
|
||||
};
|
||||
|
||||
const handleStopBookAudio = () => {
|
||||
if (audioRef.current) {
|
||||
audioRef.current.pause();
|
||||
@@ -161,6 +175,7 @@ export function useAudio(readerBookAbbrev, readerChapter) {
|
||||
audioState,
|
||||
audioProgress,
|
||||
handlePlayBookAudio,
|
||||
handlePlayBookAudioFrom,
|
||||
handleStopBookAudio,
|
||||
handleToggleBookAudioPause,
|
||||
handleSkipBookChapter,
|
||||
|
||||
Reference in new issue
Block a user