diff --git a/package-lock.json b/package-lock.json index 0b1ebfef..643fc824 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bottleneck", - "version": "0.1.8", + "version": "0.1.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bottleneck", - "version": "0.1.8", + "version": "0.1.10", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/src/renderer/components/PRTreeView.tsx b/src/renderer/components/PRTreeView.tsx index ee0fd0b0..57ceae32 100644 --- a/src/renderer/components/PRTreeView.tsx +++ b/src/renderer/components/PRTreeView.tsx @@ -226,6 +226,7 @@ export function PRTreeView({ ); const [hoveredGroup, setHoveredGroup] = useState(null); + const [closingGroup, setClosingGroup] = useState(null); return ( @@ -414,31 +415,54 @@ export function PRTreeView({ )} - {item.data.closablePRIds && item.data.closablePRIds.length > 0 && hoveredGroup === item.index && ( + {item.data.closablePRIds && item.data.closablePRIds.length > 0 && (hoveredGroup === item.index || closingGroup === item.index) && (
{ + onClick={async (event) => { event.stopPropagation(); - onCloseGroup(item.data.closablePRIds ?? []); + if (closingGroup === item.index) return; // Prevent double-click + + setClosingGroup(item.index); setHoveredGroup(null); + + try { + await onCloseGroup(item.data.closablePRIds ?? []); + } finally { + setClosingGroup(null); + } }} - onKeyDown={(event) => { + onKeyDown={async (event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); - onCloseGroup(item.data.closablePRIds ?? []); + if (closingGroup === item.index) return; // Prevent double-action + + setClosingGroup(item.index); setHoveredGroup(null); + + try { + await onCloseGroup(item.data.closablePRIds ?? []); + } finally { + setClosingGroup(null); + } } }} className={cn( - "ml-3 px-2 py-1 text-xs font-medium rounded border transition-colors cursor-pointer", + "ml-3 px-2 py-1 text-xs font-medium rounded border transition-colors", + closingGroup === item.index + ? "cursor-not-allowed opacity-75" + : "cursor-pointer", theme === "dark" - ? "border-red-500/60 text-red-300 hover:bg-red-900/40" - : "border-red-400 text-red-600 hover:bg-red-50" + ? closingGroup === item.index + ? "border-red-500/40 text-red-400 bg-red-900/20" + : "border-red-500/60 text-red-300 hover:bg-red-900/40" + : closingGroup === item.index + ? "border-red-300 text-red-500 bg-red-50" + : "border-red-400 text-red-600 hover:bg-red-50" )} > - Close unmerged PRs? + {closingGroup === item.index ? "Closing..." : "Close unmerged PRs?"}
)}