import { useApp } from '../context/AppContext.js'; import ProjectHeader from '../components/ProjectHeader.jsx'; import { useAvailableTranslations } from '../hooks/useAvailableTranslations.js'; import { bookOptions, formatChunkReference } from '../utils/bibleUtils.jsx'; function SetupForm({ setup, availableTranslations, titleEdited, loadingChapter, errorMessage, hideTitle, onField, onTitleChange, onLoad }) { return (
{!hideTitle && (

Project Setup

Pick a translation, chapter, and title. Load the chapter to begin structuring your study into chunks.

)}
{!hideTitle && ( )}
{errorMessage ? {errorMessage} : 'Start by loading the chapter text from HelloAO.'}
); } export default function SetupPage() { const { project, setup, titleEdited, setTitleEdited, activeChapterIndex, setActiveChapterIndex, activeChapter, showAddChapterForm, setShowAddChapterForm, rangeStart, setRangeStart, rangeEnd, setRangeEnd, verseSearch, setVerseSearch, typedChunkStart, setTypedChunkStart, typedChunkEnd, setTypedChunkEnd, typedChunkNextEnd, setTypedChunkNextEnd, typedChunkBulk, setTypedChunkBulk, clickedSpanNextEnd, setClickedSpanNextEnd, loadingChapter, errorMessage, statusMessage, allChunks, handleSetupField, handleLoadChapter, beginStudying, handleVerseClick, addTypedChunk, addBulkTypedChunks, addClickSpanChunk, moveChunk, deleteChunk, updateProject, } = useApp(); const availableTranslations = useAvailableTranslations(); const chapterTabs = project?.chapters ?? []; return (

Bible Study Project

{project ? project.title : 'New Study'}

{/* Project setup form — shown when no project loaded yet */} {!project && (
{ setTitleEdited(true); handleSetupField('title', val); }} onLoad={handleLoadChapter} />
)} {/* Chapter tabs + verse/chunk editors */} {project && (
{/* Chapter tabs */}
{chapterTabs.map((ch, idx) => ( ))}
{/* Add-chapter form */} {showAddChapterForm && (

Add another chapter

{ setTitleEdited(true); handleSetupField('title', val); }} onLoad={handleLoadChapter} />
)} {/* Verse + chunk panel for active chapter */} {activeChapter && (

Scripture & Chunks

{activeChapter.book} {activeChapter.chapter} ({project.translation})

{statusMessage || 'Click/shift-click, or type a verse range, to create a chunk.'}
Chapter verses Click a verse, then shift-click an end verse.
setVerseSearch(e.target.value)} placeholder="Search verses in this chapter…" className="mb-3 block w-full rounded-xl border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-200" />
{activeChapter.verses .filter((verse) => verse.text.toLowerCase().includes(verseSearch.trim().toLowerCase())) .map((verse) => { const inRange = rangeStart !== null && verse.number >= Math.min(rangeStart, rangeEnd) && verse.number <= Math.max(rangeStart, rangeEnd); const inOwnChapterChunk = activeChapter.chunks.some( (chunk) => verse.number >= chunk.startVerse && verse.number <= chunk.endVerse, ); const prevChapter = project?.chapters?.[activeChapterIndex - 1] ?? null; const inPrevChapterSpillover = prevChapter ? prevChapter.chunks.some((chunk) => Number.isInteger(chunk.spilloverEndVerse) && prevChapter.bookAbbrev === activeChapter.bookAbbrev && verse.number <= chunk.spilloverEndVerse ) : false; const inChunk = inOwnChapterChunk || inPrevChapterSpillover; return ( ); })}

Chunks

{activeChapter.chunks.length} created

Type chunk range