import type { ReleaseCommitGroup } from '../lib/messages' import { X } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' interface Props { open: boolean branch: string groups: ReleaseCommitGroup[] onCancel: () => void onConfirm: (shas: string[]) => void } function filterGroups(groups: ReleaseCommitGroup[], query: string): ReleaseCommitGroup[] { const q = query.trim().toLowerCase() if (!q) return groups const out: ReleaseCommitGroup[] = [] for (const g of groups) { const head = `#${g.pr ?? ''} ${g.title} ${g.authors.join(' ')}`.toLowerCase() if (head.includes(q)) { out.push(g) continue } const commits = g.commits.filter(c => `${c.subject} ${c.author} ${c.sha} ${c.date}`.toLowerCase().includes(q), ) if (commits.length > 0) out.push({ ...g, commits }) } return out } export function CherryPickModal({ open, branch, groups, onCancel, onConfirm }: Props) { const [query, setQuery] = useState('') const [selected, setSelected] = useState>(() => new Set()) useEffect(() => { if (!open) return setQuery('') setSelected(new Set()) }, [open, groups]) useEffect(() => { if (!open) return function onKey(e: KeyboardEvent): void { if (e.key === 'Escape') onCancel() } document.addEventListener('keydown', onKey) return () => document.removeEventListener('keydown', onKey) }, [open, onCancel]) const visible = useMemo(() => filterGroups(groups, query), [groups, query]) if (!open) return null function toggleSha(sha: string): void { setSelected((prev) => { const next = new Set(prev) if (next.has(sha)) next.delete(sha) else next.add(sha) return next }) } function toggleGroup(g: ReleaseCommitGroup): void { const shas = g.commits.map(c => c.sha) const allOn = shas.every(s => selected.has(s)) setSelected((prev) => { const next = new Set(prev) for (const s of shas) { if (allOn) next.delete(s) else next.add(s) } return next }) } const count = selected.size return (

{`摘修复到 ${branch}`}

setQuery(e.target.value)} placeholder="搜索作者、PR 号或标题" className="w-full rounded border border-[var(--vscode-input-border,transparent)] bg-[var(--vscode-input-background)] px-2 py-1.5 text-xs outline-none" />
{visible.length === 0 ?
没有匹配的提交
: visible.map(g => (
    {g.commits.map(c => (
  • ))}
))}
{`已选 ${count}`}
) }