import { useEffect, useMemo, useState } from 'react'; import type { CustomWorldDraftCardDetail } from '../../../packages/shared/src/contracts/customWorldAgent'; type CustomWorldDraftEditPanelProps = { detail: CustomWorldDraftCardDetail; disabled?: boolean; onSave: ( sections: Array<{ sectionId: string; value: string; }>, ) => void; onCancel: () => void; }; function shouldUseTextarea(sectionId: string, value: string) { const sceneActField = sectionId.match(/^act:[^:]+:(.+)$/u)?.[1] ?? null; return ( value.length > 28 || value.includes('\n') || sectionId === 'summary' || sectionId === 'tone' || sectionId === 'coreConflicts' || sectionId === 'hiddenHook' || sectionId === 'secret' || sectionId === 'stakes' || sectionId === 'openingEvent' || sectionId === 'understandingShift' || sectionId === 'description' || sceneActField === 'summary' || sceneActField === 'encounterNpcIds' || sceneActField === 'actGoal' || sceneActField === 'transitionHook' ); } export function CustomWorldDraftEditPanel({ detail, disabled = false, onSave, onCancel, }: CustomWorldDraftEditPanelProps) { const editableSections = useMemo( () => detail.sections.filter((section) => detail.editableSectionIds.includes(section.id), ), [detail], ); const [draftValues, setDraftValues] = useState>(() => Object.fromEntries( editableSections.map((section) => [section.id, section.value]), ), ); useEffect(() => { setDraftValues( Object.fromEntries(editableSections.map((section) => [section.id, section.value])), ); }, [editableSections]); if (editableSections.length === 0) { return null; } return (
{editableSections.map((section) => { const value = draftValues[section.id] ?? ''; const multiline = shouldUseTextarea(section.id, value); return (