/** * HomeView Component * Client-side home page view with search and filtering */ 'use client'; import { useState, useEffect } from 'react'; import { useSearchParams } from 'next/navigation'; import { FilterBar } from './FilterBar'; import { SchoolCard } from './SchoolCard'; import { SchoolMap } from './SchoolMap'; import { Pagination } from './Pagination'; import { EmptyState } from './EmptyState'; import { useComparisonContext } from '@/context/ComparisonContext'; import type { SchoolsResponse, Filters, School } from '@/lib/types'; import styles from './HomeView.module.css'; interface HomeViewProps { initialSchools: SchoolsResponse; filters: Filters; } export function HomeView({ initialSchools, filters }: HomeViewProps) { const searchParams = useSearchParams(); const { addSchool, selectedSchools } = useComparisonContext(); const [resultsView, setResultsView] = useState<'list' | 'map'>('list'); const [selectedMapSchool, setSelectedMapSchool] = useState(null); const hasSearch = searchParams.get('search') || searchParams.get('postcode'); const isLocationSearch = !!searchParams.get('postcode'); // Close bottom sheet if we change views or search useEffect(() => { setSelectedMapSchool(null); }, [resultsView, searchParams]); return (
{/* Combined Hero + Search and Filters */}

Compare Primary School Performance

Search and compare KS2 results for thousands of schools across England

{/* Location Info Banner with View Toggle */} {isLocationSearch && initialSchools.location_info && (
Showing schools within {(initialSchools.location_info.radius / 1.60934).toFixed(1)} miles of{' '} {initialSchools.location_info.postcode}
{initialSchools.schools.length > 0 && (
)}
)} {/* Results Section */}
{!hasSearch && initialSchools.schools.length > 0 && (

Featured Schools

Explore schools from across England

)} {hasSearch && resultsView === 'list' && (

{initialSchools.total.toLocaleString()} school {initialSchools.total !== 1 ? 's' : ''} found

)} {initialSchools.schools.length === 0 ? ( { window.location.href = '/'; }, } : undefined } /> ) : resultsView === 'map' && isLocationSearch ? ( /* Map View Layout */
{initialSchools.schools.map((school) => (
s.urn === school.urn)} />
))}
{/* Mobile Bottom Sheet for Selected Map Pin */} {selectedMapSchool && (
s.urn === selectedMapSchool.urn)} />
)}
) : ( /* List View Layout */ <>
{initialSchools.schools.map((school) => ( s.urn === school.urn)} /> ))}
{initialSchools.total_pages > 1 && ( )} )}
); } /* Compact School Item for Map View */ interface CompactSchoolItemProps { school: School; onAddToCompare: (school: School) => void; isInCompare: boolean; } function CompactSchoolItem({ school, onAddToCompare, isInCompare }: CompactSchoolItemProps) { return (
{school.school_name} {school.distance !== undefined && school.distance !== null && ( {(school.distance / 1.60934).toFixed(1)} mi )}
{school.school_type && {school.school_type}} {school.local_authority && {school.local_authority}}
{school.rwm_expected_pct !== null ? `${school.rwm_expected_pct}%` : '-'} RWM {school.total_pupils || '-'} pupils
Details
); }