+ {choice.day && (
+
+
+ {t('tours.walk.day.label')}
+
+
+
+ )}
+ {note && (
+
+ {note}
+
+ )}
+ {schedule.state === 'ready' && schedule.anyHours && (
+
}>{t('tours.walk.hours.source')}
+ )}
+
+ );
+}
diff --git a/client/src/components/Tours/walk/WalkStations.test.tsx b/client/src/components/Tours/walk/WalkStations.test.tsx
index 5bd839631..9e34c1f03 100644
--- a/client/src/components/Tours/walk/WalkStations.test.tsx
+++ b/client/src/components/Tours/walk/WalkStations.test.tsx
@@ -1,13 +1,19 @@
-// CW-03, CW-04: a city walk's stops in its detail, checked off for the day it
-// was opened from, and its progress as a pill of the desktop day row.
+// CW-02, CW-03, CW-04: a city walk's stops in its detail, checked off for the
+// day it was opened from, their arrivals and opening hours on the day looked
+// at, and its progress as a pill of the desktop day row.
import type { TourDetailResponse, TourListItem, TourWaypoint } from '@trek/shared';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
+import { buildAssignment, buildDay, buildPlace } from '../../../../tests/helpers/factories';
import { fireEvent, render, screen, within } from '../../../../tests/helpers/render';
+import { resetAllStores, seedStore } from '../../../../tests/helpers/store';
import { tourRepo } from '../../../repo/tourRepo';
import { tourVisitRepo } from '../../../repo/tourVisitRepo';
+import { useSettingsStore } from '../../../store/settingsStore';
import { useTourVisitStore } from '../../../store/tourVisitStore';
+import { useTripStore } from '../../../store/tripStore';
+import type { Assignment, Day } from '../../../types';
import { ToastContainer } from '../../shared/Toast';
-import { WalkProgressPill, WalkStationsCard, type WalkDay } from './WalkStations';
+import { WalkProgressPill, WalkStationsCard } from './WalkStations';
const walk: TourListItem = {
place_id: 42,
@@ -44,16 +50,32 @@ const waypoints: TourWaypoint[] = [
{ lat: 48.002, lng: 11, role: 'end', sequence: 3, name: 'Cafe', stay_minutes: 15, opening_hours: 'Mo 10:00-18:00' },
];
-const day: WalkDay = {
- date: '2026-10-19',
- start: '09:00',
- route: [
- [48, 11],
- [48.001, 11],
- [48.002, 11],
- ],
- walkingMinutes: 20,
-};
+const ROUTE: Array<[number, number]> = [
+ [48, 11],
+ [48.001, 11],
+ [48.002, 11],
+];
+
+// 2026-10-19 is a Monday, 2026-10-20 a Tuesday.
+const MONDAY = buildDay({ id: 7, trip_id: 4, date: '2026-10-19' });
+const TUESDAY = buildDay({ id: 8, trip_id: 4, date: '2026-10-20' });
+const ON_DAY = { id: 9, day_id: 7 };
+
+/** The walk's entry on a day: its start that day, else the place's own time. */
+function entry(dayId: number, time: string | null, placeTime: string | null = null): Assignment {
+ return buildAssignment({
+ id: dayId + 2,
+ day_id: dayId,
+ place_id: 42,
+ assignment_time: time,
+ place: buildPlace({ id: 42, place_time: placeTime }),
+ });
+}
+
+/** The walk on Monday from 09:00, opened from that day. */
+function onMonday(time: string | null = '09:00', day: Day = MONDAY) {
+ return { assignment: ON_DAY, days: [day], assignments: { [String(day.id)]: [entry(day.id, time)] }, route: ROUTE };
+}
function detail(points: TourWaypoint[] = waypoints): Promise