import React, { useState, useEffect } from 'react'; import { extractTitleFromText, UrlTitleResult } from '../../utils/urlService'; import { XMarkIcon, PhotoIcon } from '@heroicons/react/24/outline'; interface UrlPreviewProps { text: string; onPreviewChange?: (preview: UrlTitleResult | null) => void; } const UrlPreview: React.FC = ({ text, onPreviewChange }) => { const [preview, setPreview] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isVisible, setIsVisible] = useState(true); const [imageError, setImageError] = useState(false); useEffect(() => { const extractPreview = async () => { if (!text.trim()) { setPreview(null); onPreviewChange?.(null); return; } setIsLoading(true); try { const result = await extractTitleFromText(text); setPreview(result); onPreviewChange?.(result); } catch (error) { console.error('Failed to extract URL preview:', error); setPreview(null); onPreviewChange?.(null); } finally { setIsLoading(false); } }; const timeoutId = setTimeout(extractPreview, 300); return () => clearTimeout(timeoutId); }, [text, onPreviewChange]); const handleDismiss = () => { setIsVisible(false); setPreview(null); onPreviewChange?.(null); }; const handleImageError = () => { setImageError(true); }; if (!isVisible || (!preview && !isLoading)) { return null; } if (isLoading) { return (
Loading preview...
); } if (!preview) { return null; } return (
{preview.image && !imageError ? ( Preview ) : (
)}
{preview.title || 'Untitled'}
{preview.description && (
{preview.description}
)}
{preview.url}
); }; export default UrlPreview;