"use client"; import { useEffect, useState, useMemo } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { extractMetaData } from "@/app/actions"; 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"; import { TabIndicator } from "./tab-indicator"; import { getLengthIndicatorColor, type IndicatorColor } from "@/lib/analysis"; import { SchemaDisplay } from "./schema-display"; import { MetaFormInputs } from "./meta-form-inputs"; import { AnalysisTab } from "./analysis-tab"; import { SocialTab } from "./social-tab"; import { LinksDisplay } from "./links-display"; import { SystemDisplay } from "./system-display"; import { TrackingDisplay } from "./tracking-display"; import type { MetaData } from "@/lib/types"; 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 tabColors = useMemo(() => { if (!metaData) return null; // Analysis Tab const titleStatus = getLengthIndicatorColor(editableTitle.length, "title"); const descStatus = getLengthIndicatorColor( editableDescription.length, "description" ); const analysisStatuses: IndicatorColor[] = [titleStatus, descStatus]; let analysisColor: IndicatorColor; if ( analysisStatuses.includes("red") || analysisStatuses.includes("gray") ) { analysisColor = "red"; } else if (analysisStatuses.includes("yellow")) { analysisColor = "yellow"; } else { analysisColor = "green"; } // Headlines Tab let headlinesColor: IndicatorColor = "gray"; if (metaData.headlines && metaData.headlines.length > 0) { const h1s = metaData.headlines.filter((h) => h.tag === "h1"); if (h1s.length === 0) { headlinesColor = "red"; } else if (h1s.length > 1) { headlinesColor = "yellow"; } else { headlinesColor = "green"; } } // Images Tab let imagesColor: IndicatorColor = "gray"; if (metaData.images && metaData.images.length > 0) { const totalImages = metaData.images.length; const missingAltCount = metaData.images.filter((img) => !img.alt).length; if (missingAltCount === 0) { imagesColor = "green"; } else { const missingPercentage = missingAltCount / totalImages; if (missingPercentage > 0.5) { imagesColor = "red"; } else { imagesColor = "yellow"; } } } // Social Tab let socialColor: IndicatorColor = "gray"; if (metaData.openGraph && metaData.twitter) { const og = metaData.openGraph; const tw = metaData.twitter; const hasOgBasics = og.title && og.description && og.image; const hasTwBasics = tw.card && tw.title && tw.description && tw.image; if (hasOgBasics && hasTwBasics) { socialColor = "green"; } else if (hasOgBasics || (tw.card && tw.title)) { socialColor = "yellow"; } else { socialColor = "red"; } } // Links Tab let linksColor: IndicatorColor = "gray"; if (metaData.links && metaData.links.length > 0) { const hasMissingNofollow = metaData.links.some( (link) => link.type === "external" && !link.rel.includes("nofollow") ); linksColor = hasMissingNofollow ? "yellow" : "green"; } // FAQ Tab let faqColor: IndicatorColor = "gray"; if (metaData.faq && metaData.faq.length > 0) { faqColor = "green"; } // Schema Tab let schemaColor: IndicatorColor = "gray"; if (metaData.schema && metaData.schema.length > 0) { schemaColor = "green"; } // System Tab const systemColor: IndicatorColor = metaData.systems && metaData.systems.length > 0 ? "green" : "gray"; // Tracking Tab const trackingColor: IndicatorColor = metaData.tracking && metaData.tracking.length > 0 ? "green" : "gray"; return { analysis: analysisColor, headlines: headlinesColor, images: imagesColor, social: socialColor, links: linksColor, faq: faqColor, schema: schemaColor, system: systemColor, tracking: trackingColor, }; }, [metaData, editableTitle, editableDescription]); 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 as MetaData); } setLoading(false); }; const handleClear = () => { setUrl(""); setKeyword(""); setLoading(false); setError(null); setMetaData(null); }; return (
{loading && } {!loading && error && (

{error}

)} {!loading && metaData && ( Meta Analysis {tabColors && } {metaData.headlines && metaData.headlines.length > 0 && ( Headlines {tabColors && } )} {metaData.images && metaData.images.length > 0 && ( Images {tabColors && } )} {metaData.links && metaData.links.length > 0 && ( Links {tabColors && } )} {metaData.openGraph && metaData.twitter && ( Social {tabColors && } )} {metaData.schema && metaData.schema.length > 0 && ( Schema {tabColors && } )} {metaData.systems && metaData.systems.length > 0 && ( System {tabColors && } )} {metaData.tracking && metaData.tracking.length > 0 && ( Tracking {tabColors && } )} {metaData.faq && metaData.faq.length > 0 && ( FAQ {tabColors && } )} {metaData.headlines && metaData.headlines.length > 0 && ( )} {metaData.images && metaData.images.length > 0 && ( )} {metaData.links && metaData.links.length > 0 && ( )} {metaData.openGraph && metaData.twitter && ( )} {metaData.faq && metaData.faq.length > 0 && ( )} {metaData.schema && metaData.schema.length > 0 && ( )} {metaData.systems && metaData.systems.length > 0 && ( )} {metaData.tracking && metaData.tracking.length > 0 && ( )} )}
); }