🐛 fix(vscode): issue/patch 用 null 清空 worktree 字段以便 webview 即时刷新
This commit is contained in:
@@ -541,16 +541,16 @@ export async function handleColumnChange(panel: KanbanWebviewPanel, issueNumber:
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. 全部成功 → 增量推 done + 清掉 worktreePath/branch + 标记 prMerged。
|
// 6. 全部成功 → 增量推 done + 用 null 清空 worktreePath/branch(postMessage 会丢 undefined key)
|
||||||
// webview 端 `{ ...issue, ...patch }` spread 会把 worktreePath 覆盖成
|
// 并带 worktreeExists: false,详情「工作树」行即时变为只读/—。
|
||||||
// undefined,详情面板的 worktree 链接行因此消失。
|
|
||||||
panel.postMessage({
|
panel.postMessage({
|
||||||
type: 'issue/patch',
|
type: 'issue/patch',
|
||||||
issueNumber,
|
issueNumber,
|
||||||
patch: {
|
patch: {
|
||||||
column: 'done',
|
column: 'done',
|
||||||
worktreePath: undefined,
|
worktreePath: null,
|
||||||
branch: undefined,
|
branch: null,
|
||||||
|
worktreeExists: false,
|
||||||
prMerged: true,
|
prMerged: true,
|
||||||
prMergedAt: pullRequest.merged_at ?? new Date().toISOString(),
|
prMergedAt: pullRequest.merged_at ?? new Date().toISOString(),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -144,12 +144,13 @@ export async function handleDeleteWorktree(panel: KanbanWebviewPanel, issueNumbe
|
|||||||
token,
|
token,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// null 才能过 postMessage 序列化;undefined 会被丢掉,webview 合并不清字段
|
||||||
panel.postMessage({
|
panel.postMessage({
|
||||||
type: 'issue/patch',
|
type: 'issue/patch',
|
||||||
issueNumber,
|
issueNumber,
|
||||||
patch: {
|
patch: {
|
||||||
worktreePath: undefined,
|
worktreePath: null,
|
||||||
branch: undefined,
|
branch: null,
|
||||||
worktreeExists: false,
|
worktreeExists: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export type ExtensionToWebview
|
|||||||
= | { type: 'issues/loading' }
|
= | { type: 'issues/loading' }
|
||||||
| { type: 'issues/update', issues: Issue[], globalAutoReview: boolean, youtrackConfigured: boolean }
|
| { type: 'issues/update', issues: Issue[], globalAutoReview: boolean, youtrackConfigured: boolean }
|
||||||
| { type: 'issues/error', message: string }
|
| { type: 'issues/error', message: string }
|
||||||
| { type: 'issue/patch', issueNumber: number, patch: { autoReview?: boolean, specFile?: string, planFile?: string, prDiffFile?: string, sessionId?: string, implementSessionId?: string, reviewSessionId?: string, testSessionId?: string, pr?: string, implementStatus?: 'running' | 'done' | 'failed', column?: IssueColumn, worktreePath?: string, prMerged?: boolean, prMergedAt?: string, branch?: string, color?: string, worktreeExists?: boolean, brainstormTabOpen?: boolean, implementTabOpen?: boolean, reviewTabOpen?: boolean, testTabOpen?: boolean, profilePath?: string, brainstormProfilePath?: string, testProfilePath?: string } }
|
| { type: 'issue/patch', issueNumber: number, patch: { autoReview?: boolean, specFile?: string, planFile?: string, prDiffFile?: string, sessionId?: string, implementSessionId?: string, reviewSessionId?: string, testSessionId?: string, pr?: string | null, implementStatus?: 'running' | 'done' | 'failed', column?: IssueColumn, worktreePath?: string | null, prMerged?: boolean, prMergedAt?: string, branch?: string | null, color?: string, worktreeExists?: boolean, brainstormTabOpen?: boolean, implementTabOpen?: boolean, reviewTabOpen?: boolean, testTabOpen?: boolean, profilePath?: string, brainstormProfilePath?: string, testProfilePath?: string } }
|
||||||
| { type: 'issue/pr-diff-summary-done', issueNumber: number }
|
| { type: 'issue/pr-diff-summary-done', issueNumber: number }
|
||||||
| { type: 'issue/append', issue: Issue, select?: boolean }
|
| { type: 'issue/append', issue: Issue, select?: boolean }
|
||||||
| { type: 'issue/select-by-number', issueNumber: number }
|
| { type: 'issue/select-by-number', issueNumber: number }
|
||||||
|
|||||||
@@ -1062,7 +1062,8 @@ class WebhookCoordinator {
|
|||||||
this.activePanel.postMessage({
|
this.activePanel.postMessage({
|
||||||
type: 'issue/patch',
|
type: 'issue/patch',
|
||||||
issueNumber: event.issueNumber,
|
issueNumber: event.issueNumber,
|
||||||
patch: { pr: undefined },
|
// null 才能过 postMessage;undefined 会被序列化丢掉
|
||||||
|
patch: { pr: null },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
|
|||||||
@@ -23,6 +23,16 @@ import type { LogEntry } from '../lib/messages'
|
|||||||
import { compareIssuesInColumn } from '../lib/issueSort'
|
import { compareIssuesInColumn } from '../lib/issueSort'
|
||||||
import { onMessage, postMessage } from '../lib/vscode'
|
import { onMessage, postMessage } from '../lib/vscode'
|
||||||
|
|
||||||
|
/** postMessage 用 null 清空 optional 字段;合并时 delete 还原 optional,避免残留 null */
|
||||||
|
function applyIssuePatch(issue: Issue, patch: Record<string, unknown>): Issue {
|
||||||
|
const next = { ...issue, ...patch } as Issue & Record<string, unknown>
|
||||||
|
for (const [k, v] of Object.entries(patch)) {
|
||||||
|
if (v === null)
|
||||||
|
delete next[k]
|
||||||
|
}
|
||||||
|
return next as Issue
|
||||||
|
}
|
||||||
|
|
||||||
export interface SettingsValues {
|
export interface SettingsValues {
|
||||||
host: string
|
host: string
|
||||||
token: string
|
token: string
|
||||||
@@ -560,7 +570,7 @@ export function useIssues(): UseIssuesResult {
|
|||||||
return {
|
return {
|
||||||
status: 'ready',
|
status: 'ready',
|
||||||
issues: prev.issues.map(i =>
|
issues: prev.issues.map(i =>
|
||||||
i.number === msg.issueNumber ? { ...i, ...msg.patch } : i,
|
i.number === msg.issueNumber ? applyIssuePatch(i, msg.patch) : i,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export type ExtensionToWebview
|
|||||||
= | { type: 'issues/loading' }
|
= | { type: 'issues/loading' }
|
||||||
| { type: 'issues/update', issues: Issue[], globalAutoReview: boolean, youtrackConfigured: boolean }
|
| { type: 'issues/update', issues: Issue[], globalAutoReview: boolean, youtrackConfigured: boolean }
|
||||||
| { type: 'issues/error', message: string }
|
| { type: 'issues/error', message: string }
|
||||||
| { type: 'issue/patch', issueNumber: number, patch: { autoReview?: boolean, specFile?: string, planFile?: string, prDiffFile?: string, sessionId?: string, implementSessionId?: string, reviewSessionId?: string, testSessionId?: string, pr?: string, implementStatus?: 'running' | 'done' | 'failed', column?: IssueColumn, worktreePath?: string, prMerged?: boolean, prMergedAt?: string, branch?: string, color?: string, worktreeExists?: boolean, brainstormTabOpen?: boolean, implementTabOpen?: boolean, reviewTabOpen?: boolean, testTabOpen?: boolean, profilePath?: string, brainstormProfilePath?: string, testProfilePath?: string } }
|
| { type: 'issue/patch', issueNumber: number, patch: { autoReview?: boolean, specFile?: string, planFile?: string, prDiffFile?: string, sessionId?: string, implementSessionId?: string, reviewSessionId?: string, testSessionId?: string, pr?: string | null, implementStatus?: 'running' | 'done' | 'failed', column?: IssueColumn, worktreePath?: string | null, prMerged?: boolean, prMergedAt?: string, branch?: string | null, color?: string, worktreeExists?: boolean, brainstormTabOpen?: boolean, implementTabOpen?: boolean, reviewTabOpen?: boolean, testTabOpen?: boolean, profilePath?: string, brainstormProfilePath?: string, testProfilePath?: string } }
|
||||||
| { type: 'issue/pr-diff-summary-done', issueNumber: number }
|
| { type: 'issue/pr-diff-summary-done', issueNumber: number }
|
||||||
| { type: 'issue/append', issue: Issue, select?: boolean }
|
| { type: 'issue/append', issue: Issue, select?: boolean }
|
||||||
| { type: 'issue/select-by-number', issueNumber: number }
|
| { type: 'issue/select-by-number', issueNumber: number }
|
||||||
|
|||||||
Reference in New Issue
Block a user