"use client"; import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent } from "@/components/ui/card"; import { Globe, Edit, Check, Loader2, X, ImageOff, Search, } from "lucide-react"; import { extractMetaData, type HeadlineNode, type ImageAltData } from "@/app/actions"; import { LengthIndicator } from "./length-indicator"; import { CopyButton } from "./copy-button"; import { SerpPreview } from "./serp-preview"; import { ResultsSkeleton } from "./results-skeleton"; import { FaqDisplay } from "./faq-display"; import { HeadlineTree } from "./headline-tree"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { ImageAltDisplay } from "./image-alt-display"; interface MetaData { title: string; description: string; image?: string | null; faq?: { question: string; answer: string }[] | null; headlines?: HeadlineNode[] | null; keyword?: string | null; keywordCount?: number | null; images?: ImageAltData[] | null; } export function MetaForm() { const [url, setUrl] = useState(""); const [keyword, setKeyword] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [metaData, setMetaData] = useState(null); const [isEditingTitle, setIsEditingTitle] = useState(false); const [isEditingDescription, setIsEditingDescription] = useState(false); const [editableTitle, setEditableTitle] = useState(""); const [editableDescription, setEditableDescription] = useState(""); const [imageError, setImageError] = useState(false); useEffect(() => { if (metaData) { setEditableTitle(metaData.title); setEditableDescription(metaData.description); setImageError(false); } }, [metaData]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); setLoading(true); setError(null); setMetaData(null); setIsEditingTitle(false); setIsEditingDescription(false); setImageError(false); const result = await extractMetaData(url, keyword); if (result.error) { setError(result.error); } else if (result.data) { setMetaData(result.data); } setLoading(false); }; const handleClear = () => { setUrl(""); setKeyword(""); setLoading(false); setError(null); setMetaData(null); }; return (
setUrl(e.target.value)} />
setKeyword(e.target.value)} />
{(url || metaData || error) && ( )}
{loading && } {!loading && error && (

{error}

)} {!loading && metaData && ( Meta Analysis {metaData.headlines && metaData.headlines.length > 0 && ( Headlines )} {metaData.images && metaData.images.length > 0 && ( Images )} {metaData.faq && metaData.faq.length > 0 && ( FAQ )}

SERP Preview

{metaData.image && (

Preview Image

{!imageError ? ( Meta preview image setImageError(true)} /> ) : (
Image not available
)}
)}

Meta Title

{editableTitle.length} Characters

The title of the page, ideally between 30 and 60 characters.

{isEditingTitle ? ( setEditableTitle(e.target.value)} className="w-full" placeholder="Meta Title" /> ) : (

{editableTitle || "Not found"}

)}

Meta Description

{editableDescription.length} Characters

A brief summary of the page's content, ideally between 120 and 158 characters.

{isEditingDescription ? (