Add edit comment in plan and diff panel (#328)

* feat: add view ready and destroy callbacks to CodeMirrorEditor

Provide onViewReady callback that receives the EditorView once created
Provide onViewDestroy callback invoked when the editor is destroyed

* feat: render inline drafts in PlanView with portal

Add editorView state to track the active CodeMirror instance
Render inline drafts through a portal anchored to the editor scroll container
Position drafts relative to the corresponding start line in the editor

* feat(PierreDiffViewer): enable editing inline diff drafts

Enable editing of existing inline diff drafts with draftID handling
Auto-focus comment input when opening editor and place cursor at end

* feat: enable editing inline drafts and auto focus

Enable editing of existing inline drafts via new editingDraftId state and updateDraft
Auto focus the comment input and place cursor at end when a line is selected
Add edit action button in the inline actions bar to start editing

* feat: add updateDraft to inline comment drafts store

Add updateDraft action to modify a specific draft by session and id
Merge updates into the target draft without altering other fields
Retains existing draft management actions like remove and clear
This commit is contained in:
Nelson Pires
2026-02-06 02:51:03 +02:00
committed by GitHub
parent fd08cc4e5d
commit 16d7a1820b
4 changed files with 217 additions and 39 deletions
@@ -24,6 +24,7 @@ interface InlineCommentDraftState {
interface InlineCommentDraftActions {
addDraft: (draft: Omit<InlineCommentDraft, 'id' | 'createdAt'>) => void;
updateDraft: (sessionKey: string, draftId: string, updates: Partial<Omit<InlineCommentDraft, 'id' | 'createdAt' | 'sessionKey'>>) => void;
removeDraft: (sessionKey: string, draftId: string) => void;
clearDrafts: (sessionKey: string) => void;
getDrafts: (sessionKey: string) => InlineCommentDraft[];
@@ -61,6 +62,28 @@ export const useInlineCommentDraftStore = create<InlineCommentDraftStore>()(
return id;
},
updateDraft: (sessionKey, draftId, updates) => {
set((state) => {
const currentDrafts = state.drafts[sessionKey] ?? [];
const newDrafts = currentDrafts.map((draft) => {
if (draft.id !== draftId) {
return draft;
}
return {
...draft,
...updates,
};
});
return {
drafts: {
...state.drafts,
[sessionKey]: newDrafts,
},
};
});
},
removeDraft: (sessionKey, draftId) => {
set((state) => {
const currentDrafts = state.drafts[sessionKey] ?? [];