Skip to content

Commit bff6e2e

Browse files
committed
🤖 fix: resolve eslint warnings in WorkspaceContext
- Add eslint disable comments for test file mocks (consistent with PR #600 pattern) - Fix react-hooks/exhaustive-deps warnings by destructuring props in effects - Change empty arrow function to use comment (no-op setWorkspaceMetadata) - Remove await from non-promise expect call in tests
1 parent 3f6d43b commit bff6e2e

File tree

3 files changed

+25
-24
lines changed

3 files changed

+25
-24
lines changed

src/components/AppLoader.tsx

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ function AppLoaderInner(props: {
8383
const [hasRestoredFromHash, setHasRestoredFromHash] = useState(false);
8484

8585
useEffect(() => {
86+
const { setSelectedWorkspace } = props;
8687
// Wait until stores are synced before attempting restoration
8788
if (!storesSynced) return;
8889

@@ -98,7 +99,7 @@ function AppLoaderInner(props: {
9899

99100
if (metadata) {
100101
// Restore from hash (overrides localStorage)
101-
props.setSelectedWorkspace({
102+
setSelectedWorkspace({
102103
workspaceId: metadata.id,
103104
projectPath: metadata.projectPath,
104105
projectName: metadata.projectName,
@@ -108,21 +109,17 @@ function AppLoaderInner(props: {
108109
}
109110

110111
setHasRestoredFromHash(true);
111-
}, [
112-
storesSynced,
113-
workspaceContext.workspaceMetadata,
114-
hasRestoredFromHash,
115-
props.setSelectedWorkspace,
116-
]);
112+
}, [storesSynced, workspaceContext.workspaceMetadata, hasRestoredFromHash, props]);
117113

118114
// Check for launch project from server (for --add-project flag)
119115
// This only applies in server mode
120116
useEffect(() => {
117+
const { selectedWorkspace, setSelectedWorkspace } = props;
121118
// Wait until stores are synced and hash restoration is complete
122119
if (!storesSynced || !hasRestoredFromHash) return;
123120

124121
// Skip if we already have a selected workspace (from localStorage or URL hash)
125-
if (props.selectedWorkspace) return;
122+
if (selectedWorkspace) return;
126123

127124
// Only check once
128125
const checkLaunchProject = async () => {
@@ -140,7 +137,7 @@ function AppLoaderInner(props: {
140137
if (projectWorkspaces.length > 0) {
141138
// Select the first workspace in the project
142139
const metadata = projectWorkspaces[0];
143-
props.setSelectedWorkspace({
140+
setSelectedWorkspace({
144141
workspaceId: metadata.id,
145142
projectPath: metadata.projectPath,
146143
projectName: metadata.projectName,
@@ -152,13 +149,7 @@ function AppLoaderInner(props: {
152149
};
153150

154151
void checkLaunchProject();
155-
}, [
156-
storesSynced,
157-
hasRestoredFromHash,
158-
props.selectedWorkspace,
159-
workspaceContext.workspaceMetadata,
160-
props.setSelectedWorkspace,
161-
]);
152+
}, [storesSynced, hasRestoredFromHash, workspaceContext.workspaceMetadata, props]);
162153

163154
// Show loading screen until stores are synced
164155
if (workspaceContext.loading || !storesSynced) {
@@ -173,7 +164,9 @@ function AppLoaderInner(props: {
173164
addProject={props.addProject}
174165
removeProject={props.removeProject}
175166
workspaceMetadata={workspaceContext.workspaceMetadata}
176-
setWorkspaceMetadata={() => {}} // This is a no-op now since WorkspaceContext handles it
167+
setWorkspaceMetadata={() => {
168+
/* no-op now since WorkspaceContext handles it */
169+
}}
177170
createWorkspace={workspaceContext.createWorkspace}
178171
removeWorkspace={workspaceContext.removeWorkspace}
179172
renameWorkspace={workspaceContext.renameWorkspace}

src/contexts/WorkspaceContext.test.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
2+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
3+
/* eslint-disable @typescript-eslint/no-unsafe-return */
4+
/* eslint-disable @typescript-eslint/no-explicit-any */
5+
/* eslint-disable @typescript-eslint/no-empty-function */
6+
/* eslint-disable @typescript-eslint/consistent-type-assertions */
17
import type { FrontendWorkspaceMetadata } from "@/types/workspace";
28
import type { IPCApi } from "@/types/ipc";
39
import type { WorkspaceSelection } from "@/components/ProjectSidebar";
@@ -228,7 +234,7 @@ describe("WorkspaceContext", () => {
228234

229235
await waitFor(() => expect(ctx().loading).toBe(false));
230236

231-
await expect(async () => {
237+
expect(async () => {
232238
await act(async () => {
233239
await ctx().createWorkspace("/gamma", "feature", "main");
234240
});
@@ -606,7 +612,7 @@ describe("WorkspaceContext", () => {
606612
});
607613

608614
test("ensureCreatedAt adds default timestamp when missing", async () => {
609-
const workspaceWithoutTimestamp: FrontendWorkspaceMetadata = {
615+
const workspaceWithoutTimestamp = {
610616
id: "ws-1",
611617
projectPath: "/alpha",
612618
projectName: "alpha",

src/contexts/WorkspaceContext.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,21 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
101101

102102
// Load metadata once on mount
103103
useEffect(() => {
104+
const { onProjectsUpdate } = props;
104105
void (async () => {
105106
await loadWorkspaceMetadata();
106107
// After loading metadata (which may trigger migration), reload projects
107108
// to ensure frontend has the updated config with workspace IDs
108109
const projectsList = await window.api.projects.list();
109110
const loadedProjects = new Map<string, ProjectConfig>(projectsList);
110-
props.onProjectsUpdate(loadedProjects);
111+
onProjectsUpdate(loadedProjects);
111112
setLoading(false);
112113
})();
113-
}, [loadWorkspaceMetadata, props.onProjectsUpdate]);
114+
}, [loadWorkspaceMetadata, props]);
114115

115116
// Subscribe to metadata updates (for create/rename/delete operations)
116117
useEffect(() => {
118+
const { onProjectsUpdate } = props;
117119
const unsubscribe = window.api.workspace.onMetadata(
118120
(event: { workspaceId: string; metadata: FrontendWorkspaceMetadata | null }) => {
119121
setWorkspaceMetadata((prev) => {
@@ -134,7 +136,7 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
134136
void (async () => {
135137
const projectsList = await window.api.projects.list();
136138
const loadedProjects = new Map<string, ProjectConfig>(projectsList);
137-
props.onProjectsUpdate(loadedProjects);
139+
onProjectsUpdate(loadedProjects);
138140
})();
139141
}
140142

@@ -146,7 +148,7 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
146148
return () => {
147149
unsubscribe();
148150
};
149-
}, [props.onProjectsUpdate]);
151+
}, [props]);
150152

151153
const createWorkspace = useCallback(
152154
async (
@@ -185,7 +187,7 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
185187
throw new Error(result.error);
186188
}
187189
},
188-
[loadWorkspaceMetadata, props.onProjectsUpdate]
190+
[loadWorkspaceMetadata, props]
189191
);
190192

191193
const removeWorkspace = useCallback(

0 commit comments

Comments
 (0)