import { FolderGit2Icon, FolderGitIcon, FolderIcon } from "lucide-react";import { memo, useMemo } from "react"; import { resolveCurrentWorkspaceLabel, resolveEnvModeLabel, type EnvMode,} from "./BranchToolbar.logic";import { Select, SelectGroup, SelectGroupLabel, SelectItem, SelectPopup, SelectTrigger, SelectValue,} from "./ui/select"; interface BranchToolbarEnvModeSelectorProps { envLocked: boolean; effectiveEnvMode: EnvMode; activeWorktreePath: string | null; onEnvModeChange: (mode: EnvMode) => void;} export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSelector({ envLocked, effectiveEnvMode, activeWorktreePath, onEnvModeChange,}: BranchToolbarEnvModeSelectorProps) { const envModeItems = useMemo( () => [ { value: "local", label: resolveCurrentWorkspaceLabel(activeWorktreePath) }, { value: "worktree", label: resolveEnvModeLabel("worktree") }, ], [activeWorktreePath], ); if (envLocked) { return ( <span className="inline-flex items-center gap-1 border border-transparent px-[calc(--spacing(3)-1px)] text-sm font-medium text-muted-foreground/70 sm:text-xs"> {activeWorktreePath ? ( <> <FolderGitIcon className="size-3" /> {resolveCurrentWorkspaceLabel(activeWorktreePath)} </> ) : ( <> <FolderIcon className="size-3" /> {resolveCurrentWorkspaceLabel(activeWorktreePath)} </> )} </span> ); } return ( <Select value={effectiveEnvMode} onValueChange={(value) => onEnvModeChange(value as EnvMode)} items={envModeItems} > <SelectTrigger variant="ghost" size="xs" className="font-medium" aria-label="Workspace"> {effectiveEnvMode === "worktree" ? ( <FolderGit2Icon className="size-3" /> ) : activeWorktreePath ? ( <FolderGitIcon className="size-3" /> ) : ( <FolderIcon className="size-3" /> )} <SelectValue /> </SelectTrigger> <SelectPopup> <SelectGroup> <SelectGroupLabel>Workspace</SelectGroupLabel> <SelectItem value="local"> <span className="inline-flex items-center gap-1.5"> {activeWorktreePath ? ( <FolderGitIcon className="size-3" /> ) : ( <FolderIcon className="size-3" /> )} {resolveCurrentWorkspaceLabel(activeWorktreePath)} </span> </SelectItem> <SelectItem value="worktree"> <span className="inline-flex items-center gap-1.5"> <FolderGit2Icon className="size-3" /> {resolveEnvModeLabel("worktree")} </span> </SelectItem> </SelectGroup> </SelectPopup> </Select> );});
import { FolderGit2Icon, FolderGitIcon, FolderIcon } from "lucide-react";
import { memo, useMemo } from "react";
import {
resolveCurrentWorkspaceLabel,
resolveEnvModeLabel,
type EnvMode,
} from "./BranchToolbar.logic";
import {
Select,
SelectGroup,
SelectGroupLabel,
SelectItem,
SelectPopup,
SelectTrigger,
SelectValue,
} from "./ui/select";
interface BranchToolbarEnvModeSelectorProps {
envLocked: boolean;
effectiveEnvMode: EnvMode;
activeWorktreePath: string | null;
onEnvModeChange: (mode: EnvMode) => void;
}
export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSelector({
envLocked,
effectiveEnvMode,
activeWorktreePath,
onEnvModeChange,
}: BranchToolbarEnvModeSelectorProps) {
const envModeItems = useMemo(
() => [
{ value: "local", label: resolveCurrentWorkspaceLabel(activeWorktreePath) },
{ value: "worktree", label: resolveEnvModeLabel("worktree") },
],
[activeWorktreePath],
);
if (envLocked) {
return (
<span className="inline-flex items-center gap-1 border border-transparent px-[calc(--spacing(3)-1px)] text-sm font-medium text-muted-foreground/70 sm:text-xs">
{activeWorktreePath ? (
<>
<FolderGitIcon className="size-3" />
{resolveCurrentWorkspaceLabel(activeWorktreePath)}
</>
) : (
<>
<FolderIcon className="size-3" />
{resolveCurrentWorkspaceLabel(activeWorktreePath)}
</>
)}
</span>
);
}
return (
<Select
value={effectiveEnvMode}
onValueChange={(value) => onEnvModeChange(value as EnvMode)}
items={envModeItems}
>
<SelectTrigger variant="ghost" size="xs" className="font-medium" aria-label="Workspace">
{effectiveEnvMode === "worktree" ? (
<FolderGit2Icon className="size-3" />
) : activeWorktreePath ? (
<FolderGitIcon className="size-3" />
) : (
<FolderIcon className="size-3" />
)}
<SelectValue />
</SelectTrigger>
<SelectPopup>
<SelectGroup>
<SelectGroupLabel>Workspace</SelectGroupLabel>
<SelectItem value="local">
<span className="inline-flex items-center gap-1.5">
{activeWorktreePath ? (
<FolderGitIcon className="size-3" />
) : (
<FolderIcon className="size-3" />
)}
{resolveCurrentWorkspaceLabel(activeWorktreePath)}
</span>
</SelectItem>
<SelectItem value="worktree">
<span className="inline-flex items-center gap-1.5">
<FolderGit2Icon className="size-3" />
{resolveEnvModeLabel("worktree")}
</span>
</SelectItem>
</SelectGroup>
</SelectPopup>
</Select>
);
});