'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 */}
{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)}
))
) : (
)}
>
)}
)
}