The seed effect only adopted the URL's schools when localStorage was empty, so a recipient who had ever used compare silently saw their own old shortlist instead of the shared one. Explicit URL urns now replace the stored selection on load (then persist as usual); bare /compare still restores the visitor's own selection. Adds replaceSchools() to the comparison context. Card values also switch to CHART_TEXT_COLORS. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
51 lines
1.1 KiB
TypeScript
51 lines
1.1 KiB
TypeScript
/**
|
|
* Custom hook for managing school comparison state
|
|
* Uses shared context for real-time updates across components
|
|
*/
|
|
|
|
'use client';
|
|
|
|
import useSWR from 'swr';
|
|
import { fetcher } from '@/lib/api';
|
|
import { useComparisonContext } from '@/context/ComparisonContext';
|
|
import type { ComparisonResponse } from '@/lib/types';
|
|
|
|
export function useComparison() {
|
|
const {
|
|
selectedSchools,
|
|
addSchool,
|
|
removeSchool,
|
|
replaceSchools,
|
|
clearAll,
|
|
isSelected,
|
|
canAddMore,
|
|
isInitialized,
|
|
} = useComparisonContext();
|
|
|
|
// Fetch comparison data for selected schools
|
|
const urns = selectedSchools.map((s) => s.urn).join(',');
|
|
const { data, error, isLoading, mutate } = useSWR<ComparisonResponse>(
|
|
selectedSchools.length > 0 ? `/compare?urns=${urns}` : null,
|
|
fetcher,
|
|
{
|
|
revalidateOnFocus: false,
|
|
dedupingInterval: 10000,
|
|
}
|
|
);
|
|
|
|
return {
|
|
selectedSchools,
|
|
comparisonData: data?.comparison,
|
|
isLoading,
|
|
error,
|
|
addSchool,
|
|
removeSchool,
|
|
replaceSchools,
|
|
clearAll,
|
|
isSelected,
|
|
canAddMore,
|
|
isInitialized,
|
|
mutate,
|
|
};
|
|
}
|