From 6c8bd74eaaa174f8c09649aac14b7cb4d5c08174 Mon Sep 17 00:00:00 2001 From: alorig <220087330+alorig@users.noreply.github.com> Date: Mon, 10 Nov 2025 00:39:04 +0500 Subject: [PATCH] Update Clusters.tsx --- frontend/src/pages/Planner/Clusters.tsx | 42 ++++++++++++++++++++----- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/Planner/Clusters.tsx b/frontend/src/pages/Planner/Clusters.tsx index e1217559..e865bec1 100644 --- a/frontend/src/pages/Planner/Clusters.tsx +++ b/frontend/src/pages/Planner/Clusters.tsx @@ -71,6 +71,7 @@ export default function Clusters() { // Progress modal for AI functions const progressModal = useProgressModal(); + const hasReloadedRef = useRef(false); // Load clusters - wrapped in useCallback to prevent infinite loops const loadClusters = useCallback(async () => { @@ -231,24 +232,49 @@ export default function Clusters() { toast.error('Maximum 5 clusters allowed for idea generation'); return; } + try { const numIds = ids.map(id => parseInt(id)); const result = await autoGenerateIdeas(numIds); - if (result.success) { + + // Check if result has success field - if false, it's an error response + if (result && result.success === false) { + // Error response from API + const errorMsg = result.error || 'Failed to generate ideas'; + toast.error(errorMsg); + return; + } + + if (result && result.success) { if (result.task_id) { - // Async task - show progress modal + // Async task - open progress modal + hasReloadedRef.current = false; progressModal.openModal(result.task_id, 'Generating Content Ideas'); // Don't show toast - progress modal will show status } else { // Synchronous completion toast.success(`Ideas generation complete: ${result.ideas_created || 0} ideas created`); - await loadClusters(); + if (!hasReloadedRef.current) { + hasReloadedRef.current = true; + loadClusters(); + } } } else { - toast.error(result.error || 'Failed to generate ideas'); + // Unexpected response format - show error + const errorMsg = result?.error || 'Unexpected response format'; + toast.error(errorMsg); } } catch (error: any) { - toast.error(`Failed to generate ideas: ${error.message}`); + // API error (network error, parse error, etc.) + let errorMsg = 'Failed to generate ideas'; + if (error.message) { + // Extract clean error message from API error format + errorMsg = error.message.replace(/^API Error \(\d+\): [^-]+ - /, '').trim(); + if (!errorMsg || errorMsg === error.message) { + errorMsg = error.message; + } + } + toast.error(errorMsg); } } else { toast.info(`Bulk action "${action}" for ${ids.length} items`); @@ -456,10 +482,10 @@ export default function Clusters() { details={progressModal.progress.details} taskId={progressModal.taskId || undefined} onClose={() => { - const wasCompleted = progressModal.progress.status === 'completed'; progressModal.closeModal(); - // Reload data after modal closes (if completed) - if (wasCompleted) { + // Reload once when modal closes if task was completed + if (progressModal.progress.status === 'completed' && !hasReloadedRef.current) { + hasReloadedRef.current = true; loadClusters(); } }}