From b460cfd9a7910caf152c2432d3214fe942e1d796 Mon Sep 17 00:00:00 2001 From: Maurice Date: Tue, 20 Oct 2026 17:51:28 +0200 Subject: [PATCH] refactor(tours): move non-component exports out of component files and split long hooks Clears the client lint ratchet: helpers move to sibling .ts files for react-refresh, complex render paths get small helpers, floating promises are voided, the stage rail lets a stale request go during render, and the collections page reads the active list's tours and rights in ActiveCollectionTours. StageNumber is no longer exported. --- .../tourActivity/AtlasTourActivityPane.tsx | 17 +---- .../tourActivity/TourActivityEntryRow.tsx | 7 ++- .../tourActivity/TourActivityStatsDialog.tsx | 19 ++---- .../Atlas/tourActivity/tourActivityParts.tsx | 45 ++----------- .../Atlas/tourActivity/tourActivityReading.ts | 39 ++++++++++++ .../Planner/DayPlanPlaceSubline.tsx | 9 ++- .../components/Settings/useWandererWatch.ts | 4 +- .../activity/TourActivityCompare.test.tsx | 3 +- .../Tours/activity/TourActivityCompare.tsx | 17 +---- .../Tours/activity/compareValueText.ts | 18 ++++++ .../components/Tours/bike/BikeWaysCard.tsx | 20 +++--- .../Tours/bike/RouteWaySections.tsx | 3 +- client/src/components/Tours/bike/routeWays.ts | 14 +++++ .../CollectionTourTakeOverDialog.tsx | 3 +- .../collection/CollectionToursSection.tsx | 18 ++++++ .../Tours/collection/collectionTours.test.tsx | 30 ++++++++- .../collection/useCollectionTourTakeOver.ts | 2 +- .../collection/useSaveTourToCollection.ts | 2 +- .../Tours/horse/HorseRouteDialog.tsx | 6 +- .../Tours/horse/HorseRoutesCard.tsx | 3 +- .../components/Tours/horse/horseSection.ts | 5 ++ .../Tours/library/TourLibraryDialog.tsx | 3 +- .../Tours/library/tourPreviewFacts.ts | 51 +++++++++++++++ .../Tours/library/tourPreviewParts.tsx | 50 +-------------- .../Tours/packing/TourPackingSection.tsx | 3 +- .../Tours/packing/packingLinkName.ts | 6 ++ .../Tours/packing/packingLinkParts.tsx | 6 +- .../Tours/planner/LegVariantsCard.test.tsx | 2 +- .../Tours/planner/TourPlannerPanels.tsx | 7 ++- .../Tours/planner/WinterActivityField.tsx | 2 +- .../Tours/planner/tourPlannerFacts.ts | 2 + .../Tours/planner/tourPlannerParts.test.ts | 7 ++- .../Tours/planner/useAppliedWayHint.test.ts | 8 ++- .../Tours/planner/useLegVariants.ts | 10 +-- .../Tours/planner/useTourPlanner.ts | 2 +- .../components/Tours/planner/useTourRoute.ts | 27 +++++--- .../provenance/TourProvenanceSection.tsx | 32 ++++++---- .../components/Tours/run/RunWaysCard.test.tsx | 3 +- .../src/components/Tours/run/RunWaysCard.tsx | 14 +---- .../Tours/ski/SkiClassificationFields.tsx | 2 +- .../src/components/Tours/ski/SkiTrackCard.tsx | 2 +- .../src/components/Tours/ski/skiDiscipline.ts | 49 +++++++++++++++ .../components/Tours/ski/skiMarks.test.tsx | 12 +--- client/src/components/Tours/ski/skiMarks.tsx | 56 +++-------------- .../components/Tours/stages/StageParts.tsx | 45 +++---------- .../Tours/stages/TourStageDayPills.tsx | 7 +-- .../Tours/stages/TourStageOverview.tsx | 56 ++++++++++++++--- .../Tours/stages/TourStagesSection.tsx | 21 ++----- .../components/Tours/stages/stageActions.ts | 38 +++++++++++ .../src/components/Tours/stages/stageNames.ts | 25 ++++++++ .../Tours/stages/stageOverview.test.tsx | 3 +- .../Tours/stages/stageViews.test.tsx | 5 +- .../Tours/stages/useTourStageRail.ts | 20 +++--- .../Tours/wanderer/WandererHintsDialog.tsx | 3 +- .../src/components/Tours/wanderer/hintWhen.ts | 7 +++ .../Tours/wanderer/sourceHintParts.test.tsx | 3 +- .../Tours/wanderer/sourceHintParts.tsx | 8 --- .../Tours/winter/winterActivityIcon.ts | 8 +++ .../components/Tours/winter/winterMarks.tsx | 8 +-- client/src/pages/CollectionsPage.tsx | 6 +- .../src/pages/collections/useCollections.ts | 10 +-- .../pages/tripPlanner/TourPlannerMapStage.tsx | 12 +++- .../src/pages/tripPlanner/useTourWorkspace.ts | 63 +++++++++++-------- .../pages/tripPlanner/useTripPlannerPage.ts | 57 ++++++++++++----- client/src/utils/collectionAccess.ts | 24 +++++-- 65 files changed, 633 insertions(+), 436 deletions(-) create mode 100644 client/src/components/Atlas/tourActivity/tourActivityReading.ts create mode 100644 client/src/components/Tours/activity/compareValueText.ts create mode 100644 client/src/components/Tours/library/tourPreviewFacts.ts create mode 100644 client/src/components/Tours/packing/packingLinkName.ts create mode 100644 client/src/components/Tours/ski/skiDiscipline.ts create mode 100644 client/src/components/Tours/stages/stageActions.ts create mode 100644 client/src/components/Tours/stages/stageNames.ts create mode 100644 client/src/components/Tours/wanderer/hintWhen.ts create mode 100644 client/src/components/Tours/winter/winterActivityIcon.ts diff --git a/client/src/components/Atlas/tourActivity/AtlasTourActivityPane.tsx b/client/src/components/Atlas/tourActivity/AtlasTourActivityPane.tsx index 8a7befaf5..64fb9769b 100644 --- a/client/src/components/Atlas/tourActivity/AtlasTourActivityPane.tsx +++ b/client/src/components/Atlas/tourActivity/AtlasTourActivityPane.tsx @@ -6,19 +6,10 @@ import type { DistanceUnit } from '../../../types'; import { fs } from '../../shared/DialogShell'; import { Tooltip } from '../../shared/Tooltip'; import { CardAction, InfoDot } from '../../Tours/tourParts'; +import { ActivityFilters, ActivityStatusLine, BasisBadges, UncountedBadges } from './tourActivityParts'; +import { distanceReading, heightReading, typeIcon, typeLabel, useDistanceUnit } from './tourActivityReading'; import { TourActivityStatsDialog } from './TourActivityStatsDialog'; import { splitMeasure } from './tourActivityStatsModel'; -import { - ActivityFilters, - ActivityStatusLine, - BasisBadges, - distanceReading, - heightReading, - typeIcon, - typeLabel, - UncountedBadges, - useDistanceUnit, -} from './tourActivityParts'; import { useTourActivityStats, type TourActivityStats } from './useTourActivityStats'; /** The wash the hero tile sits on, as the Atlas numbers do: the text colour, faintly, over the glass. */ @@ -181,9 +172,7 @@ function Strip({ stats, summary, onOpen }: StripProps) { {counted ? ( <> - {ascent && ( -
- )} + {ascent &&
} {descent && (
)} diff --git a/client/src/components/Atlas/tourActivity/TourActivityEntryRow.tsx b/client/src/components/Atlas/tourActivity/TourActivityEntryRow.tsx index f87a64509..a6ab8b26d 100644 --- a/client/src/components/Atlas/tourActivity/TourActivityEntryRow.tsx +++ b/client/src/components/Atlas/tourActivity/TourActivityEntryRow.tsx @@ -4,10 +4,11 @@ import { useNavigate } from 'react-router'; import { useTranslation } from '../../../i18n'; import { formatDate } from '../../../utils/formatters'; import { formatDistance, formatElevation } from '../../../utils/units'; +import { SoftPill, WhiteBadge } from '../../Planner/planParts'; import { fs } from '../../shared/DialogShell'; import { Tooltip } from '../../shared/Tooltip'; -import { SoftPill, WhiteBadge } from '../../Planner/planParts'; -import { EntryTile, MeasurePills, useDistanceUnit } from './tourActivityParts'; +import { EntryTile, MeasurePills } from './tourActivityParts'; +import { useDistanceUnit } from './tourActivityReading'; const ROW_BADGE_ICON = 'flex-none text-content-faint'; @@ -54,7 +55,7 @@ function EntryFacts({ entry }: { entry: TourActivityStatsEntry }) {