trails/apps/planner/app/lib/use-profile-defaults.ts
Ullrich Schäfer 22c5ebd838
Auto-enable POI categories on routing profile change
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>
2026-04-11 02:19:30 +02:00

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]);
}