useProfileDefaults hook observes profile changes in Yjs and merges relevant POI categories into the enabled set. Skips initial load to respect existing state. Cycling profiles → bike infra, hiking → shelter + viewpoints. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
import { useEffect, useRef } from "react";
|
|
import type { YjsState } from "./use-yjs.ts";
|
|
import type { PoiState } from "./use-pois.ts";
|
|
import { getCategoriesForProfile } from "./poi-categories.ts";
|
|
|
|
/**
|
|
* Auto-enable relevant POI categories when the routing profile changes.
|
|
* Only triggers on explicit profile changes (not initial load).
|
|
*/
|
|
export function useProfileDefaults(yjs: YjsState | null, poiState: PoiState): void {
|
|
const initializedRef = useRef(false);
|
|
const prevProfileRef = useRef<string | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (!yjs) return;
|
|
|
|
const handleChange = () => {
|
|
const profile = yjs.routeData.get("profile") as string | undefined;
|
|
if (!profile) return;
|
|
|
|
// Skip initial load — respect existing state
|
|
if (!initializedRef.current) {
|
|
initializedRef.current = true;
|
|
prevProfileRef.current = profile;
|
|
return;
|
|
}
|
|
|
|
// Only act on actual profile changes
|
|
if (profile === prevProfileRef.current) return;
|
|
prevProfileRef.current = profile;
|
|
|
|
// Auto-enable POI categories for this profile
|
|
const defaultCategories = getCategoriesForProfile(profile);
|
|
if (defaultCategories.length > 0) {
|
|
poiState.setEnabledCategories((prev: string[]) => {
|
|
const merged = new Set([...prev, ...defaultCategories]);
|
|
return [...merged];
|
|
});
|
|
}
|
|
};
|
|
|
|
yjs.routeData.observe(handleChange);
|
|
return () => yjs.routeData.unobserve(handleChange);
|
|
}, [yjs, poiState.setEnabledCategories]);
|
|
}
|