/** * Preview Card Component * * Displays live previews of how the metadata will appear in: * - Search engine results * - Social media platforms * - Rich snippets */ import React from 'react'; import { Box, Typography, Paper, Grid, Card, CardContent, Chip, Divider, Alert, IconButton, Tooltip, Button } from '@mui/material'; import { ContentCopy as CopyIcon, Check as CheckIcon, Search as SearchIcon, Share as ShareIcon, Code as CodeIcon, Facebook as FacebookIcon, Twitter as TwitterIcon, LinkedIn as LinkedInIcon, Google as GoogleIcon } from '@mui/icons-material'; interface PreviewCardProps { metadata: any; blogTitle: string; } export const PreviewCard: React.FC = ({ metadata, blogTitle }) => { const copyToClipboard = async (text: string, itemId: string) => { try { await navigator.clipboard.writeText(text); // You could add a state to show "Copied!" feedback here } catch (err) { console.error('Failed to copy to clipboard:', err); } }; const getCurrentDate = () => { return new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); }; const getCurrentTime = () => { return new Date().toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' }); }; return ( Live Preview {/* Google Search Results Preview */} Google Search Results {/* URL */} {metadata.canonical_url || 'https://yourwebsite.com/blog-post'} {/* Title */} {metadata.seo_title || blogTitle} {/* Description */} {metadata.meta_description || 'Your meta description will appear here in Google search results...'} {/* Additional Info */} {getCurrentDate()} {metadata.reading_time || 5} min read {metadata.blog_tags && metadata.blog_tags.length > 0 && ( <> {metadata.blog_tags.slice(0, 2).join(', ')} )} This is how your blog post will appear in Google search results {/* Social Media Previews */} Facebook Preview {/* Image placeholder */} {metadata.open_graph?.image ? 'Image loaded' : 'No image set'} {/* URL */} {metadata.canonical_url || 'yourwebsite.com'} {/* Title */} {metadata.open_graph?.title || metadata.seo_title || blogTitle} {/* Description */} {metadata.open_graph?.description || metadata.meta_description || 'Your description will appear here...'} Twitter Preview {/* Image placeholder */} {metadata.twitter_card?.image ? 'Image loaded' : 'No image set'} {/* URL */} {metadata.canonical_url || 'yourwebsite.com'} {/* Title */} {metadata.twitter_card?.title || metadata.seo_title || blogTitle} {/* Description */} {metadata.twitter_card?.description || metadata.meta_description || 'Your description will appear here...'} {/* Twitter handle */} {metadata.twitter_card?.site && ( {metadata.twitter_card.site} )} {/* Rich Snippets Preview */} Rich Snippets Preview {/* Article Schema Preview */} {metadata.json_ld_schema?.headline || metadata.seo_title || blogTitle} {metadata.json_ld_schema?.description || metadata.meta_description || 'Article description...'} {metadata.json_ld_schema?.author?.name && ( By {metadata.json_ld_schema.author.name} )} {metadata.json_ld_schema?.datePublished && ( {new Date(metadata.json_ld_schema.datePublished).toLocaleDateString()} )} {metadata.reading_time && ( {metadata.reading_time} min read )} {metadata.json_ld_schema?.wordCount && ( {metadata.json_ld_schema.wordCount} words )} {metadata.json_ld_schema?.keywords && metadata.json_ld_schema.keywords.length > 0 && ( Keywords: {metadata.json_ld_schema.keywords.slice(0, 5).map((keyword: string, index: number) => ( ))} )} Rich snippets help search engines understand your content and may display additional information in search results {/* Metadata Summary */} Metadata Summary {metadata.optimization_score || 0}% Optimization Score {metadata.reading_time || 0} Reading Time (min) {metadata.blog_tags?.length || 0} Tags {metadata.blog_categories?.length || 0} Categories ); };