fix(ui): address PR review comments for overview view

- Fix handleOpenProject dependency array to include initializeAndOpenProject
- Use upsertAndSetCurrentProject instead of separate addProject + setCurrentProject
- Reorder callback declarations to avoid use-before-definition
- Update E2E tests to match renamed Dashboard UI (was "Projects Overview")
- Add success: true to mock API responses for proper test functioning
- Fix strict mode violation in project status card test

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Stefan de Vogelaere
2026-01-23 02:57:16 +01:00
parent 9d297c650a
commit 7e1095b773
2 changed files with 98 additions and 86 deletions

View File

@@ -43,13 +43,38 @@ const logger = createLogger('OverviewView');
export function OverviewView() {
const navigate = useNavigate();
const { overview, isLoading, error, refresh } = useMultiProjectStatus(15000); // Refresh every 15s
const { addProject, setCurrentProject } = useAppStore();
const { upsertAndSetCurrentProject } = useAppStore();
// Modal state
const [showNewProjectModal, setShowNewProjectModal] = useState(false);
const [showWorkspacePicker, setShowWorkspacePicker] = useState(false);
const [isCreating, setIsCreating] = useState(false);
const initializeAndOpenProject = useCallback(
async (path: string, name: string) => {
try {
const initResult = await initializeProject(path);
if (!initResult.success) {
toast.error('Failed to initialize project', {
description: initResult.error || 'Unknown error occurred',
});
return;
}
upsertAndSetCurrentProject(path, name);
toast.success('Project opened', { description: `Opened ${name}` });
navigate({ to: '/board' });
} catch (error) {
logger.error('[Overview] Failed to open project:', error);
toast.error('Failed to open project', {
description: error instanceof Error ? error.message : 'Unknown error',
});
}
},
[upsertAndSetCurrentProject, navigate]
);
const handleOpenProject = useCallback(async () => {
try {
const httpClient = getHttpApiClient();
@@ -78,40 +103,7 @@ export function OverviewView() {
await initializeAndOpenProject(path, name);
}
}
}, []);
const initializeAndOpenProject = useCallback(
async (path: string, name: string) => {
try {
const initResult = await initializeProject(path);
if (!initResult.success) {
toast.error('Failed to initialize project', {
description: initResult.error || 'Unknown error occurred',
});
return;
}
const project = {
id: `project-${Date.now()}`,
name,
path,
lastOpened: new Date().toISOString(),
};
addProject(project);
setCurrentProject(project);
toast.success('Project opened', { description: `Opened ${name}` });
navigate({ to: '/board' });
} catch (error) {
logger.error('[Overview] Failed to open project:', error);
toast.error('Failed to open project', {
description: error instanceof Error ? error.message : 'Unknown error',
});
}
},
[addProject, setCurrentProject, navigate]
);
}, [initializeAndOpenProject]);
const handleWorkspaceSelect = useCallback(
async (path: string, name: string) => {
@@ -149,15 +141,7 @@ export function OverviewView() {
</project_specification>`
);
const project = {
id: `project-${Date.now()}`,
name: projectName,
path: projectPath,
lastOpened: new Date().toISOString(),
};
addProject(project);
setCurrentProject(project);
upsertAndSetCurrentProject(projectPath, projectName);
setShowNewProjectModal(false);
toast.success('Project created', { description: `Created ${projectName}` });
@@ -171,7 +155,7 @@ export function OverviewView() {
setIsCreating(false);
}
},
[addProject, setCurrentProject, navigate]
[upsertAndSetCurrentProject, navigate]
);
const handleCreateFromTemplate = useCallback(
@@ -200,15 +184,7 @@ export function OverviewView() {
return;
}
const project = {
id: `project-${Date.now()}`,
name: projectName,
path: cloneResult.projectPath,
lastOpened: new Date().toISOString(),
};
addProject(project);
setCurrentProject(project);
upsertAndSetCurrentProject(cloneResult.projectPath, projectName);
setShowNewProjectModal(false);
toast.success('Project created from template', {
@@ -224,7 +200,7 @@ export function OverviewView() {
setIsCreating(false);
}
},
[addProject, setCurrentProject, navigate]
[upsertAndSetCurrentProject, navigate]
);
const handleCreateFromCustomUrl = useCallback(
@@ -249,15 +225,7 @@ export function OverviewView() {
return;
}
const project = {
id: `project-${Date.now()}`,
name: projectName,
path: cloneResult.projectPath,
lastOpened: new Date().toISOString(),
};
addProject(project);
setCurrentProject(project);
upsertAndSetCurrentProject(cloneResult.projectPath, projectName);
setShowNewProjectModal(false);
toast.success('Project created from repository', { description: `Created ${projectName}` });
@@ -271,7 +239,7 @@ export function OverviewView() {
setIsCreating(false);
}
},
[addProject, setCurrentProject, navigate]
[upsertAndSetCurrentProject, navigate]
);
return (