feat: canvas UX fixes — scroll, fullscreen, InfoTip tooltips, answer stub system #80

Merged
chihlasm merged 28 commits from feature/tree-editor-canvas into main 2026-02-18 17:52:08 +00:00
Showing only changes of commit 239be5017f - Show all commits

View File

@@ -1,4 +1,4 @@
import { useState, useCallback } from 'react'
import { useState, useCallback, useEffect } from 'react'
import {
HelpCircle,
Zap,
@@ -97,13 +97,22 @@ export function TreeCanvasNode({
cloneNodeWithoutChildren(node)
)
// Reset draft if node changes while editing (e.g. store update from undo)
// Reset draft if node ID changes (e.g. navigating between nodes)
const [lastNodeId, setLastNodeId] = useState(node.id)
if (node.id !== lastNodeId) {
setDraft(cloneNodeWithoutChildren(node))
setLastNodeId(node.id)
}
// Re-sync draft from store whenever the card is opened, so stale next_node_id
// values (written back after stub creation) don't cause duplicate stubs on re-save
useEffect(() => {
if (isExpanded) {
setDraft(cloneNodeWithoutChildren(node))
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isExpanded])
const handleDraftUpdate = useCallback((updates: Partial<TreeStructure>) => {
setDraft((prev) => ({ ...prev, ...updates }))
}, [])