/** * ContentImageCell Component * Displays image prompt, placeholder, or actual image based on status */ import React, { useState } from 'react'; import Badge from '../ui/badge/Badge'; import Button from '../ui/button/Button'; export interface ContentImageData { id?: number; image_type?: string; image_url?: string | null; image_path?: string | null; prompt?: string | null; status: string; position?: number; created_at?: string; updated_at?: string; } interface ContentImageCellProps { image: ContentImageData | null; maxPromptLength?: number; showPrompt?: boolean; // New prop to control prompt visibility onImageClick?: () => void; // Optional click handler } export default function ContentImageCell({ image, maxPromptLength = 100, showPrompt = false, onImageClick }: ContentImageCellProps) { const [showFullPrompt, setShowFullPrompt] = useState(false); // Check if image_path is a valid local file path (not a URL) const isValidLocalPath = (imagePath: string): boolean => { // Reject URLs (http:// or https://) if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) { return false; } // Must contain 'ai-images' to be a valid local path return imagePath.includes('ai-images'); }; // Convert local file path to web-accessible URL const getLocalImageUrl = (imagePath: string): string => { // If path contains 'ai-images', convert to web URL if (imagePath.includes('ai-images')) { const filename = imagePath.split('ai-images/')[1] || imagePath.split('ai-images\\')[1]; if (filename) { return `/images/ai-images/${filename}`; } } // If path is already a web path, return as-is if (imagePath.startsWith('/images/')) { return imagePath; } // Otherwise, try to extract filename and use ai-images path const filename = imagePath.split('/').pop() || imagePath.split('\\').pop(); return `/images/ai-images/${filename}`; }; if (!image) { return (
{displayPrompt} {shouldTruncate && ( )}
Pending
Image not available
No image available
Failed