Skip to content

Commit 8c213be

Browse files
committed
🤖 refactor: eliminate project prop drilling via ProjectContext
ProjectSidebar, LeftSidebar, and App.tsx now get project operations from ProjectContext instead of passing through props: - ProjectSidebar uses useProjectContext() for project CRUD and secrets - LeftSidebar no longer passes project props to ProjectSidebar - App.tsx no longer passes project callbacks to LeftSidebar Eliminated prop drilling for: - projects (Map) - onAddProject / onRemoveProject - onGetSecrets / onUpdateSecrets This completes the prop drilling elimination - workspace operations come from WorkspaceContext, project operations come from ProjectContext.
1 parent 3fcb45f commit 8c213be

File tree

3 files changed

+11
-28
lines changed

3 files changed

+11
-28
lines changed

src/App.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -529,14 +529,10 @@ function AppInner() {
529529
<>
530530
<div className="bg-bg-dark mobile-layout flex h-screen overflow-hidden">
531531
<LeftSidebar
532-
onAddProject={handleAddProjectCallback}
533-
onRemoveProject={handleRemoveProjectCallback}
534532
lastReadTimestamps={lastReadTimestamps}
535533
onToggleUnread={onToggleUnread}
536534
collapsed={sidebarCollapsed}
537535
onToggleCollapsed={handleToggleSidebar}
538-
onGetSecrets={handleGetSecrets}
539-
onUpdateSecrets={handleUpdateSecrets}
540536
sortedWorkspacesByProject={sortedWorkspacesByProject}
541537
workspaceRecency={workspaceRecency}
542538
/>

src/components/LeftSidebar.tsx

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,19 @@ import type { FrontendWorkspaceMetadata } from "@/types/workspace";
44
import type { Secret } from "@/types/secrets";
55
import ProjectSidebar from "./ProjectSidebar";
66
import { TitleBar } from "./TitleBar";
7-
import { useProjectContext } from "@/contexts/ProjectContext";
87

98
interface LeftSidebarProps {
10-
onAddProject: () => void;
11-
onRemoveProject: (path: string) => void;
129
lastReadTimestamps: Record<string, number>;
1310
onToggleUnread: (workspaceId: string) => void;
1411
collapsed: boolean;
1512
onToggleCollapsed: () => void;
16-
onGetSecrets: (projectPath: string) => Promise<Secret[]>;
17-
onUpdateSecrets: (projectPath: string, secrets: Secret[]) => Promise<void>;
1813
sortedWorkspacesByProject: Map<string, FrontendWorkspaceMetadata[]>;
1914
workspaceRecency: Record<string, number>;
2015
}
2116

2217
export function LeftSidebar(props: LeftSidebarProps) {
2318
const { collapsed, onToggleCollapsed, ...projectSidebarProps } = props;
2419

25-
// Get app-level state from context
26-
const { projects } = useProjectContext();
27-
2820
return (
2921
<>
3022
{/* Hamburger menu button - only visible on mobile */}
@@ -66,12 +58,7 @@ export function LeftSidebar(props: LeftSidebarProps) {
6658
)}
6759
>
6860
{!collapsed && <TitleBar />}
69-
<ProjectSidebar
70-
{...projectSidebarProps}
71-
projects={projects}
72-
collapsed={collapsed}
73-
onToggleCollapsed={onToggleCollapsed}
74-
/>
61+
<ProjectSidebar {...projectSidebarProps} collapsed={collapsed} onToggleCollapsed={onToggleCollapsed} />
7562
</div>
7663
</>
7764
);

src/components/ProjectSidebar.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { ForceDeleteModal } from "./ForceDeleteModal";
2121
import { WorkspaceListItem } from "./WorkspaceListItem";
2222
import { RenameProvider } from "@/contexts/WorkspaceRenameContext";
2323
import { useWorkspaceContext } from "@/contexts/WorkspaceContext";
24+
import { useProjectContext } from "@/contexts/ProjectContext";
2425

2526
// Re-export WorkspaceSelection for backwards compatibility
2627
export type { WorkspaceSelection } from "./WorkspaceListItem";
@@ -154,29 +155,19 @@ const ProjectDragLayer: React.FC = () => {
154155
};
155156

156157
interface ProjectSidebarProps {
157-
projects: Map<string, ProjectConfig>;
158-
onAddProject: () => void;
159-
onRemoveProject: (path: string) => void;
160158
lastReadTimestamps: Record<string, number>;
161159
onToggleUnread: (workspaceId: string) => void;
162160
collapsed: boolean;
163161
onToggleCollapsed: () => void;
164-
onGetSecrets: (projectPath: string) => Promise<Secret[]>;
165-
onUpdateSecrets: (projectPath: string, secrets: Secret[]) => Promise<void>;
166162
sortedWorkspacesByProject: Map<string, FrontendWorkspaceMetadata[]>;
167163
workspaceRecency: Record<string, number>;
168164
}
169165

170166
const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
171-
projects,
172-
onAddProject,
173-
onRemoveProject,
174167
lastReadTimestamps,
175168
onToggleUnread: _onToggleUnread,
176169
collapsed,
177170
onToggleCollapsed,
178-
onGetSecrets,
179-
onUpdateSecrets,
180171
sortedWorkspacesByProject,
181172
workspaceRecency,
182173
}) => {
@@ -189,6 +180,15 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
189180
beginWorkspaceCreation: onAddWorkspace,
190181
} = useWorkspaceContext();
191182

183+
// Get project state and operations from context
184+
const {
185+
projects,
186+
openProjectCreateModal: onAddProject,
187+
removeProject: onRemoveProject,
188+
getSecrets: onGetSecrets,
189+
updateSecrets: onUpdateSecrets,
190+
} = useProjectContext();
191+
192192
// Workspace-specific subscriptions moved to WorkspaceListItem component
193193

194194
// Store as array in localStorage, convert to Set for usage

0 commit comments

Comments
 (0)