feat: add tests and implementation for issue discovery and queue pages

- Implemented `DiscoveryPage` with session management and findings display.
- Added tests for `DiscoveryPage` to ensure proper rendering and functionality.
- Created `QueuePage` for managing issue execution queues with stats and actions.
- Added tests for `QueuePage` to verify UI elements and translations.
- Introduced `useIssues` hooks for fetching and managing issue data.
- Added loading skeletons and error handling for better user experience.
- Created `vite-env.d.ts` for TypeScript support in Vite environment.
This commit is contained in:
catlog22
2026-01-31 21:20:10 +08:00
parent 6d225948d1
commit 1bd082a725
79 changed files with 5870 additions and 449 deletions

View File

@@ -4,7 +4,7 @@
// Manages workflow sessions, tasks, and related data
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';
import { devtools, persist } from 'zustand/middleware';
import type {
WorkflowStore,
WorkflowState,
@@ -60,8 +60,9 @@ const initialState: WorkflowState = {
export const useWorkflowStore = create<WorkflowStore>()(
devtools(
(set, get) => ({
...initialState,
persist(
(set, get) => ({
...initialState,
// ========== Session Actions ==========
@@ -510,7 +511,49 @@ export const useWorkflowStore = create<WorkflowStore>()(
getSessionByKey: (key: string) => {
return get().sessionDataStore[key];
},
}),
}),
{
name: 'ccw-workflow-store',
version: 1, // State version for migration support
partialize: (state) => ({
projectPath: state.projectPath,
}),
migrate: (persistedState, version) => {
// Migration logic for future state shape changes
if (version < 1) {
// No migrations needed for initial version
// Example: if (version === 0) { persistedState.newField = defaultValue; }
}
return persistedState as typeof persistedState;
},
onRehydrateStorage: () => {
// Only log in development to avoid noise in production
if (process.env.NODE_ENV === 'development') {
// eslint-disable-next-line no-console
console.log('[WorkflowStore] Hydrating from localStorage...');
}
return (state, error) => {
if (error) {
// eslint-disable-next-line no-console
console.error('[WorkflowStore] Rehydration error:', error);
return;
}
if (state?.projectPath) {
if (process.env.NODE_ENV === 'development') {
// eslint-disable-next-line no-console
console.log('[WorkflowStore] Found persisted projectPath, re-initializing workspace:', state.projectPath);
}
// Use setTimeout to ensure the store is fully initialized before calling switchWorkspace
setTimeout(() => {
if (state.switchWorkspace) {
state.switchWorkspace(state.projectPath);
}
}, 0);
}
};
},
}
),
{ name: 'WorkflowStore' }
)
);