diff --git a/frontend/src/components/common/ProgressModal.tsx b/frontend/src/components/common/ProgressModal.tsx index c18feb64..a66d41c8 100644 --- a/frontend/src/components/common/ProgressModal.tsx +++ b/frontend/src/components/common/ProgressModal.tsx @@ -73,7 +73,15 @@ const getSuccessMessage = (functionId?: string, title?: string, stepLogs?: any[] } return 'Article drafted successfully.'; } - if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { + // Check for image generation from prompts FIRST (more specific) + if (funcName.includes('image') && funcName.includes('from')) { + // Image generation from prompts + const imageCount = extractCount(/(\d+)\s+image/i, stepLogs || []); + if (imageCount) { + return `${imageCount} image${imageCount !== '1' ? 's' : ''} generated successfully`; + } + return 'Images generated successfully'; + } else if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { // Image prompt generation // Try to extract from SAVE step message first (most reliable) const saveStepLog = stepLogs?.find(log => log.stepName === 'SAVE'); @@ -120,13 +128,6 @@ const getSuccessMessage = (functionId?: string, title?: string, stepLogs?: any[] // Default message return 'Featured Image and X In‑article Image Prompts ready for image generation'; - } else if (funcName.includes('image') && funcName.includes('from')) { - // Image generation from prompts - const imageCount = extractCount(/(\d+)\s+image/i, stepLogs || []); - if (imageCount) { - return `${imageCount} image${imageCount !== '1' ? 's' : ''} generated successfully`; - } - return 'Images generated successfully'; } return 'Task completed successfully.'; }; @@ -165,16 +166,8 @@ const getStepsForFunction = (functionId?: string, title?: string): Array<{phase: ]; } - if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { - // Image prompt generation - return [ - { phase: 'INIT', label: 'Checking content and image slots' }, - { phase: 'PREP', label: 'Mapping Content for X Image Prompts' }, - { phase: 'AI_CALL', label: 'Writing Featured Image Prompts' }, - { phase: 'PARSE', label: 'Writing X In‑article Image Prompts' }, - { phase: 'SAVE', label: 'Assigning Prompts to Dedicated Slots' }, - ]; - } else if (funcName.includes('image') && funcName.includes('from')) { + // Check for image generation from prompts FIRST (more specific) + if (funcName.includes('image') && funcName.includes('from')) { // Image generation from prompts return [ { phase: 'INIT', label: 'Validating image prompts' }, @@ -183,6 +176,15 @@ const getStepsForFunction = (functionId?: string, title?: string): Array<{phase: { phase: 'PARSE', label: 'Processing image URLs' }, { phase: 'SAVE', label: 'Saving image URLs' }, ]; + } else if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { + // Image prompt generation + return [ + { phase: 'INIT', label: 'Checking content and image slots' }, + { phase: 'PREP', label: 'Mapping Content for X Image Prompts' }, + { phase: 'AI_CALL', label: 'Writing Featured Image Prompts' }, + { phase: 'PARSE', label: 'Writing X In‑article Image Prompts' }, + { phase: 'SAVE', label: 'Assigning Prompts to Dedicated Slots' }, + ]; } // Default fallback @@ -390,7 +392,57 @@ export default function ProgressModal({ return `${articleCount} article${articleCount !== '1' ? 's' : ''} created`; } } - } else if (funcName.includes('image')) { + } else if (funcName.includes('image') && funcName.includes('from')) { + // Image generation from prompts + if (stepPhase === 'PREP') { + // Extract image count from PREP step message + const imageCount = extractCount(/(\d+)\s+image/i); + if (imageCount) { + return `Preparing to generate ${imageCount} image${imageCount !== '1' ? 's' : ''}`; + } + if (stepLog?.message) { + const match = stepLog.message.match(/Preparing to generate (\d+)\s+image/i); + if (match && match[1]) { + return `Preparing to generate ${match[1]} image${match[1] !== '1' ? 's' : ''}`; + } + } + return 'Preparing image generation queue'; + } else if (stepPhase === 'AI_CALL') { + // Extract current image number from message + const match = stepLog?.message?.match(/Generating.*image (\d+)/i); + if (match && match[1]) { + return `Generating image ${match[1]} with AI`; + } + return 'Generating images with AI'; + } else if (stepPhase === 'PARSE') { + // Extract image count from PARSE step + const imageCount = extractCount(/(\d+)\s+image/i); + if (imageCount) { + return `${imageCount} image${imageCount !== '1' ? 's' : ''} generated successfully`; + } + if (stepLog?.message) { + const match = stepLog.message.match(/(\d+)\s+image.*generated/i); + if (match && match[1]) { + return `${match[1]} image${match[1] !== '1' ? 's' : ''} generated successfully`; + } + } + return 'Processing image URLs'; + } else if (stepPhase === 'SAVE') { + // Extract image count from SAVE step + const imageCount = extractCount(/(\d+)\s+image/i); + if (imageCount) { + return `Saving ${imageCount} image${imageCount !== '1' ? 's' : ''}`; + } + if (stepLog?.message) { + const match = stepLog.message.match(/Saved image (\d+)/i); + if (match && match[1]) { + return `Saving image ${match[1]}`; + } + } + return 'Saving image URLs'; + } + } else if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { + // Image prompt generation if (stepPhase === 'PREP') { // Extract total image count from PREP step message // Look for "Mapping Content for X Image Prompts" @@ -606,17 +658,31 @@ export default function ProgressModal({ } else if (funcName.includes('idea')) { // For idea generation, use fixed heading return 'Generating Content Ideas & Outline'; - } else if (funcName.includes('image')) { - // For image prompts, use fixed heading + } else if (funcName.includes('image') && funcName.includes('from')) { + // For image generation from prompts + return 'Generate Images'; + } else if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { + // For image prompt generation return 'Smart Image Prompts'; + } else if (funcName.includes('image')) { + // Fallback for other image functions + return 'Generate Images'; } return title; })()} - {/* Subtitle for image prompts */} + {/* Subtitle for image functions */} {(() => { const funcName = (functionId || title || '').toLowerCase(); - if (funcName.includes('image')) { + if (funcName.includes('image') && funcName.includes('from')) { + // Image generation from prompts + return ( +
+ Generating images from prompts using AI +
+ ); + } else if (funcName.includes('image') && (funcName.includes('prompt') || funcName.includes('extract'))) { + // Image prompt generation return (Powered by Igny8 Visual Intelligence @@ -626,7 +692,24 @@ export default function ProgressModal({ return null; })()} {!showSuccess && status !== 'completed' && ( -
{message}
++ {(() => { + const funcName = (functionId || title || '').toLowerCase(); + // For image generation, show a more specific message + if (funcName.includes('image') && funcName.includes('from')) { + // Get current step message from step logs + const currentStepLog = stepLogs.find(log => log.stepName === currentPhase); + if (currentStepLog?.message) { + return currentStepLog.message; + } + // Fallback to step label + const currentStep = steps.find(s => s.phase === currentPhase); + return currentStep?.label || 'Generating images...'; + } + // For other functions, use the message prop + return message; + })()} +
)} {status === 'completed' && !allStepsVisuallyCompleted && (Processing...
diff --git a/frontend/src/config/pages/images.config.tsx b/frontend/src/config/pages/images.config.tsx index e1ec251f..b966f365 100644 --- a/frontend/src/config/pages/images.config.tsx +++ b/frontend/src/config/pages/images.config.tsx @@ -8,6 +8,7 @@ import React from 'react'; import Badge from '../../components/ui/badge/Badge'; import ContentImageCell, { ContentImageData } from '../../components/common/ContentImageCell'; import { ContentImagesGroup } from '../../services/api'; +import { BoltIcon } from '../../icons'; export interface ColumnConfig { key: string;