import { ContentEditable } from "@common/components/ContentEditable"; import { highlight } from "@common/highlight"; import { useMemo } from "preact/hooks"; import styles from "../../assets/chapters-editor.module.css"; import { useAppState } from "../../contexts/state"; import Chapters from "../../utils/chapters"; export const ChaptersEditor = () => { const { currentWorld, currentStory, dispatch } = useAppState(); if (!currentStory) return null; const parsed = useMemo( () => Chapters.parseText(currentStory.text), [currentStory.text] ); if (parsed.length === 0) { return (

No chapters yet. Use # Chapter Title headers in your story to create chapters.

); } return (
{parsed.map((parsedChapter) => { const chunks = Chapters.splitIntoChunks(parsedChapter.body); const cachedChapter = (currentStory.chapters ?? []).find(c => c.header === parsedChapter.header) ?? Chapters.emptyChapter(parsedChapter.header); return (
{parsedChapter.header ? parsedChapter.header.replace(/^# /, '') : '(Preamble)'}
{chunks.map((body, i) => { const { hash, summary } = Chapters.lookupSummary(cachedChapter, body); return (
{chunks.length > 1 && (
Part {i + 1}
)}
{body}
dispatch({ type: 'STORE_CHAPTER_SUMMARY', worldId: currentWorld!.id, storyId: currentStory.id, header: parsedChapter.header, hash, summary: (e.target as HTMLDivElement).textContent || '', })} />
); })}
); })}
); };