From 4ac1edf3145af17bc04d77de63974a4ad4c6e046 Mon Sep 17 00:00:00 2001 From: webdevcody Date: Sun, 4 Jan 2026 14:16:39 -0500 Subject: [PATCH] refactor: update ideation dashboard and prompt list to use project-specific job retrieval - Modified IdeationDashboard and PromptList components to fetch generation jobs specific to the current project. - Updated addGenerationJob function to include projectPath as a parameter for better job management. - Introduced getJobsForProject function in the ideation store to streamline job filtering by project. --- .../components/ideation-dashboard.tsx | 23 ++++++++++++++----- .../ideation-view/components/prompt-list.tsx | 9 ++++---- apps/ui/src/store/ideation-store.ts | 12 ++++++++-- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/apps/ui/src/components/views/ideation-view/components/ideation-dashboard.tsx b/apps/ui/src/components/views/ideation-view/components/ideation-dashboard.tsx index 03ae4982..5eecf20c 100644 --- a/apps/ui/src/components/views/ideation-view/components/ideation-dashboard.tsx +++ b/apps/ui/src/components/views/ideation-view/components/ideation-dashboard.tsx @@ -168,15 +168,16 @@ function TagFilter({ export function IdeationDashboard({ onGenerateIdeas }: IdeationDashboardProps) { const currentProject = useAppStore((s) => s.currentProject); - const { generationJobs, removeSuggestionFromJob } = useIdeationStore(); + const { getJobsForProject, removeSuggestionFromJob } = useIdeationStore(); const [addingId, setAddingId] = useState(null); const [selectedTags, setSelectedTags] = useState>(new Set()); + // Get jobs for current project only + const projectJobs = currentProject?.path ? getJobsForProject(currentProject.path) : []; + // Separate generating/error jobs from ready jobs with suggestions - const activeJobs = generationJobs.filter( - (j) => j.status === 'generating' || j.status === 'error' - ); - const readyJobs = generationJobs.filter((j) => j.status === 'ready' && j.suggestions.length > 0); + const activeJobs = projectJobs.filter((j) => j.status === 'generating' || j.status === 'error'); + const readyJobs = projectJobs.filter((j) => j.status === 'ready' && j.suggestions.length > 0); // Flatten all suggestions with their parent job const allSuggestions = useMemo( @@ -203,7 +204,7 @@ export function IdeationDashboard({ onGenerateIdeas }: IdeationDashboardProps) { return allSuggestions.filter(({ job }) => selectedTags.has(job.prompt.title)); }, [allSuggestions, selectedTags]); - const generatingCount = generationJobs.filter((j) => j.status === 'generating').length; + const generatingCount = projectJobs.filter((j) => j.status === 'generating').length; const handleToggleTag = (tag: string) => { setSelectedTags((prev) => { @@ -316,6 +317,16 @@ export function IdeationDashboard({ onGenerateIdeas }: IdeationDashboardProps) { )} + {/* Generate More Ideas Button - shown when there are items */} + {!isEmpty && ( +
+ +
+ )} + {/* Empty State */} {isEmpty && ( diff --git a/apps/ui/src/components/views/ideation-view/components/prompt-list.tsx b/apps/ui/src/components/views/ideation-view/components/prompt-list.tsx index 76713350..cc898846 100644 --- a/apps/ui/src/components/views/ideation-view/components/prompt-list.tsx +++ b/apps/ui/src/components/views/ideation-view/components/prompt-list.tsx @@ -20,7 +20,7 @@ interface PromptListProps { export function PromptList({ category, onBack }: PromptListProps) { const currentProject = useAppStore((s) => s.currentProject); - const { setMode, addGenerationJob, updateJobStatus, generationJobs } = useIdeationStore(); + const { setMode, addGenerationJob, updateJobStatus, getJobsForProject } = useIdeationStore(); const [loadingPromptId, setLoadingPromptId] = useState(null); const [startedPrompts, setStartedPrompts] = useState>(new Set()); const navigate = useNavigate(); @@ -32,9 +32,10 @@ export function PromptList({ category, onBack }: PromptListProps) { const prompts = getPromptsByCategory(category); - // Check which prompts are already generating + // Get jobs for current project only and check which prompts are already generating + const projectJobs = currentProject?.path ? getJobsForProject(currentProject.path) : []; const generatingPromptIds = new Set( - generationJobs.filter((j) => j.status === 'generating').map((j) => j.prompt.id) + projectJobs.filter((j) => j.status === 'generating').map((j) => j.prompt.id) ); const handleSelectPrompt = async (prompt: IdeationPrompt) => { @@ -48,7 +49,7 @@ export function PromptList({ category, onBack }: PromptListProps) { setLoadingPromptId(prompt.id); // Add a job and navigate to dashboard - const jobId = addGenerationJob(prompt); + const jobId = addGenerationJob(currentProject.path, prompt); setStartedPrompts((prev) => new Set(prev).add(prompt.id)); // Show toast and navigate to dashboard diff --git a/apps/ui/src/store/ideation-store.ts b/apps/ui/src/store/ideation-store.ts index cfc564ff..e7b10d3d 100644 --- a/apps/ui/src/store/ideation-store.ts +++ b/apps/ui/src/store/ideation-store.ts @@ -21,6 +21,7 @@ export type GenerationJobStatus = 'generating' | 'ready' | 'error'; export interface GenerationJob { id: string; + projectPath: string; prompt: IdeationPrompt; status: GenerationJobStatus; suggestions: AnalysisSuggestion[]; @@ -76,7 +77,8 @@ interface IdeationActions { getSelectedIdea: () => Idea | null; // Generation Jobs - addGenerationJob: (prompt: IdeationPrompt) => string; + addGenerationJob: (projectPath: string, prompt: IdeationPrompt) => string; + getJobsForProject: (projectPath: string) => GenerationJob[]; updateJobStatus: ( jobId: string, status: GenerationJobStatus, @@ -172,10 +174,11 @@ export const useIdeationStore = create()( }, // Generation Jobs - addGenerationJob: (prompt) => { + addGenerationJob: (projectPath, prompt) => { const jobId = `job-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const job: GenerationJob = { id: jobId, + projectPath, prompt, status: 'generating', suggestions: [], @@ -189,6 +192,11 @@ export const useIdeationStore = create()( return jobId; }, + getJobsForProject: (projectPath) => { + const state = get(); + return state.generationJobs.filter((job) => job.projectPath === projectPath); + }, + updateJobStatus: (jobId, status, suggestions, error) => set((state) => ({ generationJobs: state.generationJobs.map((job) =>