✨ feat(vscode): 注释卡片可按规范重写注释

This commit is contained in:
cruldra committed 2026-10-03 03:22:20 +08:00
1 parent 724c81188c
commit 299acb979f
11 files changed
+717 -5

No files matched your search

+17 -1
View File
@@ -37,6 +37,9 @@ export function App(): ReactElement | null {
// 先于下面发 ready 的那个 effect 挂上收消息:ready 后扩展端马上发问答
const qa = useQa()
const [doc, setDoc] = useState<DocumentMessage | null>(null)
/** 正在按注释规范重写的块(记号)。点下去立刻记上,扩展端写完或失败再发 commentRewritten */
const rewritingRef = useRef(new Set<string>())
const [rewriting, setRewriting] = useState<ReadonlySet<string>>(NONE)
const [view, setView] = useState<BlockModes>(savedBlockModes)
const [focusId, setFocusId] = useState<string | null>(null)
/** 等着滚过去的位置:新预览第一份文档带的,或已开着的预览收到的 reveal */
@@ -114,6 +117,10 @@ export function App(): ReactElement | null {
return
case 'diff':
setDiff(msg.diff)
return
case 'commentRewritten':
rewritingRef.current.delete(msg.anchor)
setRewriting(new Set(rewritingRef.current))
}
})
postMessage({ type: 'ready' })
@@ -126,6 +133,13 @@ export function App(): ReactElement | null {
}, [view])
const onFocused = useCallback(() => setFocusId(null), [])
const onRewriteComment = useCallback((anchor: string) => {
if (rewritingRef.current.has(anchor))
return
rewritingRef.current.add(anchor)
setRewriting(new Set(rewritingRef.current))
postMessage({ type: 'rewriteComment', anchor })
}, [])
const kindNames = useMemo(() => new Map(doc?.attributes.find(attribute => attribute.id === 'kind')?.values.map(value => [value.id, value.name])), [doc])
const kindName = useCallback((kind: string) => kindNames.get(kind) ?? kind, [kindNames])
const tree = useMemo((): BlockTreeState | null => doc && {
@@ -147,11 +161,13 @@ export function App(): ReactElement | null {
},
onToggleFold: id => setFolded([id], !collapsed.has(id)),
onSetFolds: folds => setView(prev => ({ ...prev, folds: { ...prev.folds, ...folds } })),
rewriting,
onRewriteComment,
...(qa.state.available && { qa }),
...(changes && { diff: changes }),
...(folded && { folded }),
onOpenRun: id => setOpenedRuns(prev => new Set([...prev, id])),
}, [doc, view, collapsed, filter, covered, kindName, focusId, onFocused, setFolded, qa, changes, folded])
}, [doc, view, collapsed, filter, covered, kindName, focusId, onFocused, setFolded, rewriting, onRewriteComment, qa, changes, folded])
if (!doc || !tree)
return null