'use client'; import { useEffect, useState } from 'react'; import { useParams, useSearchParams } from 'next/navigation'; import Link from 'next/link'; import { useJobs } from '@/contexts/JobsContext'; import ReviewAnalytics from '@/components/ReviewAnalytics'; import { JobStatus } from '@/components/ScraperTest'; interface Review { author: string; rating: number; text: string | null; date_text: string; avatar_url: string | null; profile_url: string | null; review_id: string; is_new?: boolean; } function extractBusinessName(job: JobStatus): string { if (job.business_name) return job.business_name; try { const urlObj = new URL(job.url); const query = urlObj.searchParams.get('query'); return query ? decodeURIComponent(query) : 'Unknown Business'; } catch { return 'Unknown Business'; } } export default function AnalyticsDetailPage() { const params = useParams(); const searchParams = useSearchParams(); const { jobs } = useJobs(); const jobId = params.id as string; const compareJobId = searchParams.get('compare'); const [job, setJob] = useState(null); const [reviews, setReviews] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [newCount, setNewCount] = useState(undefined); // Find job from context or fetch it useEffect(() => { const foundJob = jobs.find(j => j.job_id === jobId); if (foundJob) { setJob(foundJob); } else { fetch(`/api/jobs/${jobId}`) .then(res => res.json()) .then(data => setJob(data)) .catch(err => setError(err.message)); } }, [jobId, jobs]); // Fetch reviews useEffect(() => { if (!jobId) return; setIsLoading(true); setError(null); const url = compareJobId ? `/api/jobs/${jobId}/compare?previous=${compareJobId}` : `/api/jobs/${jobId}/reviews?limit=10000`; fetch(url) .then(async res => { if (!res.ok) { const errorData = await res.json().catch(() => ({})); throw new Error(errorData.error || `Failed to fetch reviews (${res.status})`); } return res.json(); }) .then(data => { setReviews(data.reviews || []); setNewCount(data.new_count); }) .catch(err => setError(err.message)) .finally(() => setIsLoading(false)); }, [jobId, compareJobId]); if (isLoading) { return (

Loading analytics...

); } if (error) { return (

Error Loading Analytics

{error}

Back to Analytics
); } if (reviews.length === 0) { return (

No Reviews Found

This job has no reviews to analyze

Back to Analytics
); } const businessName = job ? extractBusinessName(job) : 'Business'; const businessUrl = job?.url || ''; return (
{/* Breadcrumb */}
Analytics / {businessName}
{/* Header with back button */}

Analytics

View Job Details Back to Analytics
); }