Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a7278a4
feat: add import secrets from another project in SecretsModal
ammar-agent Feb 3, 2026
1cffb0b
fix: use functional state update in handleImportFromProject
ammar-agent Feb 3, 2026
5a14713
refactor: move import dropdown to top row, add SecretsModal story
ammar-agent Feb 3, 2026
fcc6981
fix: disable Save button while import is in flight
ammar-agent Feb 3, 2026
2de55e4
refactor: move secrets management into Settings → Projects section
ammar-agent Feb 3, 2026
d22102a
fix: cancel stale imports when project changes
ammar-agent Feb 4, 2026
7bddc88
fix: reset isImporting when project changes
ammar-agent Feb 4, 2026
f237360
refactor: change secrets icon to settings icon
ammar-agent Feb 4, 2026
d74b6bc
fix: use Testing Library query instead of :has-text selector
ammar-agent Feb 4, 2026
5e10412
fix: refresh projectSecretKeys after saving secrets
ammar-agent Feb 4, 2026
699766a
fix: use useLayoutEffect for projectPath ref to avoid race
ammar-agent Feb 4, 2026
26d82ba
fix: guard against empty projectPath in secrets section
ammar-agent Feb 4, 2026
63029d9
fix: warn before switching projects with unsaved secrets
ammar-agent Feb 4, 2026
b257860
fix: prompt for unsaved secrets when deep-linking to project
ammar-agent Feb 4, 2026
736e502
fix: avoid aria-label collision with global settings button
ammar-agent Feb 4, 2026
7002d68
fix: handle MCP_TOKEN appearing in multiple inputs for storybook test
ammar-agent Feb 4, 2026
e5a5cd0
fix: improve robustness of secrets import test
ammar-agent Feb 4, 2026
47e425d
fix: wrap import click in act() for better CI stability
ammar-agent Feb 4, 2026
fa84f7e
fix: use native select in tests for secrets import (happy-dom portal …
ammar-agent Feb 4, 2026
b0a85e0
tests: stabilize secrets import integration test
ammar-agent Feb 4, 2026
7a26c83
tests: ensure import select value is set
ammar-agent Feb 4, 2026
34b3764
tests: harden secrets import select handling
ammar-agent Feb 4, 2026
38bb98a
tests: make secrets import selection more robust
ammar-agent Feb 4, 2026
6d1992b
tests: expose secrets import helper for UI
ammar-agent Feb 4, 2026
e6bd2e5
tests: rely on secrets state helper for import
ammar-agent Feb 4, 2026
f8289c7
tests: persist imported secrets via state helper
ammar-agent Feb 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 8 additions & 46 deletions src/browser/components/ProjectSidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,13 @@ import {
import { Tooltip, TooltipTrigger, TooltipContent } from "./ui/tooltip";
import { SidebarCollapseButton } from "./ui/SidebarCollapseButton";
import { ConfirmationModal } from "./ConfirmationModal";
import SecretsModal from "./SecretsModal";
import type { Secret } from "@/common/types/secrets";
import { useSettings } from "@/browser/contexts/SettingsContext";

import { WorkspaceListItem, type WorkspaceSelection } from "./WorkspaceListItem";
import { WorkspaceStatusIndicator } from "./WorkspaceStatusIndicator";
import { RenameProvider } from "@/browser/contexts/WorkspaceRenameContext";
import { useProjectContext } from "@/browser/contexts/ProjectContext";
import { ChevronRight, CircleHelp, KeyRound } from "lucide-react";
import { ChevronRight, CircleHelp, Settings } from "lucide-react";
import { MUX_HELP_CHAT_WORKSPACE_ID } from "@/common/constants/muxChat";
import { useWorkspaceContext } from "@/browser/contexts/WorkspaceContext";
import { useRouter } from "@/browser/contexts/RouterContext";
Expand Down Expand Up @@ -359,14 +358,13 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
projects,
openProjectCreateModal: onAddProject,
removeProject: onRemoveProject,
getSecrets: onGetSecrets,
updateSecrets: onUpdateSecrets,
createSection,
updateSection,
removeSection,
reorderSections,
assignWorkspaceToSection,
} = useProjectContext();
const { openProjectSettings } = useSettings();

// Theme for logo variant
const { theme } = useTheme();
Expand Down Expand Up @@ -467,12 +465,6 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
} | null>(null);
const projectRemoveError = usePopoverError();
const sectionRemoveError = usePopoverError();
const [secretsModalState, setSecretsModalState] = useState<{
isOpen: boolean;
projectPath: string;
projectName: string;
secrets: Secret[];
} | null>(null);

const getProjectName = (path: string) => {
if (!path || typeof path !== "string") {
Expand Down Expand Up @@ -608,26 +600,6 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
}
};

const handleOpenSecrets = async (projectPath: string) => {
const secrets = await onGetSecrets(projectPath);
setSecretsModalState({
isOpen: true,
projectPath,
projectName: getProjectName(projectPath),
secrets,
});
};

const handleSaveSecrets = async (secrets: Secret[]) => {
if (secretsModalState) {
await onUpdateSecrets(secretsModalState.projectPath, secrets);
}
};

const handleCloseSecrets = () => {
setSecretsModalState(null);
};

// UI preference: project order persists in localStorage
const [projectOrder, setProjectOrder] = usePersistedState<string[]>("mux:projectOrder", []);

Expand Down Expand Up @@ -834,16 +806,16 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
<button
onClick={(event) => {
event.stopPropagation();
void handleOpenSecrets(projectPath);
openProjectSettings(projectPath);
}}
aria-label={`Manage secrets for ${projectName}`}
aria-label={`Configure ${projectName}`}
data-project-path={projectPath}
className="text-muted-dark mr-1 flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded-[3px] border-none bg-transparent text-sm opacity-0 transition-all duration-200 hover:bg-yellow-500/10 hover:text-yellow-500"
className="text-muted-dark hover:text-foreground hover:bg-hover mr-1 flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded-[3px] border-none bg-transparent text-sm opacity-0 transition-all duration-200"
>
<KeyRound size={12} />
<Settings size={12} />
</button>
</TooltipTrigger>
<TooltipContent align="end">Manage secrets</TooltipContent>
<TooltipContent align="end">Project settings</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
Expand Down Expand Up @@ -1304,16 +1276,6 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
side="left"
shortcut={formatKeybind(KEYBINDS.TOGGLE_SIDEBAR)}
/>
{secretsModalState && (
<SecretsModal
isOpen={secretsModalState.isOpen}
projectPath={secretsModalState.projectPath}
projectName={secretsModalState.projectName}
initialSecrets={secretsModalState.secrets}
onClose={handleCloseSecrets}
onSave={handleSaveSecrets}
/>
)}
<ConfirmationModal
isOpen={archiveConfirmation !== null}
title={
Expand Down
228 changes: 0 additions & 228 deletions src/browser/components/SecretsModal.tsx

This file was deleted.

Loading
Loading