import React, { useCallback, useRef, useState } from "react"; import BranchPicker from "./BranchPicker.jsx"; /** * ContextBar — horizontal repo chip bar for multi-repo workspace context. * * Uses CSS classes for hover-reveal X (Claude-style: subtle by default, * visible on chip hover, red on X hover). Each chip owns its own remove * button — removing one repo never affects the others. */ export default function ContextBar({ contextRepos, activeRepoKey, repoStateByKey, onActivate, onRemove, onAdd, onBranchChange, mode, // workspace mode: "github", "local-git", "folder" (optional) }) { if (!contextRepos || contextRepos.length === 0) return null; return (
{/* Workspace mode indicator */} {mode && ( {mode === "github" ? "GH" : mode === "local-git" ? "Git" : "Dir"} )}
{contextRepos.map((entry) => { const isActive = entry.repoKey === activeRepoKey; return ( onActivate(entry.repoKey)} onRemove={() => onRemove(entry.repoKey)} onBranchChange={(newBranch) => onBranchChange(entry.repoKey, newBranch) } /> ); })}
{contextRepos.length} {contextRepos.length === 1 ? "repo" : "repos"}
); } function RepoChip({ entry, isActive, repoState, onActivate, onRemove, onBranchChange }) { const [branchOpen, setBranchOpen] = useState(false); const [hovered, setHovered] = useState(false); const branchBtnRef = useRef(null); const repo = entry.repo; const branch = repoState?.currentBranch || entry.branch || repo?.default_branch || "main"; const defaultBranch = repoState?.defaultBranch || repo?.default_branch || "main"; const sessionBranches = repoState?.sessionBranches || []; const displayName = repo?.name || entry.repoKey?.split("/")[1] || entry.repoKey; const handleChipClick = useCallback( (e) => { if (e.target.closest("[data-chip-action]")) return; onActivate(); }, [onActivate] ); return (
setHovered(true)} onMouseLeave={() => setHovered(false)} title={isActive ? `Active (write): ${entry.repoKey}` : `Click to activate ${entry.repoKey}`} > {/* Active indicator bar */} {isActive &&
} {/* Repo name */} {displayName} {/* Separator dot */} {/* Branch name — single click opens GitHub branch list */} {/* Write badge for active repo */} {isActive && write} {/* Remove button: hidden by default, revealed on hover */} {/* BranchPicker in external-anchor mode: dropdown opens immediately, positioned from the branch button, fetches all branches from GitHub */} {branchOpen && ( { onBranchChange(newBranch); setBranchOpen(false); }} onClose={() => setBranchOpen(false)} /> )}
); }