PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m13s
PR Checks / Backend Smoke (pull_request) Successful in 9s
PR Checks / Build Backend (no push) (pull_request) Successful in 17s
PR Checks / Build Frontend (no push) (pull_request) Canceled after 1m6s
PR Checks / Build Pipeline (no push) (pull_request) Canceled after 0s
PR Checks / AI Code Review (Claude) (pull_request) Canceled after 0s
Review of the per-phase limit found entries reaching the basket with no phase, and a phase-less entry holds a slot in both groups: - Nearby-school cards added without one. The API now returns each peer's own phase (its pool is a phase group, so an all-through school can sit beside a primary); the button passes it through, and an older API simply leaves the conservative both-groups count in place. - Baskets saved before this change were never migrated. The compare page now backfills missing phases from the data it already fetches, and never overwrites a phase the basket has. - "16 plus" counted against both groups; it is secondary, as the API's PHASE_GROUPS files it. Also rewraps the HomeView doc comment the previous commit left awkward. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
'use client';
|
|
|
|
/**
|
|
* The per-card basket toggle.
|
|
*
|
|
* The links around it are server-rendered, so the section works with JS off;
|
|
* this adds the basket interaction on top rather than being what makes the
|
|
* section function.
|
|
*/
|
|
|
|
import { useComparisonContext } from '@/context/ComparisonContext';
|
|
import type { School, NearbySchool } from '@/lib/types';
|
|
import styles from './NearbySchools.module.css';
|
|
|
|
export function AddToCompareButton({ school }: { school: NearbySchool }) {
|
|
const { addSchool, removeSchool, selectedSchools } = useComparisonContext();
|
|
const selected = selectedSchools.some((s) => s.urn === school.urn);
|
|
|
|
const toggle = () => {
|
|
if (selected) {
|
|
removeSchool(school.urn);
|
|
return;
|
|
}
|
|
// The basket only needs identity and display fields; the compare page
|
|
// fetches everything it renders by URN.
|
|
addSchool({
|
|
urn: school.urn,
|
|
school_name: school.school_name,
|
|
school_type: school.school_type,
|
|
age_range: school.age_range,
|
|
// The basket limits each phase separately. Missing (an older API)
|
|
// counts against both groups, which is safe, just stricter.
|
|
phase: school.phase ?? null,
|
|
} as School);
|
|
};
|
|
|
|
return (
|
|
<button
|
|
type="button"
|
|
className={styles.add}
|
|
onClick={toggle}
|
|
aria-pressed={selected}
|
|
>
|
|
{selected ? '✓ Added to compare' : '+ Add to compare'}
|
|
<span className={styles.srOnly}>: {school.school_name}</span>
|
|
</button>
|
|
);
|
|
}
|