'use client' import Link from 'next/link' import { MagnifyingGlass, CaretUp, CaretDown } from '@phosphor-icons/react' import { useGSCStatus, useGSCOverview, useGSCTopQueries } from '@/lib/swr/dashboard' interface SearchPerformanceProps { siteId: string dateRange: { start: string; end: string } } function ChangeArrow({ current, previous, invert = false }: { current: number; previous: number; invert?: boolean }) { if (!previous || previous === 0) return null const improved = invert ? current < previous : current > previous const same = current === previous if (same) return null return improved ? ( ) : ( ) } export default function SearchPerformance({ siteId, dateRange }: SearchPerformanceProps) { const { data: gscStatus } = useGSCStatus(siteId) const { data: overview, isLoading: overviewLoading } = useGSCOverview(siteId, dateRange.start, dateRange.end) const { data: queriesData, isLoading: queriesLoading } = useGSCTopQueries(siteId, dateRange.start, dateRange.end, 5, 0) // Don't render if GSC is not connected or no data if (!gscStatus?.connected) return null const isLoading = overviewLoading || queriesLoading const queries = queriesData?.queries ?? [] const hasData = overview && (overview.total_clicks > 0 || overview.total_impressions > 0) // Hide panel entirely if loaded but no data if (!isLoading && !hasData) return null return (
{/* Header */}

Search

View all →
{isLoading ? ( /* Loading skeleton */
{Array.from({ length: 5 }).map((_, i) => (
))}
) : ( <> {/* Inline stats row */}
Clicks {(overview?.total_clicks ?? 0).toLocaleString()}
Impressions {(overview?.total_impressions ?? 0).toLocaleString()}
Avg Position {(overview?.avg_position ?? 0).toFixed(1)}
{/* Top 5 queries list */}
{queries.length > 0 ? ( queries.map((q) => (
{q.query}
{q.clicks.toLocaleString()} {q.position.toFixed(1)}
)) ) : (

No search data yet

)}
)}
) }