import { useEffect, useState } from "react"; import { HeaderHelpLabel } from "@/client/features/keywords/components"; import { Search } from "lucide-react"; import { BacklinksNewLostChart, BacklinksTrendChart, } from "./BacklinksPageCharts"; import { BacklinksTable } from "./BacklinksTable"; import { ReferringDomainsTable } from "./ReferringDomainsTable"; import { TopPagesTable } from "./TopPagesTable"; import type { BacklinksOverviewData, BacklinksSearchState, } from "./backlinksPageTypes"; import { TAB_DESCRIPTIONS, formatRelativeTimestamp, } from "./backlinksPageUtils"; export function BacklinksOverviewPanels({ data, summaryStats, }: { data: BacklinksOverviewData; summaryStats: Array<{ label: string; value: string; description: string }>; }) { return ( <>
{data.scope} Target: {data.displayTarget} - Updated {formatRelativeTimestamp(data.fetchedAt)}
{data.scope === "page" ? (
Showing backlinks for this exact page. Enter a bare domain for site-wide results. Trend charts are only shown for domain-level lookups.
) : null} ); } export function BacklinksResultsCard({ activeTab, filteredData, filterText, hideSpam, spamThreshold, isTabLoading, tabErrorMessage, onFilterTextChange, onSetActiveTab, onSetHideSpam, onSetSpamThreshold, }: { activeTab: BacklinksSearchState["tab"]; filteredData: { backlinks: BacklinksOverviewData["backlinks"]; referringDomains: BacklinksOverviewData["referringDomains"]; topPages: BacklinksOverviewData["topPages"]; }; filterText: string; hideSpam: boolean; spamThreshold: number; isTabLoading: boolean; tabErrorMessage: string | null; onFilterTextChange: (value: string) => void; onSetActiveTab: (tab: BacklinksSearchState["tab"]) => void; onSetHideSpam: (hideSpam: boolean) => void; onSetSpamThreshold: (threshold: number) => void; }) { return (
{tabErrorMessage ? (
{tabErrorMessage}
) : null} {activeTab === "backlinks" ? ( ) : null} {activeTab === "domains" && isTabLoading && !tabErrorMessage ? ( ) : null} {activeTab === "domains" && !isTabLoading && !tabErrorMessage ? ( ) : null} {activeTab === "pages" && isTabLoading && !tabErrorMessage ? ( ) : null} {activeTab === "pages" && !isTabLoading && !tabErrorMessage ? ( ) : null}
); } function OverviewGrid({ data, summaryStats, }: { data: BacklinksOverviewData; summaryStats: Array<{ label: string; value: string; description: string }>; }) { const domainScope = data.scope === "domain"; return (
{domainScope ? : null}
); } function ResultsHeader({ activeTab, filterText, hideSpam, spamThreshold, onFilterTextChange, onSetActiveTab, onSetHideSpam, onSetSpamThreshold, }: { activeTab: BacklinksSearchState["tab"]; filterText: string; hideSpam: boolean; spamThreshold: number; onFilterTextChange: (value: string) => void; onSetActiveTab: (tab: BacklinksSearchState["tab"]) => void; onSetHideSpam: (hideSpam: boolean) => void; onSetSpamThreshold: (threshold: number) => void; }) { const [draftSpamThreshold, setDraftSpamThreshold] = useState( String(spamThreshold), ); useEffect(() => { setDraftSpamThreshold(String(spamThreshold)); }, [spamThreshold]); function commitSpamThreshold() { onSetSpamThreshold( draftSpamThreshold.trim() === "" ? spamThreshold : Number(draftSpamThreshold), ); } return (
Backlinks Referring Domains Top Pages

{TAB_DESCRIPTIONS[activeTab]}

{activeTab === "backlinks" ? (
) : null}
); } function SummaryStatsGrid({ data, summaryStats, }: { data: BacklinksOverviewData; summaryStats: Array<{ label: string; value: string; description: string }>; }) { const cardClassName = `card bg-base-100 border border-base-300 ${data.scope === "domain" ? "md:col-span-2 xl:col-span-1" : ""}`; return (
{summaryStats.map((item) => (

{item.value}

))}
); } function TrendPanels({ data }: { data: BacklinksOverviewData }) { return ( <> ); } function TrendCard({ children, description, title, }: { children: React.ReactNode; description: string; title: string; }) { return (

{title}

{description}

{children}
); } function TabButton({ activeTab, children, onClick, tab, }: { activeTab: BacklinksSearchState["tab"]; children: string; onClick: (tab: BacklinksSearchState["tab"]) => void; tab: BacklinksSearchState["tab"]; }) { return ( ); } function TabLoadingState({ label }: { label: string }) { return (

{label}...

); }