✨ feat(vscode): 摘修复按 PR 分组框选,可搜作者和标题

This commit is contained in:
cruldra committed 2026-09-01 17:27:27 +08:00
1 parent 0031851df3
commit 3e3750c494
9 files changed
+353 -42

No files matched your search

+19 -2
View File
@@ -17,7 +17,7 @@
*/
import type { ToastItem } from '../components/ToastStack'
import type { ExtensionToWebview, LogEntry } from '../lib/messages'
import type { ExtensionToWebview, LogEntry, ReleaseCommitGroup } from '../lib/messages'
import type { Issue, IssueColumn } from '../types'
import { useCallback, useEffect, useRef, useState } from 'react'
import { compareIssuesInColumn } from '../lib/issueSort'
@@ -246,6 +246,10 @@ export interface UseIssuesResult {
release: ReleaseStatus | undefined
/** 发布按钮三个动作;running 由扩展侧状态决定,webview 不自置。 */
runRelease: (action: ReleaseAction) => void
/** 摘修复选单:扩展推来分组后的未发布提交。 */
cherryPick: { branch: string, groups: ReleaseCommitGroup[] } | null
dismissCherryPick: () => void
confirmCherryPick: (shas: string[]) => void
/**
* Whether the workspace's `.env*` files are currently chmod-locked
* according to `workspaceState`. Persisted per-workspace.
@@ -336,6 +340,7 @@ export function useIssues(): UseIssuesResult {
const [commitRunning, setCommitRunning] = useState<boolean>(false)
const [hasChanges, setHasChanges] = useState<boolean>(false)
const [release, setRelease] = useState<ReleaseStatus>()
const [cherryPick, setCherryPick] = useState<{ branch: string, groups: ReleaseCommitGroup[] } | null>(null)
const [envLocked, setEnvLocked] = useState<boolean>(false)
const [envFileCount, setEnvFileCount] = useState<number>(0)
const [envLockRunning, setEnvLockRunning] = useState<boolean>(false)
@@ -656,6 +661,15 @@ export function useIssues(): UseIssuesResult {
postMessage({ type: `release/${action}` })
}, [])
const dismissCherryPick = useCallback((): void => {
setCherryPick(null)
}, [])
const confirmCherryPick = useCallback((shas: string[]): void => {
setCherryPick(null)
postMessage({ type: 'release/cherry-pick-confirm', shas })
}, [])
const toggleEnvLock = useCallback((): void => {
// Double-click guard — the next `env-lock/status` clears the running flag.
if (envLockRunning)
@@ -845,6 +859,9 @@ export function useIssues(): UseIssuesResult {
case 'release/status':
setRelease(msg)
break
case 'release/pick-show':
setCherryPick({ branch: msg.branch, groups: msg.groups })
break
case 'env-lock/status': {
setEnvLocked(msg.locked)
setEnvFileCount(msg.fileCount)
@@ -873,5 +890,5 @@ export function useIssues(): UseIssuesResult {
return cleanup
}, [clearPrDiffSummaryRunning, markHandoffRunning])
return { state, settings, globalAutoReview, youtrackConfigured, importYouTrack, toasts, profiles, setIssues, refresh, scope, toggleScope, saveSettings, listYouTrackProjects, youtrackProjects, dismissSettings, requestEditAuth, createIssue, dismissToast, openUrl, resumeSession, resumeReviewSession, startTestSession, resumeTestSession, focusSession, openFile, implement, generatePrDiffSummary, isPrDiffSummaryRunning, openPr, openWorktree, deleteWorktree, mergeBranch, deleteIssue, closeIssue, closeSessionTab, startBrainstormSession, changeColumn, setDependency, clearDependency, updateIssueAutoReview, updateIssueProfilePath, updateIssueBrainstormProfilePath, updateIssueTestProfilePath, logs, fetchLogs, clearLogs, pendingSelectId, clearPendingSelect, commitRunning, runCommit, hasChanges, release, runRelease, envLocked, envFileCount, envLockRunning, envLockTitle, toggleEnvLock, me, handoffUsers, requestHandoffUsers, startHandoff, acceptHandoff, isHandoffRunning }
return { state, settings, globalAutoReview, youtrackConfigured, importYouTrack, toasts, profiles, setIssues, refresh, scope, toggleScope, saveSettings, listYouTrackProjects, youtrackProjects, dismissSettings, requestEditAuth, createIssue, dismissToast, openUrl, resumeSession, resumeReviewSession, startTestSession, resumeTestSession, focusSession, openFile, implement, generatePrDiffSummary, isPrDiffSummaryRunning, openPr, openWorktree, deleteWorktree, mergeBranch, deleteIssue, closeIssue, closeSessionTab, startBrainstormSession, changeColumn, setDependency, clearDependency, updateIssueAutoReview, updateIssueProfilePath, updateIssueBrainstormProfilePath, updateIssueTestProfilePath, logs, fetchLogs, clearLogs, pendingSelectId, clearPendingSelect, commitRunning, runCommit, hasChanges, release, runRelease, cherryPick, dismissCherryPick, confirmCherryPick, envLocked, envFileCount, envLockRunning, envLockTitle, toggleEnvLock, me, handoffUsers, requestHandoffUsers, startHandoff, acceptHandoff, isHandoffRunning }
}