fix(tours): match a saved ski route by its ski choice, and keep the planner under the lint limits

The saved ski route compared against an undefined skiKey, so opening a saved
ski tour threw. The held seed now lives in useSavedSkiSeed and is matched by
skiRouteKey(skiChoice). The ski route facts move to skiRouteFacts.ts so the
summary and leg rows only export components, the rail renders
SkiPlannerSummary, and openTour, useTourRoute and useAddonManager shed the
branches and lines the new ski code had added.
This commit is contained in:
Maurice
2026-10-20 21:43:46 +02:00
parent e5c5ffbc00
commit d3f574f225
8 changed files with 257 additions and 207 deletions
@@ -1,3 +1,4 @@
import type { AdminFeatureToggleResponse } from '@trek/shared';
import { Bike, Footprints, MountainSnow } from 'lucide-react';
import { useEffect, useEffectEvent, useState } from 'react';
@@ -9,6 +10,18 @@ import { useAddonStore } from '../../../store/addonStore';
import { useToast } from '../../shared/Toast';
import { type Addon, type ProviderOption, isPhotosAddon } from './addonModel';
/** A switch under Tours as the server keeps it, read into `set`; `onError` tells the admin it could not be read. */
function loadToursFlag(
api: { get: () => Promise<AdminFeatureToggleResponse> },
set: (enabled: boolean) => void,
onError: () => void
) {
api
.get()
.then((flag) => set(flag.enabled))
.catch(onError);
}
/**
* The addon switches behind both admin shells: the addon list loaded on mount, an
* optimistic toggle with a per row rollback, and the lists each shell groups its tiles
@@ -37,22 +50,11 @@ export function useAddonManager() {
const loadOnMount = useEffectEvent(() => {
void loadAddons().finally(() => setLoading(false));
wandererAdminApi
.get()
.then((flag) => setToursWanderer(flag.enabled))
.catch(() => toast.error(t('admin.addons.toast.error')));
hikingMapAdminApi
.get()
.then((flag) => setToursHikingMap(flag.enabled))
.catch(() => toast.error(t('admin.addons.toast.error')));
cycleMapAdminApi
.get()
.then((flag) => setToursCycleMap(flag.enabled))
.catch(() => toast.error(t('admin.addons.toast.error')));
skiRoutingAdminApi
.get()
.then((flag) => setToursSkiRouting(flag.enabled))
.catch(() => toast.error(t('admin.addons.toast.error')));
const unreadable = () => toast.error(t('admin.addons.toast.error'));
loadToursFlag(wandererAdminApi, setToursWanderer, unreadable);
loadToursFlag(hikingMapAdminApi, setToursHikingMap, unreadable);
loadToursFlag(cycleMapAdminApi, setToursCycleMap, unreadable);
loadToursFlag(skiRoutingAdminApi, setToursSkiRouting, unreadable);
});
useEffect(() => {
loadOnMount();