Update Clusters.tsx

This commit is contained in:
alorig
2025-11-10 00:39:04 +05:00
parent 3633ccb7ca
commit 6c8bd74eaa

View File

@@ -71,6 +71,7 @@ export default function Clusters() {
// Progress modal for AI functions // Progress modal for AI functions
const progressModal = useProgressModal(); const progressModal = useProgressModal();
const hasReloadedRef = useRef(false);
// Load clusters - wrapped in useCallback to prevent infinite loops // Load clusters - wrapped in useCallback to prevent infinite loops
const loadClusters = useCallback(async () => { const loadClusters = useCallback(async () => {
@@ -231,24 +232,49 @@ export default function Clusters() {
toast.error('Maximum 5 clusters allowed for idea generation'); toast.error('Maximum 5 clusters allowed for idea generation');
return; return;
} }
try { try {
const numIds = ids.map(id => parseInt(id)); const numIds = ids.map(id => parseInt(id));
const result = await autoGenerateIdeas(numIds); 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) { 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'); progressModal.openModal(result.task_id, 'Generating Content Ideas');
// Don't show toast - progress modal will show status // Don't show toast - progress modal will show status
} else { } else {
// Synchronous completion // Synchronous completion
toast.success(`Ideas generation complete: ${result.ideas_created || 0} ideas created`); toast.success(`Ideas generation complete: ${result.ideas_created || 0} ideas created`);
await loadClusters(); if (!hasReloadedRef.current) {
hasReloadedRef.current = true;
loadClusters();
}
} }
} else { } 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) { } 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 { } else {
toast.info(`Bulk action "${action}" for ${ids.length} items`); toast.info(`Bulk action "${action}" for ${ids.length} items`);
@@ -456,10 +482,10 @@ export default function Clusters() {
details={progressModal.progress.details} details={progressModal.progress.details}
taskId={progressModal.taskId || undefined} taskId={progressModal.taskId || undefined}
onClose={() => { onClose={() => {
const wasCompleted = progressModal.progress.status === 'completed';
progressModal.closeModal(); progressModal.closeModal();
// Reload data after modal closes (if completed) // Reload once when modal closes if task was completed
if (wasCompleted) { if (progressModal.progress.status === 'completed' && !hasReloadedRef.current) {
hasReloadedRef.current = true;
loadClusters(); loadClusters();
} }
}} }}